1. 程式人生 > 程式設計 >System.Diagnostics.Metrics .NET 6 全新指標API講解

System.Diagnostics.Metrics .NET 6 全新指標API講解

前言

工友們,.NET 6 Preview 7 已經在8月10號釋出了,除了眾多的功能更新和效能改進之外,在 preview 7 版本中,也新增了全新的指標API,System.Diagnostics.Metrics,為了讓應用能有更好的可觀測性,在之前的釋出的.NET 5中,也把 Activity 增強為 ActivitySource,主要原因還是 .NET 執行時團隊和 OpenTelemetry .NET SIG 進行了深度合作,並且一起制定了 OpenTelemetry .NET 指標計劃。

Metric support plans

Metrics APIs Design

目前 System.Diagnostics.Metrics 這個api還只能在 .NET preview 7 中使用,當然後邊也會像 System.Text.on庫一樣釋出到Nuget平臺,讓其他版本的 .NET 專案接入使用。

指標介紹

下邊介紹了幾個主要的類

  • Meter 用來建立和跟蹤指標Instrument
  • MeterListener 用來監聽指標Instrument的值的更新
  • Counter 計數器,一般記錄累加的值,比如程式中的錯誤數,請求數 都可以用計數器
  • Histogram 直方圖,記錄可統計的值,比如記錄下每一個介面的響應時間,然後再根據時間進行彙總
  • ObservableCounter 可觀察計數器,比如 CPU 時間等
  • ObservableGauge 可觀測儀表盤,你可以用來記錄應用的記憶體,GC 的記憶體等

Meter

Meter類用來建立各種指標Instrument,包括計數器,直方圖,儀表盤指標等等,Meter 類包含了 Name 和 Version 屬性,你可以設定meter的名稱和版本。

var meter = new Meter("meter","v1.0");

var requestCount = meter.CreateCounter<long>("RequestCount");

var responseTime = meter.CreateHistogram<long>("ResponseTime");

// ...

MeterListener

MeterListener 可以用來監聽指標元件的值變化,同樣相對應的也有 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 當使用Meter類建立指標Instrument時,這個回撥可以接收到建立的指標資訊。
  • MeasurementsCompleted 當停止指標的收集時,這個回撥可以接收到相應的指標資訊,通常是執行了 Meter 和 MeterListener 的Dispose() 方法

方法

  • EnableMeasurementEvents 開啟相應指標Instrument的監聽
  • DisableMeasurementEvents 關閉相應指標Instrument的監聽
  • SetMeasurementEventCallback 設定指標Instrument的測量值更新的回撥
  • RecordObservableInstruments 記錄所有監聽的可觀察指標(Observable instruments)的當前測量值。
  • Start 開啟監聽指標Instrument。

Counter 計數器

Counter是計數器指標,可以用來記錄累加的值,使用非常簡單,下邊的示例中,模擬記錄了程式的請求次數,首先呼叫 CreateCounter 函式建立一個計數器指標 requestCount,然後呼叫Add 方法,進行Counter的累加操作。

Meter meter = new Meter("meter","v1.0");

var requestCount = meter.CreateCounter<long>("RequestCountHeyDCEL");

for (int i = 0; i < 10; i++)
{
    requestCount.Add(1);
}

然後使用上面的 MeterListener 來監聽計數器指標,程式的輸出如下:

System.Diagnostics.Metrics&nbsp;.NET&nbsp;6&nbsp;全新指標API講解

在第一行,MeterListener 檢測到了上面建立的 RequestCount 計數器,並且開啟了指標的監聽,當我們呼叫 requestCount.Add(1) 後,MeterListener 捕獲到了指標測量值的更新,然後在控制檯輸出了相應的值,需要注意的是,MeasurementEventCallback 回撥方法只會捕獲指標每次更新的測量值,而不是彙總後的總數,所以這裡的輸出都是1。

Histogram 直方圖

Histogram 是直方圖指標,然後再根據時間進行彙總,和 Counter 差不多,不過指標的維度不一樣,而且 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);
}

用隨機數表示了介面的響應耗時,輸出如下:

System.Diagnostics.Metrics&nbsp;.NET&nbsp;6&nbsp;全新指標API講解

ObservableCounter 可觀察計數器

ObservableCounter 是可觀察的計數器,和 Counter 不一樣的是,建立 ObservableCounter 需要傳入一個Func委託,來返回一個測量值,當然也不需要手動呼叫 Add(),Record() 方法,只需要定時呼叫 MeterListener的RecordObservableInstruments 方法,獲取當前的指標測量值。

    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.Instrumentwww.cppcns.comPublished = (instrument,meterListener) =>
            {
                Console.WriteLine($"EnableMeasurementEvents {instrument.Name} ");
                meterListener.EnableMeasurementEvents(instrument);
            };

            listener.SetMeasurementEventCallback<long>((instrument,state) =>
            {
                Console.WriteLine($"Instrument: {instrument.Name} has recorded the measurement {measurement}");
            });

            listener.MeasurementsCompleted = (instrument,state) =&gwww.cppcns.comt;
            {
                listener.DisableMeasurementEvents(instrument);
            };

            listener.Start();

        }

        static void AutoRecord(MeterListener listener)
        {
            var cts = new CancellationTokenSource();

            _ = Task.Run(asy客棧nc () => {

                while (!cts.IsCancellationRequested)
                {
                    await Task.Delay(3000);

                    listener.RecordObservableInstruments();

                }

            });

        }

    }

ObservableGauge 儀表盤指標

這個比較好理解,GC 的記憶體等,同樣是可觀察指標,也需要傳入一個返回測量值的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();

程式的輸出如下:

System.Diagnostics.Metrics&nbsp;.NET&nbsp;6&nbsp;全新指標API講解

總結

本文主要介紹了.NET 6 指標API System.Diagnostics.Metrics,通過這些API,可以很方便的收集應用的指標資料,但是本文好像沒有提到資料的聚合彙總? 不要擔心,執行時團隊針對相應的指標API已經開發了一系列高效能的聚合API,預計在.NET 6 preview 8 中釋出更新!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。