• 在.net core中如何使用OpenTelemetry来metric
  • 发布于 2个月前
  • 257 热度
    0 评论
  • 李明发
  • 19 粉丝 37 篇博客
  •   
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;
// 堆代码 duidaima.com
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。
用户评论