CAT.net 客户端 为 .net 应用提供接入 CAT 的 API

发布于 2021-07-25 12:26:53 字数 5598 浏览 1722 评论 0

CAT.net 客户端的 API 设计、客户端配置方式,与 CAT Java 客户端 基本一致。

编译工程

CAT.net 客户端要求 **.NET Framework 4.0 或更高版本**。

用 Visual Studio 2010 或更高版本,打开 Cat\Cat.sln。可以看到 Solution 中包括两个工程:

  1. Cat:CAT.net 客户端实现代码
  2. CatClientTest:示例程序和测试用例。

单击 Rebuild Solution 编译这两个工程:

Rebuild Solution

编译的输出是Cat.dll,如下图。在业务应用的工程中,通过引用这个dll,调用其中的API,来接入CAT。

Cat DLL

配置

1、创建以下目录,确保执行CAT客户端的帐户有权限读写它们:

  • d:\data\appdatas\cat\ (CAT客户端使用的临时数据目录)
  • d:\data\applogs\cat\ (CAT客户端的日志输出目录)

2、创建 d:\data\appdatas\cat\client.xml。在其中配置 Domain ID 和 CAT 服务器地址。推荐 client.xml 用 **UTF-8** 编码。client.xml 内容如下:

<?xml version="1.0" encoding="utf-8"?>
<config mode="client" enabled="true" queue-size="123">
	<!--logEnabled enabled="true"></logEnabled-->
	
	<!-- 配置Domain ID-->
	<domain id="1237" enabled="true" max-message-size="1000"/>
	
	<servers>
		<!-- 配置CAT服务器地址-->
		<server ip="10.2.6.98" port="2280" http-port="8080"></server>
	</servers>
</config>

执行工程自带的测试用例

设置 CatClientTest 工程为默认启动工程:

Set CatClientTest to be Startup Project

单击执行,就会运行CatClientTest中的Program.csMain()方法。

Run CatClientTest

程序输出:

CatClientTest output

在 CAT 中可以看到测试程序的CAT埋点,如下图。其中的CAT服务器地址、Domain ID 应该与 client.xml 中的配置一致。

CatClientTest Transactions

在其他应用中引用 Cat.dll 调用 CAT API

假设我们有一个console应用。

Create New Console Project

确保工程使用了 .NET Framework 4.0 或更高版本的服务端 Profile,而 **不是 Client Profile**。

Use Server Profile

添加对 Cat.dll 的引用

Add Reference

调用 CAT API 埋点。示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Org.Unidal.Cat.Message;
using Org.Unidal.Cat;
using System.Threading;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      ITransaction transaction = null; ;
      try
      {
        transaction = Cat.NewTransaction("Order", "Cash");

        // Do your business...

        Cat.LogEvent("City", "Shanghai");
        transaction.Status = CatConstants.SUCCESS;
      }
      catch (Exception ex)
      {
      	Cat.LogError(ex);
        transaction.SetStatus(ex);
        
        // You may need to re-throw exception ex out.
      }
      finally
      {
        transaction.Complete();

        // 程序退出前睡一会儿。使得CAT客户端有时间发出最后一批消息到网络。
        Thread.Sleep(1000);
      }
    }
  }
}

执行以上 Main() 方法。

在CAT中可以看到埋点效果:

Application Output

Application Output Logview

日志输出

在 client.xml 中,启用 <logEnabled enabled="true"></logEnabled>  XML元素,以开启日志输出。

日志输出位于 D:\data\applogs\cat 目录中:

Application Log File Path

为心跳报表获取 .NET 性能数据

Heartbeat Report
如上图,CAT.net客户端每分钟会自动抓取一次机器性能数据,展现在Heartbeat报表中,包括CPU利用率、GC次数、Heap各代大小、锁竞争次数、锁请求队列大小等。

这些性能指标中的一部分,是通过读取.NET Performance Counter实现的,(见DefaultPerformanceMetricProvider.cs中的Initialize(),如下图)。

Default Performance Metric Provider

然而,读取.NET Performance Counter,需要执行应用所使用的帐户是**Performance Log Users**用户组的成员(参考这里)。特别地,在IIS中以普通账户(IIS_USRS)执行的Web应用,是没有这个权限的。

所以,您可能需要提供自己的IPerformanceMetricProvider实现,它通过其他有权限读取的数据源(如Zabbix Agent,Salt Agent,或自己实现的一个有更高执行权限的Performance Counter输出程序)来获取这些性能指标。

在您的实现中,对于IPerformanceMetricProvider接口中的Get*()方法,它应当返回过去1分钟内的某个性能指标的累积值(如GC次数),或过去1分钟内的平均值(如CPU利用率)。 不推荐它返回从程序启动至今的累积值/平均值。请参考 DefaultPerformanceMetricProvider 是如何遵循这一语义的。

通过修改 StatusUpdateTask.cs,用您的 IPerformanceMetricProvider 实现,来替换掉 DefaultPerformanceMetricProvider 这个默认实现,如下图。

Instantiate IPerformance Metric Provider

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文