StatsN 是用于 dotnet core 的现代性能优先的 Stastd 客户端。 StatsN 支持 TCP 和 UDP,但建议使用 UDP。很大程度上受到 statsd-csharp-client 和 statsd.net 客户端的启发。在我看来,这两个项目都很棒?,只是不完全是我想要的。
我编写了这个客户端,因为我发现单元测试静态不太有趣,并且厌倦了等待功能发布。或者支持 statsd 实际上不支持的功能。
该客户端尝试通过使用接口来提高可测试性,通过允许您注册函数来侦听客户端内部发生的异常和日志记录来提高可观察性,并通过真正使代码表现良好来提高可扩展性。
Install-Package StatsN
简而言之,api 很简单。您可以通过几种不同的方式获取新的 IStatsd,然后可以使用 IStatsd 实现记录指标。以下是一些示例。
注意,您需要将 IStatsd 存储为单例(最有可能在 DI 容器内)。此类型保持 tcp 或 udp 连接。客户端的函数是线程安全的。
IStatsd statsd = Statsd . New < Udp > ( a => a . HostOrIp = "10.22.2.1" , Port = 8125 , Prefix = "MyMicroserviceName" ) ;
IStatsd statsd = Statsd . New < Tcp > ( a => a . HostOrIp = "10.22.2.1" ) ; //use tcp
IStatsd statsd = Statsd . New < NullChannel > ( a => a . HostOrIp = "10.22.2.1" , Port = 8125 ) ; //pipes your metrics to nowhere...which can scale infinately btw
IStatsd statsd = Statsd . New ( a => a . HostOrIp = "10.22.2.1" ) ; //defaults to udp
IStatsd statsd = Statsd . New ( new StatsdOptions ( ) { HostOrIp = "127.0.0.1" } ) ; //defaults to udp
IStatsd statsd = new Stastd ( new StatsdOptions ( ) { HostOrIp = "127.0.0.1" } ) ; //defaults to udp
IStatsd statsd = new Stastd ( new StatsdOptions ( ) { HostOrIp = "127.0.0.1" } , new Tcp ( ) ) ; //pass a new udp client. You could in theory make your own transport if you inherit from BaseCommunicationProvider
statsd . CountAsync ( "myapp.counterstat" ) ; //default to 1 aka increment
statsd . CountAsync ( "myapp.counterstat" , 6 ) ;
statsd . CountAsync ( "myapp.counterstat" , - 6 ) ;
statsd . TimerAsync ( "myapp.timeMyFunction" , ( ) => {
//code to instrument
} ) ;
statsd . TimerAsync ( "myapp.timeData" , 400 ) ; //400ms
statsd . GaugeAsync ( "autotest.gaugeyo" , 422 ) ;
statsd . GaugeDeltaAsync ( "autotest.gaugeyo" , - 10 ) ;
statsd . SetAsync ( "autotest.setyo" , 888 ) ;
与大多数 statsd 客户端一样,该客户端不惜一切代价避免抛出异常。创建的任何错误/异常都将记录为 Systems.Diagnostics.Trace 消息。
您可以将 lambda 传递到StatsdOptions
类中以传递异常和日志消息,而不是通过 Trace 系统获取它们。
var opt = new StatsdOptions
{
OnExceptionGenerated = ( exception ) => { /* handle exception */ } ,
OnLogEventGenerated = ( log ) => { /* handle log msg */ }
} ;
var stats = Statsd . New ( opt ) ;
或者
var stats = Statsd . New ( a => a . OnExceptionGenerated = ( exception ) => { /* handle exception */ } ) ;
通过将选项对象中的BufferMetrics
属性设置为 true,指标将被缓冲,从而发送更少的数据包。缓冲区大小默认为 512,由 statsd 记录。您可以使用StastdOptions
的 BufferSize 属性更改其大小。它使用并发队列对指标进行排队,并使用BackgroundWorker
将指标从队列中剥离出来并将它们聚合在一起发送。
var opt = new StatsdOptions ( ) {
BufferMetrics = true ,
BufferSize = 512
} ;
默认情况下,各种日志记录指标函数返回任务。您不需要等待这些如果您等待这些并且您已缓冲指标 off ,则您将在字节添加到网络流后返回。如果您等待,并且缓冲指标已打开,那么当您的指标已添加到要发送的指标队列中时,您的等待将返回。
虽然该项目的目标是 dotnet 4.0,但单元测试不在 4.0 中运行。支持有限(dotnet 4.S 可能不会出现新功能),但错误将得到解决。
如果您打算尝试使用代码,请务必下载并安装 .NET core sdk。