使用 OpenTelemetry 和 Prometheus 监控 C# (.NET) 应用程序

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

监控 C# (.NET) 应用程序:OpenTelemetry 和 Prometheus 完整指南



现代 .NET 应用程序需要持续监控性能、错误和状态。没有监控,您将面临失去对生产环境控制的风险。在本文中,我们将详细讲解如何使用 OpenTelemetry(遥测数据收集)和 Prometheus + Grafana(可视化和告警)组合来配置高效的 C# (.NET) 应用程序监控。



为什么选择 OpenTelemetry?

OpenTelemetry (OTel) 是用于收集指标、追踪(链路追踪)和日志的行业标准。对于 .NET,它提供了官方 SDK 以及对流行库(ASP.NET Core、gRPC、Entity Framework)的自动检测功能。



在 C# 项目中安装和配置 OpenTelemetry

将 NuGet 包添加到您的项目中:

dotnet add package OpenTelemetrydotnet add package OpenTelemetry.Extensions.Hostingdotnet add package OpenTelemetry.Instrumentation.AspNetCoredotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore


Program.cs 中的基本配置

配置指标收集并导出到 Prometheus:

using OpenTelemetry.Metrics;using OpenTelemetry.Resources;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenTelemetry() .ConfigureResource(resource => resource .AddService("MyApp", serviceVersion: "1.0.0")) .WithMetrics(metrics => metrics .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddMeter("Microsoft.AspNetCore.Hosting") .AddMeter("Microsoft.AspNetCore.Server.Kestrel") .AddPrometheusExporter());

var app = builder.Build();

// Prometheus 端点(默认为 /metrics)app.MapPrometheusScrapingEndpoint();

app.Run();


创建自定义指标

您可以添加自己的计数器、直方图和仪表:

using System.Diagnostics.Metrics;

public class OrderMetrics{ private readonly Counter<int> _ordersCreated; private readonly Histogram<double> _orderProcessingTime;

public OrderMetrics(IMeterFactory meterFactory) { var meter = meterFactory.Create("MyApp.Orders"); _ordersCreated = meter.CreateCounter<int>("orders.created", description: "已创建的订单数量"); _orderProcessingTime = meter.CreateHistogram<double>("orders.processing_time", unit: "ms"); }

public void RecordOrderCreated() => _ordersCreated.Add(1); public void RecordProcessingTime(double ms) => _orderProcessingTime.Record(ms);}


请求追踪(分布式链路追踪)

为了跟踪调用链,请添加追踪功能:

using OpenTelemetry.Trace;

builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddEntityFrameworkCoreInstrumentation() .AddConsoleExporter()); // 用于调试,生产环境请使用 Jaeger 或 Zipkin


通过 OpenTelemetry 进行日志记录

将日志记录器连接到 OTel:

using OpenTelemetry.Logs;

builder.Logging.AddOpenTelemetry(logging => logging .AddConsoleExporter() .AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317")));


配置 Prometheus 以收集指标

在 prometheus.yml 文件中指定您的端点:

scrape_configs:  - job_name: 'dotnet-app'    scrape_interval: 5s    static_configs:      - targets: ['localhost:5000']  # 您的应用程序端口


在 Grafana 中进行可视化

将 Prometheus 连接到 Grafana 后,创建一个包含关键指标的面板:

  • http_server_duration_ms — 服务器响应时间
  • http_server_request_count — 请求计数
  • orders_created_total — 自定义指标示例


结论

使用 OpenTelemetry 和 Prometheus 监控 C# (.NET) 应用程序可以让您全面了解生产环境。从基本的 HTTP 指标开始,然后添加自定义业务指标和分布式追踪。使用 Grafana 创建可视化面板,并设置告警以快速响应问题。

推荐