StatsN は、ドットネット コア用の最新のパフォーマンス第一の 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 メッセージとして記録されます。
Trace システム経由で例外やログ メッセージを取得する代わりに、ラムダをStatsdOptions
クラスに渡すことができます。
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 */ } ) ;
options オブジェクトのBufferMetrics
プロパティを true に設定すると、メトリックがバッファリングされるため、送信されるパケットが少なくなります。バッファ サイズのデフォルトは 512 であり、statsd で文書化されています。 StastdOptions
の BufferSize プロパティを使用してサイズを変更できます。これは、同時キューを使用してメトリクスをキューに入れ、 BackgroundWorker
使用してメトリクスをキューから取り出し、集約して送信します。
var opt = new StatsdOptions ( ) {
BufferMetrics = true ,
BufferSize = 512
} ;
デフォルトでは、さまざまなロギング メトリック関数はタスクを返します。これらで待機する必要はありません。これらで待機し、メトリックをオフにバッファリングした場合は、バイトがネットワーク ストリームに追加された後に戻ります。 await を実行し、バッファリングされたメトリクスがオンになっている場合、メトリクスが送信されるメトリクスのキューに追加されると、await が返されます。
このプロジェクトは dotnet 4.0 をターゲットとしていますが、単体テストは 4.0 では実行されません。サポートは限られています (新しい機能は dotnet 4.S に含まれない可能性があります) が、バグは解決される予定です。
コードを試してみる予定がある場合は、必ず .NET core SDK をダウンロードしてインストールしてください。