.NET 利用 OpenTelemetry metrics 监控应用程序指标

打印 上一主题 下一主题

主题 899|帖子 899|积分 2697

上一次我们讲了 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 安装包

首先安装相关的包
  1.                 <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.8.1" />
  2.                 <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.8.1" />
  3.                 <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.8.1" />
  4.                 <PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.8.1" />
复制代码
设置服务

跟 logs,traces 一样,我们必要在启动的时候添加须要的服务及设置。
  1. builder.Services.AddControllers();
  2. var otel = builder.Services.AddOpenTelemetry();
  3. // Configure OpenTelemetry Resources with the application name
  4. otel.ConfigureResource(resource => resource
  5.     .AddService(builder.Environment.ApplicationName));
  6. otel.WithMetrics(metrics =>
  7. {
  8.     metrics.AddAspNetCoreInstrumentation()
  9.     .AddRuntimeInstrumentation()
  10.     .AddOtlpExporter((otlpOptions, metricReaderOptions) =>
  11.     {
  12.         otlpOptions.Protocol = OtlpExportProtocol.HttpProtobuf;
  13.         otlpOptions.Endpoint = new Uri("http://localhost:9090/api/v1/otlp/v1/metrics");
  14.         metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 1000;
  15.     });
  16. });
复制代码
安装 Prometheus

从官网下载 Prometheus 的安装包或者 k8s 运行。启动的时候记得开启参数:otlp-write-receiver
  1. ./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 的类:
  1.     public class MyMeterService
  2.     {
  3.         public static Meter MyMeter = new("MyMeter", "1.0");
  4.         public static Counter<long> MyOrderCounter = MyMeter.CreateCounter<long>("MyOrderCounter");
  5.     }
复制代码
首先创建了一个名为 MyMeter 的度量器。然后创建了一个名为 MyOrderCounter 的长整型计数器(Counter),并将其绑定到 MyMeter 上,名称为 "MyOrderCounter"。
修改服务设置代码
  1. otel.WithMetrics(metrics =>
  2. {
  3.     metrics.AddAspNetCoreInstrumentation()
  4.     .AddRuntimeInstrumentation()
  5.     .AddMeter("MyMeter")
  6.     .AddOtlpExporter((otlpOptions, metricReaderOptions) =>
  7.     {
  8.         otlpOptions.Protocol = OtlpExportProtocol.HttpProtobuf;
  9.         otlpOptions.Endpoint = new Uri("http://localhost:9090/api/v1/otlp/v1/metrics");
  10.         metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 1000;
  11.     });
  12. });
复制代码
通过调用 AddMeter("MyMeter") 方法 OpenTelemetry 会监听前面定义的 MyMeter 度量器。
添加 Order 控制器
  1.     [ApiController]
  2.     [Route("[controller]")]
  3.     public class OrderController : ControllerBase
  4.     {
  5.         [HttpPost]
  6.         public string Add()
  7.         {
  8.             MyMeterService.MyOrderCounter.Add(1);
  9.             return "ok";
  10.         }
  11.     }
复制代码
添加一个 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 里举行查询与展示。然后又演示了自定义相关指标来满足业务数据指标的监控。从概念到代码还黑白常非常简单清晰的。希望对各位正在打算建立监控体系的同学有所帮助。
关注我的公众号一起玩转技术



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表