StatsN — это современный высокопроизводительный клиент Stastd для ядра dotnet. 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.
Вы можете передать лямбда-выражение в класс 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. Вы можете изменить его размер, используя свойство BufferSize StastdOptions
. При этом используется параллельная очередь для постановки метрик в очередь и BackgroundWorker
для извлечения метрик из очереди и отправки их в агрегированном виде.
var opt = new StatsdOptions ( ) {
BufferMetrics = true ,
BufferSize = 512
} ;
По умолчанию различные функции регистрации метрик возвращают задачи. Вам не нужно ждать их. Если вы ожидаете их и у вас отключена буферизация метрик, вы вернетесь после того, как байты будут добавлены в сетевой поток. Если вы ожидаете и буферизованные метрики включены, то ваше ожидание вернется, когда ваша метрика будет добавлена в очередь метрик для отправки.
Хотя этот проект ориентирован на dotnet 4.0, модульные тесты не запускаются в версии 4.0. Поддержка ограничена (новые функции могут не появиться в dotnet 4.S), но ошибки будут устранены.
Если вы планируете поэкспериментировать с кодом, обязательно загрузите и установите .NET core sdk.