StatsN adalah klien Stastd pertama dengan kinerja modern untuk inti dotnet. StatsN mendukung TCP dan UDP, meskipun UDP disarankan. Sebagian besar terinspirasi oleh statsd-csharp-client dan klien statsd.net. Kedua proyek tersebut menurut saya luar biasa?, hanya saja tidak persis seperti yang saya cari.
Saya menulis klien ini, karena menurut saya pengujian unit statis kurang menyenangkan, dan lelah menunggu fitur dipublikasikan. Atau dukungan untuk fitur yang sebenarnya tidak didukung oleh statsd.
Klien ini mencoba membantu kemampuan pengujian dengan menggunakan antarmuka, kemampuan observasi dengan memungkinkan Anda mendaftarkan fungsi untuk mendengarkan pengecualian dan pencatatan yang terjadi di dalam klien, dan skalabilitas dengan benar-benar membuat kode bekerja dengan baik.
Install-Package StatsN
Singkatnya api itu mudah. Anda bisa mendapatkan IStatsd baru dengan beberapa cara berbeda, lalu Anda bisa mencatat metrik dengan implementasi IStatsd. Berikut beberapa contohnya.
Catatan, Anda ingin menyimpan IStatsd Anda sebagai singleton (kemungkinan besar di dalam wadah DI). Tipe ini mempertahankan koneksi tcp atau udp. Fungsi klien aman untuk thread.
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 ) ;
Seperti kebanyakan klien statsd, klien ini menghindari pemberian pengecualian dengan cara apa pun . Setiap kesalahan/pengecualian yang dibuat akan dicatat sebagai pesan Systems.Diagnostics.Trace.
Anda dapat meneruskan lambda ke kelas StatsdOptions
untuk meneruskan pengecualian dan mencatat pesan, alih-alih memasukkannya melalui sistem Trace.
var opt = new StatsdOptions
{
OnExceptionGenerated = ( exception ) => { /* handle exception */ } ,
OnLogEventGenerated = ( log ) => { /* handle log msg */ }
} ;
var stats = Statsd . New ( opt ) ;
atau
var stats = Statsd . New ( a => a . OnExceptionGenerated = ( exception ) => { /* handle exception */ } ) ;
Dengan menyetel properti BufferMetrics
di objek opsi ke true, metrik akan di-buffer sehingga mengirimkan lebih sedikit paket. Ukuran Buffer defaultnya adalah 512, yang didokumentasikan oleh statsd. Anda dapat mengubah ukurannya menggunakan properti BufferSize dari StastdOptions
. Ini menggunakan Antrean Serentak untuk Mengantrekan metrik dan BackgroundWorker
untuk menghapus metrik dari Antrean dan mengirimkannya bersama agregat.
var opt = new StatsdOptions ( ) {
BufferMetrics = true ,
BufferSize = 512
} ;
Secara default, berbagai fungsi metrik logging mengembalikan Tugas. Anda tidak perlu menunggu pada ini. Jika Anda menunggu pada ini dan metrik buffer Anda tidak aktif, Anda akan kembali setelah byte ditambahkan ke aliran jaringan. Jika Anda menunggu, dan metrik yang di-buffer aktif, maka menunggu Anda akan kembali ketika metrik Anda telah ditambahkan ke Antrean metrik yang akan dikirim.
Meskipun proyek ini menargetkan dotnet 4.0, pengujian unit tidak berjalan di 4.0. Dukungannya terbatas (fitur baru mungkin tidak hadir di dotnet 4.S), tetapi bug akan diatasi.
Jika Anda berencana bermain-main dengan kode ini, pastikan untuk mengunduh dan menginstal .NET core SDK.