StatsN es el primer cliente Stastd de rendimiento moderno para dotnet core. StatsN admite tanto TCP como UDP, aunque se recomienda UDP. En gran medida inspirado en el cliente statsd-csharp y el cliente statsd.net. En mi opinión, ambos proyectos son increíbles, pero no son exactamente lo que estaba buscando.
Escribí este cliente porque encontré que las pruebas unitarias estáticas no eran muy divertidas y estaba cansado de esperar a que se publicaran las funciones. O compatibilidad con funciones que statsd en realidad no admite.
Este cliente intenta ayudar a la capacidad de prueba mediante el uso de interfaces, la observabilidad al permitirle registrar funciones para escuchar excepciones y registros que ocurren dentro del cliente, y la escalabilidad al hacer que el código realmente funcione bien.
Install-Package StatsN
En resumen, la API es fácil. Puede obtener un nuevo IStatsd de diferentes maneras y luego puede registrar métricas con una implementación de IStatsd. A continuación se muestran algunos ejemplos.
Tenga en cuenta que querrá almacenar su IStatsd como un singleton (probablemente dentro de un contenedor DI). Este tipo persiste una conexión tcp o udp. Las funciones del cliente son seguras para subprocesos.
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 ) ;
Como la mayoría de los clientes de statsd, este cliente evita generar excepciones a toda costa . Cualquier error/excepción creado se registrará como mensaje Systems.Diagnostics.Trace.
Puede pasar lambda a la clase StatsdOptions
para que se le pasen excepciones y registre mensajes, en lugar de pasarlos a través del sistema Trace.
var opt = new StatsdOptions
{
OnExceptionGenerated = ( exception ) => { /* handle exception */ } ,
OnLogEventGenerated = ( log ) => { /* handle log msg */ }
} ;
var stats = Statsd . New ( opt ) ;
o
var stats = Statsd . New ( a => a . OnExceptionGenerated = ( exception ) => { /* handle exception */ } ) ;
Al establecer la propiedad BufferMetrics
en el objeto de opciones en verdadero, las métricas se almacenarán en el búfer y, por lo tanto, se enviarán menos paquetes. El tamaño del búfer por defecto es 512, lo cual está documentado por statsd. Puede cambiar su tamaño utilizando la propiedad BufferSize de StastdOptions
. Esto utiliza una cola simultánea para poner en cola las métricas y un BackgroundWorker
para eliminar las métricas de la cola y enviarlas agregadas.
var opt = new StatsdOptions ( ) {
BufferMetrics = true ,
BufferSize = 512
} ;
De forma predeterminada, las distintas funciones de métricas de registro devuelven Tareas. No necesita esperar en estos. Si espera en estos y ha desactivado las métricas en el búfer, regresará después de que los bytes se hayan agregado al flujo de red. Si espera y las métricas almacenadas en el búfer están activadas, su espera volverá cuando su métrica se haya agregado a la cola de métricas que se enviarán.
Si bien este proyecto tiene como objetivo dotnet 4.0, las pruebas unitarias no se ejecutan en 4.0. El soporte es limitado (es posible que no se incluyan nuevas funciones en dotnet 4.S), pero se solucionarán los errores.
Si planea jugar con el código, asegúrese de descargar e instalar .NET core SDK.