StatsN เป็นไคลเอนต์ Stastd ประสิทธิภาพสูงตัวแรกสำหรับ dotnet core 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
ในออบเจ็กต์ตัวเลือกให้เป็นจริง เมทริกจะถูกบัฟเฟอร์ ดังนั้นจึงส่งแพ็กเก็ตน้อยลง ขนาดบัฟเฟอร์มีค่าเริ่มต้นอยู่ที่ 512 ซึ่งจัดทำเป็นเอกสารโดย statsd คุณสามารถเปลี่ยนขนาดได้โดยใช้คุณสมบัติ BufferSize ของ StastdOptions
สิ่งนี้ใช้ Concurrent Queue เพื่อจัดคิวเมทริกและ BackgroundWorker
เพื่อแยกเมทริกออกจากคิวและส่งไปพร้อมกัน
var opt = new StatsdOptions ( ) {
BufferMetrics = true ,
BufferSize = 512
} ;
ตามค่าเริ่มต้น ฟังก์ชันเมตริกการบันทึกต่างๆ จะส่งคืนงาน คุณไม่จำเป็นต้องรอสิ่งเหล่านี้ หากคุณรอสิ่งเหล่านี้และคุณได้บัฟเฟอร์เมตริกปิดอยู่ คุณจะกลับมาหลังจากเพิ่มไบต์ในสตรีมเครือข่ายแล้ว หากคุณรอ และเปิดเมทริกที่บัฟเฟอร์ไว้ การรอคอยของคุณจะกลับมาเมื่อมีการเพิ่มเมทริกของคุณลงในคิวของเมทริกที่จะส่ง
แม้ว่าโปรเจ็กต์นี้จะกำหนดเป้าหมาย dotnet 4.0 แต่การทดสอบหน่วยจะไม่ทำงานใน 4.0 การสนับสนุนมีจำกัด (ฟีเจอร์ใหม่อาจไม่มีใน dotnet 4.S) แต่ข้อบกพร่องจะได้รับการแก้ไข
หากคุณวางแผนที่จะลองใช้โค้ด อย่าลืมดาวน์โหลดและติดตั้ง .NET core sdk