0

0

C# Meter和MeterListener方法 C#如何使用System.Diagnostics.Metrics记录指标

星降

星降

发布时间:2026-02-06 09:15:41

|

864人浏览过

|

来源于php中文网

原创

Meter 是指标采集入口,负责创建管理 Counter、Histogram、Gauge;MeterListener 是需显式注册启用的监听者,用于订阅过滤导出指标。

c# meter和meterlistener方法 c#如何使用system.diagnostics.metrics记录指标

什么是 MeterMeterListener

Meter 是指标采集的入口,负责创建和管理计数器(Counter)、直方图(Histogram)、仪表(Gauge)等指标对象;MeterListener 则是监听者,用于订阅、过滤、采样或导出指标数据——它不自动收集,必须显式启用(meterListener.Register() )才能生效。

如何创建并使用 Counter 记录请求次数

最常用的是整数计数器,适合记录 HTTP 请求、消息处理等离散事件:

Meter meter = new Meter("myapp.http", "1.0");
Counter requestCounter = meter.CreateCounter("http.requests.total");

// 每次请求调用
requestCounter.Add(1, new KeyValuePair("method", "GET"));
requestCounter.Add(1, new KeyValuePair("method", "POST"));
  • 标签(KeyValuePair)必须是只读且不可变的;传入可变字典或匿名对象会抛 ArgumentException
  • 不要在热路径反复新建 Tag 实例,建议缓存复用 new[] { new KeyValuePair("method", "GET") }
  • Add() 是线程安全的,但避免在锁内调用——它内部有无锁优化

为什么 MeterListener 没有收到指标?

常见原因是没启用监听或过滤太严。默认情况下 MeterListener 不监听任何 Meter,必须显式注册并设置匹配逻辑:

Motiff
Motiff

Motiff是由猿辅导旗下的一款界面设计工具,定位为“AI时代设计工具”

下载
MeterListener listener = new MeterListener();
listener.InstrumentPublished = (instrument, meter) =>
{
    if (meter.Name == "myapp.http" && instrument.Name == "http.requests.total")
        listener.EnableMeasurementReporting(instrument);
};
listener.Start(); // 必须调用!
  • Start() 必须在 InstrumentPublished 回调中调用 EnableMeasurementReporting() 之后,否则指标被丢弃
  • 如果应用启动时 Meter 已创建(如 DI 容器提前构造),需在 listener.Start() 前调用 listener.RecordObservableInstrument() 或确保监听器注册早于指标初始化
  • SetMeasurementEventCallback() 只对 ObservableCounter/ObservableGauge 生效,普通 CounterMeasurementRecorded

直方图 Histogram 怎么记录延迟并避免性能抖动?

Histogram 适合记录响应时间等分布型指标,但要注意:它的 Record() 方法默认不采样,高频打点会显著影响性能:

Histogram latencyHist = meter.CreateHistogram("http.request.duration", unit: "ms");
latencyHist.Record(elapsedMs, new KeyValuePair("status_code", 200));
  • 若每秒调用超千次,建议搭配 MeterListener 在回调中做采样(如每 10 次取 1 次),而不是在业务代码里判断
  • 内置分位数计算(如 P95)由导出端(如 OpenTelemetry Collector)完成,Histogram 本身只存原始观测值 + 边界桶(bucket)
  • 不要用 double.NaNdouble.PositiveInfinity 调用 Record(),会触发静默丢弃(无异常,但不计入)

真正容易被忽略的是生命周期管理:Meter 无需释放,但 MeterListener 应在应用退出前调用 Stop(),否则可能持有对 Meter 的引用导致 GC 延迟;同时,多个 MeterListener 实例之间不共享状态,各自独立过滤和回调。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

585

2023.08.02

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

153

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

104

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

609

2023.08.10

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

441

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

428

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2635

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2284

2024.08.16

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

7

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 58.4万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号