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.Json库一样发布到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>("RequestCount");

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

然后使用上面的 MeterListener 来监听计数器指标, 程序的输出如下:

在第一行, 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);
}

用随机数表示了接口的响应耗时, 输出如下:

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.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 仪表盘指标

这个比较好理解, 你可以用来记录应用的内存,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();

程序的输出如下:

总结

本文主要介绍了.NET 6 指标API System.Diagnostics.Metrics,通过这些API, 可以很方便的收集应用的指标数据, 但是本文好像没有提到数据的聚合汇总? 不要担心, 运行时团队针对相应的指标API已经开发了一系列高性能的聚合API, 预计在.NET 6 preview 8 中发布更新!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 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 进行了深度合作, 并且一起制定了 OpenTelemetr

  • Java中System.currentTimeMillis()计算方式与时间单位转换讲解

    一.时间的单位转换 1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s) 1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s) 1秒=1,000,000,000 纳秒(ns) 1纳秒=1/1,000,000,000秒(s) 1秒=1,000,000,000,000 皮秒(ps) 1皮秒=1/1,000,000,000,000秒(s) 1分钟=60秒 1小时=60分钟=3600秒 二.System.currentTimeMillis()计算方式 在开发过程中,通常很

  • Android指纹识别API讲解,一种更快更好的用户体验

    我发现了一个比较怪的现象.在iPhone上使用十分普遍的指纹认证功能,在Android手机上却鲜有APP使用,我简单观察了一下,发现Android手机上基本上只有支付宝.微信和极少APP支持指纹认证功能,就连银行和金融类的应用都基本不支持,甚至很多开发者都不知道Android系统是有指纹认证的官方API的. 事实上,Android从6.0系统开始就支持指纹认证功能了,但是指纹功能还需要有硬件支持才行,而Android手机的硬件都是由各厂商生产的,手机档次也参差不齐,因此不能像iPhone那样保证

  • .NET 6新增的20个API介绍

    DateOnly & TimeOnly .NET 6 引入了两种期待已久的类型 - DateOnly 和 TimeOnly, 它们分别代表DateTime的日期和时间部分. DateOnly dateOnly = new(2021, 9, 25); Console.WriteLine(dateOnly); TimeOnly timeOnly = new(19, 0, 0); Console.WriteLine(timeOnly); DateOnly dateOnlyFromDate = Date

  • c#不使用windows api函数打开我的电脑和获取电脑驱动器信息

    打开我的电脑System.Diagnostics.Process.Start("explorer.exe", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"); 第二个参数也可为完整路径, 通过查询注册表拿到的一些完整路径例子: 复制代码 代码如下: public string GetWindowsPath(string path)        {            RegistryKey folders;        

  • C#通过WIN32 API实现嵌入程序窗体

    本文实例讲述了C#通过WIN32 API实现嵌入程序窗体的方法,分享给大家供大家参考.具体如下: 这是一个不使用COM,而是通过WIN32 API实现的示例, 它把写字板程序嵌在了自己的一个面板中. 这么做可能没有实际意义, 因为两个程序之前没有进行有价值的交互, 这里仅仅是为了演示这么做到, 以下是详细注释过的主要源代码. 我们把它封装到一个类中: using System; using System.Collections.Generic; using System.Linq; using

  • c#调用api控制windows关机示例(可以重启/注销)

    方法一:调用windows自带的shutdown.exe (缺点:会出现倒计时窗口) System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 15"); shutdown参数含义:-r关闭并重启动此计算机:-f 强制运行的应用程序关闭而没有警告:-t 15 延时15shutdown.exe的详细用法: shutdown [-i | -l | -s | -r | -a] [-f] [-m //compute

  • 神经网络API、Kotlin支持,那些你必须知道的Android 8.1预览版和Android Studio 3.0新特性

    谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快. 过去的五个月里, Kotlin一直是我们反复谈论的重点.现在要告诉大家的是,Android Studio 3.0可以将Kotlin添加到您的项目中了.最新版本的Android Studio在支持Java 8语言功能上得到了改进,另外一个亮点是,有了用于Gradle 3.0.0的Android插件. 好,下面步入正文. 曾仅用 55 秒发布会的 Android 8.0 Oreo 在时隔两个月

  • C#中API调用的多种方法

    介绍 API( Application Programming Interface ),我想大家不会陌生,它是我们Windows编程的常客,虽然基于.Net平台的C#有了强大的类库,但是,我们还是不能否认API在Windows编程中的重要性.大多数的编程语言都支持API编程,而.Net平台中的MFC(Microsoft Foundation Class Library)构架本身就封装了大部分的API. 做为程序员,我们需要了解API从字面上了解便是编程接口,因此,做为开发者,需要了解的只是API

  • SpringBoot指标监控的实现

    目录 一.SpringBoot--Actuator 1.1 快速开始 1.2 简单介绍最常用的几个端点 1.3 开启或关闭某个端点 1.4 定制端点 1.5 SpringBoot--Admin Server 一.SpringBoot--Actuator 1.1 快速开始 未来每一个微服务在运算部署以后,我们都需要对其进行监控.追踪.审计和控制等等.Springboot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控.审计等功能. 那么,我们要怎么用呢? 首先,导

随机推荐