.NET 使用 OpenTelemetry metrics 监控应用程序指标
上一次我们讲了 OpenTelemetry Logs 与 OpenTelemetry Traces。今天继续来说说 OpenTelemetry Metrics。
随着现代应用程序的复杂性不断增加,对于性能监控和故障排除的需求也日益迫切。在 .NET 生态系统中,OpenTelemetry Metrics 可用于实时监控和分析应用程序的性能指标。比如监控内存,CPU 使用量,链接数等等。
OpenTelemetry Metrics 概述
OpenTelemetry Metrics 是 OpenTelemetry 的一部分,用于记录和导出应用程序的性能指标。它提供了一组灵活的 API 和工具,用于创建、注册和导出度量指标,以便实时监控和分析应用程序的性能。OpenTelemetry Metrics 支持各种类型的度量指标,包括计数器(Counter)、测量值(ObservableGauge)等,以满足不同场景下的性能监控需求。
监控 ASP.NET Core 与 Runtime 的指标
OpenTelemetry 已经为我们直接提供了一些开箱即用的包。我们使用这些包就可以非常便捷的对 ASP.NET Core 或者 Runtime 的一些指标进行监控。以下我们将演示通过简单的几步如何把这些指标通过 OpenTelemetry 协议发送给 Prometheus。
使用 nuget 安装包
首先安装相关的包
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.8.1" />
配置服务
跟 logs,traces 一样,我们需要在启动的时候添加必要的服务及配置。
builder.Services.AddControllers();
var otel = builder.Services.AddOpenTelemetry();
// Configure OpenTelemetry Resources with the application name
otel.ConfigureResource(resource => resource
.AddService(builder.Environment.ApplicationName));
otel.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddRuntimeInstrumentation()
.AddOtlpExporter((otlpOptions, metricReaderOptions) =>
{
otlpOptions.Protocol = OtlpExportProtocol.HttpProtobuf;
otlpOptions.Endpoint = new Uri("http://localhost:9090/api/v1/otlp/v1/metrics");
metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 1000;
});
});
安装 Prometheus
从官网下载 Prometheus 的安装包或者 k8s 运行。启动的时候记得开启参数:otlp-write-receiver
./prometheus --enable-feature=otlp-write-receiver
prometheus 默认的 metrics 的 api 地址为:http://localhost:9090/api/v1/otlp/v1/metrics
在 Prometheus 中查看指标
让我们运行上面的 .NET 程序,等待一会。然后打开 http://localhost:9090/graph 进行查看。我们能看到 Prometheus 中多了很多跟 ASP.NET Core 以及 .NET runtime 相关的指标。

有 kestrel 相关的,GC 相关的, Thread pool 相关的指标等等很多很多。
下面我们随便选一个 kestrel 的活动链接数看看:

可以直观的看到从0个连接到2个连接再到1个连接的过程。
自定义指标
以上演示了如何监控 ASP.NET Core 以及 .NET runtime 相关的指标。过程呢相当简单。但是光有这些框架的指标可能还不够,有的时候我们希望监控业务数据的指标,比如订单数量,实时用户在线量,等等。那么这个时候我们需要自己去实现一个指标。
下面我们就以订单总数这个数据定义一个自定义的指标。当用户每次下单成功后订单数量就会 +1。
MyMeterService
首先定义一个 MyMeterService 的类:
public class MyMeterService
{
public static Meter MyMeter = new("MyMeter", "1.0");
public static Counter<long> MyOrderCounter = MyMeter.CreateCounter<long>("MyOrderCounter");
}
首先创建了一个名为 MyMeter 的度量器。然后创建了一个名为 MyOrderCounter 的长整型计数器(Counter),并将其绑定到 MyMeter 上,名称为 "MyOrderCounter"。
修改服务配置代码
otel.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddRuntimeInstrumentation()
.AddMeter("MyMeter")
.AddOtlpExporter((otlpOptions, metricReaderOptions) =>
{
otlpOptions.Protocol = OtlpExportProtocol.HttpProtobuf;
otlpOptions.Endpoint = new Uri("http://localhost:9090/api/v1/otlp/v1/metrics");
metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 1000;
});
});
通过调用 AddMeter("MyMeter") 方法 OpenTelemetry 会监听前面定义的 MyMeter 度量器。
添加 Order 控制器
[ApiController]
[Route("[controller]")]
public class OrderController : ControllerBase
{
[HttpPost]
public string Add()
{
MyMeterService.MyOrderCounter.Add(1);
return "ok";
}
}
添加一个 Order 的控制器,每次调用 Add 方法的时候就会给 MyOrderCounter 加 1 。
在 Prometheus 中查看自定义指标
跟上面一样我运行我们的程序后等待一会,再次刷新 http://localhost:9090/graph。里面就会多出来 MyOrderCounter 指标。

使用 POSTMAN 调用几次 Order 接口后,点击 Execute 查询一下:

可以看到 MyOrderCounter 指标的折线图。
更多的度量
上面我们使用一个 Counter 来对订单数进行累加。其实 .NET 为我们提供了更多的度量方法。以下简单介绍几个常用的:
Counter
表示支持添加非负值的检测。 例如,可以在每次处理请求时调用 counter.Add(1) 以跟踪请求总数。 默认情况下,大多数指标查看器使用速率 (请求数/秒) 显示计数器,但也可以显示累积总计。ObservableCounter
表示一个指标可观测的检测,当观察检测时报告单调递增的值,例如,不同进程、线程、用户模式或内核模式的 CPU 时间。ObservableGauge
表示在观察仪器时报告非累加值的可观测仪器,例如当前室内温度。UpDownCounter
支持报告正或负指标值的工具。 UpDownCounter 可用于报告活动请求或队列大小更改等方案。ObservableUpDownCounter
一种指标可观测的仪器,在观察检测时报告值增加或减少。 例如,使用此仪器可以监视进程堆大小或无锁循环缓冲区中的项的近似数量。
总结
以上我们通过代码演示了如何通过 OpenTelemetry 把 Metrics 的数据发送到 Prometheus 里进行查询与展示。然后又演示了自定义相关指标来满足业务数据指标的监控。从概念到代码还是非常非常简单清晰的。希望对各位正在打算建立监控体系的同学有所帮助。
关注我的公众号一起玩转技术

