.NET 6 全新指标 System.Diagnostics.Metrics 介绍
前言
工友們, .NET 6 Preview 7 已經(jīng)在8月10號(hào)發(fā)布了, 除了眾多的功能更新和性能改進(jìn)之外, 在 preview 7 版本中, 也新增了全新的指標(biāo)API,?System.Diagnostics.Metrics, 為了讓應(yīng)用能有更好的可觀測性, 在之前的發(fā)布的.NET 5中, 也把 Activity 增強(qiáng)為 ActivitySource, 主要原因還是 .NET 運(yùn)行時(shí)團(tuán)隊(duì)和 OpenTelemetry .NET SIG 進(jìn)行了深度合作, 并且一起制定了 OpenTelemetry .NET 指標(biāo)計(jì)劃。
Metric support plans[1]
Metrics APIs Design[2]
目前 System.Diagnostics.Metrics 這個(gè)api還只能在 .NET preview 7 中使用, 當(dāng)然后邊也會(huì)像 System.Text.Json 庫一樣發(fā)布到Nuget平臺(tái), 讓其他版本的 .NET 項(xiàng)目接入使用。
指標(biāo)介紹
下邊介紹了幾個(gè)主要的類
?Meter 用來創(chuàng)建和跟蹤指標(biāo)Instrument?MeterListener 用來監(jiān)聽指標(biāo)Instrument的值的更新?Counter 計(jì)數(shù)器, 一般記錄累加的值, 比如程序中的錯(cuò)誤數(shù), 請(qǐng)求數(shù) 都可以用計(jì)數(shù)器?Histogram 直方圖, 記錄可統(tǒng)計(jì)的值, 比如記錄下每一個(gè)接口的響應(yīng)時(shí)間, 然后再根據(jù)時(shí)間進(jìn)行匯總?ObservableCounter 可觀察計(jì)數(shù)器, 一般記錄累加的值, 比如 CPU 時(shí)間等?ObservableGauge 可觀測儀表盤, 你可以用來記錄應(yīng)用的內(nèi)存, GC 的內(nèi)存等
Meter
Meter類用來創(chuàng)建各種指標(biāo)Instrument, 包括計(jì)數(shù)器,直方圖,儀表盤指標(biāo)等等, Meter 類包含了 Name 和 Version 屬性, 你可以設(shè)置meter的名稱和版本。
var meter = new Meter("meter","v1.0");var requestCount = meter.CreateCounter<long>("RequestCount");var responseTime = meter.CreateHistogram<long>("ResponseTime");// ...MeterListener
MeterListener 可以用來監(jiān)聽指標(biāo)組件的值變化, 同樣相對(duì)應(yīng)的也有 ActivityListener。
MeterListener listener = new MeterListener(); listener.InstrumentPublished = (instrument, meterListener) => {Console.WriteLine($"EnableMeasurementEvents {instrument.Name} ");meterListener.EnableMeasurementEvents(instrument); };listener.SetMeasurementEventCallback<long>((instrument, measurement, tags, state) => {Console.WriteLine($"Instrument: {instrument.Name} has recorded the measurement {measurement}"); });listener.MeasurementsCompleted = (instrument, state) => {listener.DisableMeasurementEvents(instrument); };listener.Start();?
屬性
InstrumentPublished 當(dāng)使用Meter類創(chuàng)建指標(biāo)Instrument時(shí), 這個(gè)回調(diào)可以接收到創(chuàng)建的指標(biāo)信息。
MeasurementsCompleted 當(dāng)停止指標(biāo)的收集時(shí),這個(gè)回調(diào)可以接收到相應(yīng)的指標(biāo)信息, 通常是執(zhí)行了 Meter 和 MeterListener 的Dispose() 方法
方法
EnableMeasurementEvents 開啟相應(yīng)指標(biāo)Instrument的監(jiān)聽
DisableMeasurementEvents 關(guān)閉相應(yīng)指標(biāo)Instrument的監(jiān)聽
SetMeasurementEventCallback 設(shè)置指標(biāo)Instrument的測量值更新的回調(diào)
RecordObservableInstruments 記錄所有監(jiān)聽的可觀察指標(biāo)(Observable instruments)的當(dāng)前測量值。
Start 開啟監(jiān)聽指標(biāo)Instrument。?
Counter 計(jì)數(shù)器
Counter是計(jì)數(shù)器指標(biāo),可以用來記錄累加的值,使用非常簡單,下邊的示例中,模擬記錄了程序的請(qǐng)求次數(shù),首先調(diào)用 CreateCounter 函數(shù)創(chuàng)建一個(gè)計(jì)數(shù)器指標(biāo) requestCount, 然后調(diào)用Add 方法, 進(jìn)行Counter的累加操作。
Meter meter = new Meter("meter","v1.0");var requestCount = meter.CreateCounter<long>("RequestCount");for (int i = 0; i < 10; i++) {requestCount.Add(1); }然后使用上面的 MeterListener 來監(jiān)聽計(jì)數(shù)器指標(biāo), 程序的輸出如下:
在第一行, MeterListener 檢測到了上面創(chuàng)建的 RequestCount 計(jì)數(shù)器, 并且開啟了指標(biāo)的監(jiān)聽, 當(dāng)我們調(diào)用 requestCount.Add(1) 后, MeterListener 捕獲到了指標(biāo)測量值的更新, 然后在控制臺(tái)輸出了相應(yīng)的值, 需要注意的是, MeasurementEventCallback 回調(diào)方法只會(huì)捕獲指標(biāo)每次更新的測量值, 而不是匯總后的總數(shù),所以這里的輸出都是1。
Histogram 直方圖
Histogram 是直方圖指標(biāo),記錄可統(tǒng)計(jì)的值, 比如記錄下每一個(gè)接口的響應(yīng)時(shí)間, 然后再根據(jù)時(shí)間進(jìn)行匯總, 和 Counter 差不多, 不過指標(biāo)的維度不一樣, 而且 Histogram 使用Record()方法記錄每次的值,而不是Add()方法。
Meter meter = new Meter("meter","v1.0");var responseTime = meter.CreateHistogram<long>("ResponseTime");for (int i = 0; i < 10; i++) {var cost = new Random().Next(100,1000);responseTime.Record(cost); }用隨機(jī)數(shù)表示了接口的響應(yīng)耗時(shí), 輸出如下:
ObservableCounter 可觀察計(jì)數(shù)器
ObservableCounter 是可觀察的計(jì)數(shù)器, 和 Counter 不一樣的是, 創(chuàng)建 ObservableCounter 需要傳入一個(gè)Func委托, 來返回一個(gè)測量值, 當(dāng)然也不需要手動(dòng)調(diào)用 Add(), Record() 方法, 只需要定時(shí)調(diào)用 MeterListener的RecordObservableInstruments 方法, 獲取當(dāng)前的指標(biāo)測量值。
class Program{static async Task Main(string[] args){MeterListener listener = new MeterListener();Start(listener);AutoRecord(listener);Meter meter = new Meter("meter","v1.0");_ = meter.CreateObservableCounter<long>("CPU_Counter",() => new Random().Next(100,1000));Console.ReadKey();}static void Start(MeterListener listener){listener.InstrumentPublished = (instrument, meterListener) =>{Console.WriteLine($"EnableMeasurementEvents {instrument.Name} ");meterListener.EnableMeasurementEvents(instrument);};listener.SetMeasurementEventCallback<long>((instrument, measurement, tags, state) =>{Console.WriteLine($"Instrument: {instrument.Name} has recorded the measurement {measurement}");});listener.MeasurementsCompleted = (instrument, state) =>{listener.DisableMeasurementEvents(instrument);};listener.Start();}static void AutoRecord(MeterListener listener){var cts = new CancellationTokenSource();_ = Task.Run(async () => {while (!cts.IsCancellationRequested){await Task.Delay(3000);listener.RecordObservableInstruments();}});}}ObservableGauge 儀表盤指標(biāo)
這個(gè)比較好理解, 你可以用來記錄應(yīng)用的內(nèi)存,GC 的內(nèi)存等, 同樣是可觀察指標(biāo), 也需要傳入一個(gè)返回測量值的func委托。
MeterListener listener = new MeterListener();Start(listener);AutoRecord(listener);Meter meter = new Meter("meter","v1.0");_ = meter.CreateObservableGauge<long>("GC_Memory_Gauge",() => GC.GetTotalMemory(false));Console.ReadKey();程序的輸出如下:
總結(jié)
本文主要介紹了.NET 6 指標(biāo)API System.Diagnostics.Metrics,通過這些API, 可以很方便的收集應(yīng)用的指標(biāo)數(shù)據(jù), 但是本文好像沒有提到數(shù)據(jù)的聚合匯總? 不要擔(dān)心, 運(yùn)行時(shí)團(tuán)隊(duì)針對(duì)相應(yīng)的指標(biāo)API已經(jīng)開發(fā)了一系列高性能的聚合API, 預(yù)計(jì)在.NET 6 preview 8 中發(fā)布更新!
References
[1]?Metric support plans:?https://github.com/open-telemetry/opentelemetry-dotnet/issues/1501
[2]?Metrics APIs Design:?https://github.com/dotnet/designs/blob/3ac77d55eb00999fb2b03b280f209d08d3cd6ce9/accepted/2021/System.Diagnostics/Metrics-Design.md
總結(jié)
以上是生活随笔為你收集整理的.NET 6 全新指标 System.Diagnostics.Metrics 介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于事件驱动架构构建微服务第5部分:容器
- 下一篇: asp.net ajax控件工具集 Au