首页 > 编程语言 >.NET 使用 OpenTelemetry metrics 监控应用程序指标

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

时间:2024-06-10 21:44:33浏览次数:23  
标签:OpenTelemetry 指标 metrics 监控 MyOrderCounter 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 安装包

首先安装相关的包

		<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 相关的指标。
alt text
有 kestrel 相关的,GC 相关的, Thread pool 相关的指标等等很多很多。
下面我们随便选一个 kestrel 的活动链接数看看:
alt text
可以直观的看到从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 指标。
alt text

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

alt text

可以看到 MyOrderCounter 指标的折线图。

更多的度量

上面我们使用一个 Counter 来对订单数进行累加。其实 .NET 为我们提供了更多的度量方法。以下简单介绍几个常用的:

  • Counter
    表示支持添加非负值的检测。 例如,可以在每次处理请求时调用 counter.Add(1) 以跟踪请求总数。 默认情况下,大多数指标查看器使用速率 (请求数/秒) 显示计数器,但也可以显示累积总计。

  • ObservableCounter
    表示一个指标可观测的检测,当观察检测时报告单调递增的值,例如,不同进程、线程、用户模式或内核模式的 CPU 时间。

  • ObservableGauge
    表示在观察仪器时报告非累加值的可观测仪器,例如当前室内温度。

  • UpDownCounter
    支持报告正或负指标值的工具。 UpDownCounter 可用于报告活动请求或队列大小更改等方案。

  • ObservableUpDownCounter
    一种指标可观测的仪器,在观察检测时报告值增加或减少。 例如,使用此仪器可以监视进程堆大小或无锁循环缓冲区中的项的近似数量。

总结

以上我们通过代码演示了如何通过 OpenTelemetry 把 Metrics 的数据发送到 Prometheus 里进行查询与展示。然后又演示了自定义相关指标来满足业务数据指标的监控。从概念到代码还是非常非常简单清晰的。希望对各位正在打算建立监控体系的同学有所帮助。

关注我的公众号一起玩转技术

标签:OpenTelemetry,指标,metrics,监控,MyOrderCounter,NET
From: https://www.cnblogs.com/kklldog/p/18241085/opentelemetry-metrics

相关文章

  • OpenAI 推出适用于 .NET 的 OpenAI 库
    OpenAI推出适用于.NET的OpenAI库微软最近宣布推出面向.NET开发人员的官方OpenAI库,该库支持OpenAI的全套API和最新的GPT-4o旗舰模型。这个模型可以实时进行音频、视觉和文本推理。OpenAI.NETAPI库目前,微软已经发布了OpenAI.NETAPI库的第一个测试版,可以通过NuGet......
  • Aws EC2,kubeadm方式安装kubernetes(k8s)
    版本docker版本:20.10.25k8s版本(kubeadm,kubelet和kubectl):1.20.10-0初始化#禁用SELinuxsudosetenforce0sudosed-i's/^SELINUX=enforcing$/SELINUX=permissive/'/etc/selinux/config#关闭防火墙sudosystemctlstopfirewalldsudosystemctldisablefirewal......
  • NetLimiter使用教程,并掌握其基本的网络管理和流量控制能力;NetLimiter的各种高级功能和
    NetLimiter的初级使用教程大纲,可以帮助用户快速了解和上手这个网络管理工具:安装和配置下载和安装NetLimiter启动NetLimiter,进行基本配置界面介绍熟悉NetLimiter的用户界面主要功能区域的介绍和作用限制应用程序的网络访问如何设置应用程序的上传和下载限速如......
  • route_localnet decides whether a loopback-hosting server can server requests out
    BackgroundWhenIwasfollowingtheRAGexamplepromptflow-resource-hubtotracemyapplicationthroughapromtflowserverhostedontheloopbackinterface,asthelocalenvisavirtualmachineonAzure,andafterIaddNSGruletoallowtherequeststo......
  • 使用 .NET 集成 MinIO 实现高效对象存储
    引言https://min.io/在现代软件开发中,存储和管理大量的非结构化数据(如图片、视频和文档)变得越来越重要。对象存储解决方案如AmazonS3已成为主流,但其高昂的成本和对公有云的依赖使得很多开发者寻求开源和自托管的替代方案。MinIO作为一款高性能的开源对象存储系统,以其兼容......
  • .NET借助虚拟网卡实现一个简单异地组网
    由于工作需要,经常需要远程客户的服务器,但是并不是所有服务器都能开外网端口,使用向日葵等软件终究还是不太方便,于是找了很多工具,包括zerotier等,但是由于服务器在国外等有时候还不同,于是开始自己想办法研究一个属于自己的组网工具,最后找到snltty大佬的 https://github.com/snltt......
  • 避免 OOMKilled:在 Kubernetes 环境中优化 Java 进程的内存配置
    避免OOMKilled:在Kubernetes环境中优化Java进程的内存配置DevOps云学堂译 奇妙的Linux世界 2024-06-1009:53 重庆 听全文公众号关注 「奇妙的Linux世界」设为「星标」,每天带你玩转Linux! 管理KubernetesPod中运行的Java进程的内存使用情况比人们想象......
  • 腾讯冷启动论文阅读《Enhancing User Interest based on Stream Clustering and Memor
    背景用户冷启动一直是推荐系统中的一个难题,新用户(或非活跃用户)由于缺少行为数据,模型预估不准确。为了改善用户冷启动,腾讯提出了UserInterestEnhancement(UIE)模型(论文中提到也可以用于item的冷启动)。基本思想是先对用户聚类,然后用userembedding检索最相似的k个聚类中心来表示......
  • VisionPro学习笔记(7)——FitLineTool
    如果需要了解其他图像处理的文章,请移步小编的GitHub地址传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPracticeVisionPro有很多的示例和算子,这里再展示一个比较好用的算子FitLineTool。我自己的笔记不会按照顺序一一展示出来的,也许......
  • OpenAI 推出适用于 .NET 的 OpenAI 库
    微软宣布面向.NET开发人员官方OpenAI库。OpenAI库支持完整的OpenAIAPI和OpenAI的最新旗舰模型GPT-4o,该模型可以实时推理音频、视觉和文本。OpenAI.NETAPI库目前提供第一个测试版,可通过NuGet 访问。OpenAI.NETAPI库是微软与OpenAI合作的成果,它提供了从.N......