.NET 6 全新指标 System.Diagnostics.Metrics 介绍

前言
工友们, .NET 6 Preview 7 已经在8月10号发布了, 除了众多的功能更新和性能改进之外, 在 preview 7 版本中, 也新增了全新的指标API, System.Diagnostics.Metrics, 为了让应用能有更好的可观测性, 在之前的发布的.NET 5中, 也把 Activity 增强为 ActivitySource, 主要原因还是 .NET 运行时团队和 OpenTelemetry .NET SIG 进行了深度合作, 并且一起制定了 OpenTelemetry .NET 指标计划。
目前 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 中发布更新!

.NET 6 全新指标 System.Diagnostics.Metrics 介绍的更多相关文章
- System.Diagnostics.Process.Star的用法
System.Diagnostics.Process.Start(); 能做什么呢?它主要有以下几个功能: 1.打开某个链接网址(弹窗). 2.定位打开某个文件目录. 3.打开系统特殊文件夹,如“控制 ...
- System.Diagnostics.Debug和System.Diagnostics.Trace 【转】
在 .net 类库中有一个 system.diagnostics 命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类——debug ...
- System.Diagnostics命名空间里的Debug类和Trace类的用途
在 .NET 类库中有一个 System.Diagnostics 命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类--Debug ...
- System.Diagnostics.Debug和System.Diagnostics.Trace
在 .net 类库中有一个 system.diagnostics 命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类——debug ...
- System.Diagnostics.Process.Start的妙用
我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑中某个指定的硬盘分区及文件夹, 甚至是"控制面板"相关的东西, 那么如何做呢? 答案 ...
- System.Diagnostics.Process 启动进程资源或调用外部的命令的使用
经常看到一些程序在保存为一个txt,或者excel的文件的时候,保存完毕立即打开, 启动程序或打开文件的代码 System.Diagnostics.Process.Start(System.IO.Pa ...
- System.Diagnostics.Trace.Listeners
System.Diagnostics.Trace.Listeners.Clear(); System.Diagnostics.Trace.AutoFlush = true; System.Diagno ...
- WPF中System.Diagnostics.Process.Start的妙用
我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑中某个指定的硬盘分区及文件夹, 甚至是"控制面板"相关的东西, 那么如何做呢? 答案 ...
- System.Diagnostics.Stopwatch
System.Diagnostics.Stopwatch 注意:此类在 .NET Framework 2.0 版中是新增的.MSDN Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量 ...
随机推荐
- 测试基础(三) Jmeter安装
前言 JMeter是Apache组织开发的基于Java的压力测试工具,用于对软件做压力测试. 进入Jmeter官网:https://jmeter.apache.org/,进行Jmeter压缩包的下载. ...
- Java基础00-数组9
1. 数组定义格式 1.1 数组概述 1.2 什么是数组 1.3 数组定义格式 推荐使用第一种格式,因为第一种格式读法比较顺畅. 2. 数组初始化之动态初始化 2.1 数组初始化概述 2.2 数组初始 ...
- python编程面试题
# 实现需求为 注册.登录.查看昵称的功能 # def userN(): # username = input("请输入账号: \n") # password = ...
- Requests方法 -- Http协议的短链接与长连接介绍
转载于简书: 作者:熊师傅链接:https://www.jianshu.com/p/3fc3646fad80 1.以前的误解 很久之前就听说过长连接的说法,而且还知道HTTP1.0协议不支持长连接,从 ...
- spring-1-spring介绍和IOC容器开发
一.介绍 1.版本 2.下载(jar包依赖) 下载 所以搜索:https://repo.spring.io/release/org/springframework/spring/ 文件分配 maven ...
- 国产计算框架Mindspore1.3.0 gpu源代码中的cmake文件存在问题(bug),openmpi的url错误,导致不能正常编译——成功解决mindspore-gpu-1.3.0版本不能从源代码中编译的问题
mindspore 的 r1.3 分支 在gpu方式编译下存在问题,无法编译,具体编译结果参考: https://www.cnblogs.com/devilmaycry812839668/p/1505 ...
- 如何掌握C#的核心技术
如何掌握C#的核心技术 感谢网友毛大神制作的图. 引子 前不久看到一个段子,某年宁波交警引进人脸识别技术抓拍行人闯红灯,结果一天下来被发现闯红灯次数最多的是珠海女子董小姐,日闯红灯3000多次.宁波交 ...
- 全站 HTTPS 就一定安全了吗?
随着网络技术手段不断地更新迭代,互联网安全对于企业和个人的重要性都越来越高.因此越来越多的服务商都开始偏向为用户提供更安全的在线内容访问. 中间人攻击 为了保障网站内容安全,诞生了不少加密方式.目前应 ...
- Vue框架主要内容学习总结
Vue框架体系主要内容: 1. vue核心语法和用法: 2. vue-router--路由.路由相当于访问路径,将访问路径与vue组件映射起来.传统方式常采用超链接实现路径或页面之间的切换, 而在vu ...
- airtest前期准备(pocoSDK+unity打apk包+安装pocoui库)
只介绍unity的环境准备,cocos的可以参考官方文档 https://poco-chinese.readthedocs.io/zh_CN/latest/source/doc/integrat ...