在.net8中使用OpenTelemetry来metric

OpenTelemetry可以说是可观测性里的中流砥柱,自然.net也能很好的与期交互。OpenTelemetry支持了很多语言,C#也在其中,下面的列子就是在一个api项目中,添加对OpenTelemetry的NuGet包的引用,来完成应用的metric的。

基本思路是,第一步:在程序中引入OpenTelemetry相关包,并配置;第二步,下载Prometheus,配置采集该程序的性能指标;第三中,下载Grafana,可视化展示采集到的指示。

具体使用Prometheus和Grafana我以前的公众号文章中有说到,也可以参照微软官方ASP.NET Core 指标 | Microsoft Learn来了解上体使用步骤。其中的Custom是自定义的指标,可以与业务的api中埋点来计数。

using APIMetricDemo;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using System.Diagnostics.Metrics;
using OpenTelemetry.Exporter;
using OpenTelemetry.Instrumentation.AspNetCore;
using OpenTelemetry.Instrumentation.Http;
using OpenTelemetry.AutoInstrumentation.Instrumentations;
using OpenTelemetry.Logs;
using OpenTelemetry.Trace;

var builder = WebApplication.CreateSlimBuilder(args);
builder.Services.AddOpenTelemetry().WithMetrics(builder =>
{
    builder.AddAspNetCoreInstrumentation();
    builder.AddPrometheusExporter();
    builder.AddHttpClientInstrumentation();
    builder.AddProcessInstrumentation();
    builder.AddRuntimeInstrumentation();
    builder.AddPrometheusHttpListener();
    builder.AddMeter("Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Server.Kestrel", "Custome");
    builder.AddView("http-server-request-duration", new ExplicitBucketHistogramConfiguration
    {
        Boundaries = new double[] { 0, 0.005, 0.01, 0.025, 0.05,
                       0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 }
    });
});
var app = builder.Build();
app.MapPrometheusScrapingEndpoint();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () =>
{
    DiagnosticsConfig.RequestCounter.Add(1,
        new("Path", "/todos"),
        new("Method", "get"));
    return sampleTodos;
});
todosApi.MapGet("/{id}", (int id) =>
    sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
        ? Results.Ok(todo)
        : Results.NotFound());
app.Run();
public static class DiagnosticsConfig
{
    public const string ServiceName = "Custome";
    public static Meter Meter = new(ServiceName);
    public static Counter<long> RequestCounter =
        Meter.CreateCounter<long>("getTodos_count");
}

这里需要补充的是,grafana提供的模版json有一定的问题,我作了修改,大家可参照这些模版的连接。

ASP.NET Core.json:

https://github.com/axzxs2001/Asp.NetCoreExperiment/blob/master/Asp.NetCoreExperiment/DOTNET8/APIMetricDemo/ASP.NET%20Core.json

图片

ASP.NET Core Endpoint.json:

https://github.com/axzxs2001/Asp.NetCoreExperiment/blob/master/Asp.NetCoreExperiment/DOTNET8/APIMetricDemo/ASP.NET%20Core%20Endpoint.json

图片

本例中Prometheus中还有很多其他的性能指标,可以通过自定义的Grafana图表来展示,如果你实现了,不防与大家共享你的模版json。

 引入地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值