前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET 使用 OpenTelemetry metrics 监控应用程序指标

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

作者头像
MJ.Zhou
发布2024-06-11 08:18:29
880
发布2024-06-11 08:18:29
举报
文章被收录于专栏:.NET开发那点事.NET开发那点事

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

首先安装相关的包

代码语言:javascript
复制
		<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 一样,我们需要在启动的时候添加必要的服务及配置。

代码语言:javascript
复制
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

代码语言:javascript
复制
./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 的类:

代码语言:javascript
复制
    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"。

修改服务配置代码

代码语言:javascript
复制
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 控制器

代码语言:javascript
复制
    [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 里进行查询与展示。然后又演示了自定义相关指标来满足业务数据指标的监控。从概念到代码还是非常非常简单清晰的。希望对各位正在打算建立监控体系的同学有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OpenTelemetry Metrics 概述
  • 监控 ASP.NET Core 与 Runtime 的指标
    • 使用 nuget 安装包
      • 配置服务
        • 安装 Prometheus
          • 在 Prometheus 中查看指标
          • 自定义指标
            • MyMeterService
              • 修改服务配置代码
                • 添加 Order 控制器
                  • 在 Prometheus 中查看自定义指标
                    • 更多的度量
                    • 总结
                    相关产品与服务
                    Prometheus 监控服务
                    Prometheus 监控服务(TencentCloud Managed Service for Prometheus,TMP)是基于开源 Prometheus 构建的高可用、全托管的服务,与腾讯云容器服务(TKE)高度集成,兼容开源生态丰富多样的应用组件,结合腾讯云可观测平台-告警管理和 Prometheus Alertmanager 能力,为您提供免搭建的高效运维能力,减少开发及运维成本。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档