在.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。
文章来源微信公众号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2017-02-16 异常处理语句
2017-02-16 五种跳转的语句
2017-02-16 for循环循环时间