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。