.NET 使用 OpenTelemetry metrics 监控应用程序指标的更多相关文章
- Metrics.NET step by step使用Metrics监控应用程序的性能
使用Metrics监控应用程序的性能 在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或 ...
- 使用Metrics监控应用程序的性能
在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对 ...
- timeSeries db之:使用Metrics监控应用程序的性能 (zz)
在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对 ...
- Metrics监控应用
使用Metrics监控应用程序的性能 在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前 ...
- .NET Core使用App.Metrics监控消息队列(一):初探
一.简介 App Metrics是一个开放源代码和跨平台的.NET库,用于记录应用程序中的指标.App Metrics可以在.NET Core或也支持.NET 4.5.2的完整.NET框架上运行. A ...
- 使用App.Metrics监控消息队列
使用App.Metrics监控消息队列 一.简介 App Metrics是一个开放源代码和跨平台的.NET库,用于记录应用程序中的指标.App Metrics可以在.NET Core或也支持.NET ...
- 远程监控 – 应用程序运行状况测量 CSF 博客
在远程监控基础知识和故障排除中,我们探讨了 Windows Azure 平台提供的基础指标.信息源.工具和脚本,介绍了有关监控和应用程序运行状况的基本原则.我们演示了如何利用这些基本原则对在 Wind ...
- prometheus 监控ElasticSearch核心指标
ES监控方案 本文主要讲述使用 Prometheus监控ES,梳理核心监控指标并构建 Dashboard ,当集群有异常或者节点发生故障时,可以根据性能图表以高效率的方式进行问题诊断,再对核心指标筛选 ...
- 【原创】Ingress-Nginx-Controller的Metrics监控源码改造简析
一.背景 目前我们的生产环境一层Nginx已经容器化部署,但是监控并不完善,我们期望其具有Ingress-Nginx-Controller组件上报监控的数据.这样可以建立请求全链路的监控大盘.有利于监 ...
- Nagios监控ganglia的指标
这是nagios与ganglia整合的一部分内容 . 通常我们会把ganglia的监控发送给一个主机,我们可以在这个主机上执行nc localhost 8649 可以获取到所有发往这个主机的信息,以x ...
随机推荐
- OpenSergo 正式开源,多家厂商共建微服务治理规范和实现
简介 OpenSergo,Open 是开放的意思,Sergo 则是取了服务治理两个英文单词 Service Governance 的前部分字母 Ser 和 Go,合起来即是一个开放的服务治理项目. ...
- 云原生数据仓库TPC-H第一背后的Laser引擎大揭秘
简介: 作者| 魏闯先阿里云数据库资深技术专家 一.ADB PG 和Laser 计算引擎的介绍 (一)ADB PG 架构 ADB PG 是一款云原生数据仓库,在保证事务ACID 能力的前提下,主要解决 ...
- 【实践案例】Databricks 数据洞察在美的暖通与楼宇的应用实践
简介: 获取更详细的 Databricks 数据洞察相关信息,可至产品详情页查看:https://www.aliyun.com/product/bigdata/spark 作者 美的暖通与楼宇事业部 ...
- 基于 KubeVela 的 GitOps 交付
简介: KubeVela 是一个简单.易用.且高可扩展的云原生应用管理和交付平台,KubeVela 背后的 OAM 模型天然解决了应用构建过程中对复杂资源的组合.编排等管理问题,同时也将后期的运维策 ...
- WPF 触摸底层 PenImc 是如何工作的
在 WPF 里面有其他软件完全比不上的超快速的触摸,这个触摸是通过 PenImc 获取的.现在 WPF 开源了,本文就带大家来阅读触摸底层的代码,阅读本文需要一点 C# 和 C++ 基础 现在 WPF ...
- Prometheus+Grafana+alertmanager构建企业级监控系统(一)
一.环境准备 k8s集群角色 IP 主机名 配置 控制节点 192.168.199.131 master centos7.9 4核6G 工作节点 192.168.199.128 monitor cen ...
- 让 KEPServer 变成一款 Web 组态软件
KEPServerEX是行业领先的连接平台,用于向您的所有应用程序提供单一来源的工业自动化数据.该平台的设计使用户能够通过一个直观的用户界面来连接.管理.监视和控制不同的自动化设备和软件应用程序. ...
- arduino uno+LCD12864(ST7735S)+蓝牙模块实现贪吃蛇
1.前言: 1.1本实验实现的贪吃蛇能穿越边界,结束游戏的唯一条件是贪吃蛇到达指定长度 1.2本实验所用LCD可能不是LCD12864,LCD12864所用库为u8glib,笔者在词库中并没有找到型号 ...
- JAVA基础-流程控制、字符串
一.java基础 1.java主类结构 package com.study.again001; 包名public class helloword { 类名 static String s1 = &qu ...
- ansible(15)--ansible的mount模块
1. mount模块 功能:管理被控端设备挂载: 主要参数如下: 参数 说明 src 本地或远程设备的路径 path 设备挂载至本地的路径 fstype 挂载的文件系统类型,xfs.nfs... op ...