为.net应用提供接入CAT的API。该版本改变了客户端的配置方式,同时保留了原来文件的配置方式。
客户端输出文件和Mark file均放置在临时文件目录,确保有临时文件目录读取权限。 否则会导致无客户端日志以及重启之后Cat客户端messageId重复。
CAT.net客户端的API设计、客户端配置方式,与CAT Java客户端基本一致。
CAT.net客户端要求**.NET Framework 4.0或更高版本**。
用Visual Studio 2010或更高版本,打开Cat\Cat.sln。可以看到Solution中包括两个工程:
Cat
:CAT.net客户端实现代码CatClientTest
:示例程序和测试用例。
编译的输出是Cat.dll
,如下图。在业务应用的工程中,通过引用这个dll,调用其中的API,来接入CAT。
- Cat需要有权限写临时文件,主要存放客户端启动信息以及Mark file。
- 使用环境变量配置domain及cat server地址。分别为CAT_DOMAIN和CAT_SERVER。 CAT_DOMAIN=110110 CAT_SERVER=127.0.0.1:2281 (http端口地址)
- 保留了原来的文件配置方式,使用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工程为默认启动工程:
程序输出:
- 假设我们有一个console应用。
确保工程使用了.NET Framework 4.0或更高版本的服务端Profile,而**不是Client Profile**。
- 添加对
Cat.dll
的引用 - 调用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);
}
}
}
}
- 日志输出位于临时文件目录中: 格式为:cat-client-{domain}.log
如上图,CAT.net客户端每分钟会自动抓取一次机器性能数据,展现在Heartbeat报表中,包括CPU利用率、GC次数、Heap各代大小、锁竞争次数、锁请求队列大小等。
这些性能指标中的一部分,是通过读取.NET Performance Counter实现的。
(见DefaultPerformanceMetricProvider.cs
中的Initialize()
,如下图)。
然而,读取.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
这个默认实现,如下图。