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 */ } ) ;
옵션 개체의 BufferMetrics
속성을 true로 설정하면 메트릭이 버퍼링되어 더 적은 패킷을 전송하게 됩니다. 버퍼 크기의 기본값은 512이며 이는 statsd에 설명되어 있습니다. StastdOptions
의 BufferSize 속성을 사용하여 크기를 변경할 수 있습니다. 이는 동시 대기열을 사용하여 메트릭을 대기열에 추가하고 BackgroundWorker
사용하여 대기열에서 메트릭을 제거하고 집계된 내용으로 보냅니다.
var opt = new StatsdOptions ( ) {
BufferMetrics = true ,
BufferSize = 512
} ;
기본적으로 다양한 로깅 지표 함수는 작업을 반환합니다. 이러한 항목을 기다릴 필요가 없습니다. 이러한 항목을 기다리고 버퍼링된 메트릭이 꺼진 경우 바이트가 네트워크 스트림에 추가된 후에 반환됩니다. 대기 중이고 버퍼링된 측정항목이 켜져 있는 경우 전송될 측정항목 대기열에 측정항목이 추가되면 대기가 반환됩니다.
이 프로젝트는 dotnet 4.0을 대상으로 하지만 단위 테스트는 4.0에서 실행되지 않습니다. 지원은 제한적이지만(새로운 기능은 dotnet 4.S에 제공되지 않을 수 있음) 버그는 해결될 것입니다.
코드를 가지고 놀 계획이라면 .NET Core SDK를 다운로드하여 설치하세요.