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。
文章来源微信公众号