.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 ...
随机推荐
- 【笔记】Oracle 窗口函数
Oracle 窗口函数 简单来说,窗口函数是分析函数的一种,通常可以理解成over()函数 构成:函数名①() over(partition by 分组的列名 order by 排序的列名 XXX) ...
- 力扣522(java)-最长特殊序列Ⅱ(中等)
题目: 给定字符串列表 strs ,返回 它们中 最长的特殊序列 .如果最长特殊序列不存在,返回 -1 . 最长特殊序列 定义如下:该序列为某字符串 独有的最长子序列(即不能是其他字符串的子序列). ...
- 支付宝移动端 Hybrid 解决方案探索与实践
支付宝 Hybrid 方案建设与演进 目前支付宝有 2 套 Hybrid 方案: HTML5 容器与小程序.小程序是最近几年才出来,H5 容器已经有了很长时间的历史,所以我们就先从 H5 容器说起. ...
- 基于MaxCompute分布式Python能力的大规模数据科学分析
简介: 如何利用云上分布式 Python 加速数据科学. 如果你熟悉 numpy.pandas 或者 sklearn 这样的数据科学技术栈,同时又受限于平台的计算性能无法处理,本文介绍的 MaxCo ...
- [FE] uViewUI u-navbar 曲线解决 uni onNavigationBarButtonTap 的限制与失效
uni 自带的 navigation bar 对于普通的导航需求是够用的,也允许 onNavigationBarButtonTap 加点击事件. 但是会出现异常Bug,表现为在内部页面一番操作后,再返 ...
- dotnet core 和 .NET 5 不支持 Prefer32Bit 首选 32 位的功能
我尝试在 dotnet core 和 dotnet 5 的应用上,右击项目属性,在生成界面勾选首选 32 位的功能,然而在 x64 下没有生成 PE32+ 的应用 这是 .NET Core 以及以上版 ...
- Django Admin后台管理:高效开发与实践
title: Django Admin后台管理:高效开发与实践 date: 2024/5/8 14:24:15 updated: 2024/5/8 14:24:15 categories: 后端开发 ...
- VMware之系统复制
目录 功能描述 复制centos7-1文件夹 载入复制的系统 设置配置 启动系统 修改网卡配置 刷新配置 测试上网 功能描述 复制已经安装好的centOs7.6 复制centos7-1文件夹 1.系统 ...
- 09. rails 创建user用户列表
gem添加分页的依赖 #列表分页 gem 'will_paginate', '~> 3.0.pre2' bundle 安装依赖 用户列表控制器 before_filter :auth_user, ...
- AIRIOT答疑第7期|如何快速提升物联网项目交付速度?
平台+模板,套上就能用!贼拉快! AIRIOT提供物联网低代码平台+多套行业案例模板,针对于有明确项目的服务商,用平台已经配置好的节点数.功能模块.流程,直接上手干项目! AIRIOT解答: 多套物联 ...