Prometheus 是一个开源的系统监控和告警工具。它本质上是一个时序数据库,配合强大的查询语言 PromQL,可以让你对系统各项指标(如 CPU、内存、请求次数和延迟等)进行采集、存储和分析。
在 C# 应用中,结合开源的 prometheus-net 库,可以非常方便地暴露 HTTP Metrics 接口,供 Prometheus 服务端定期拉取(scrape)数据,实现:
下面以 ASP.NET Core WebAPI 为例,集成 prometheus-net 并暴露指标接口:
dotnetaddpackageprometheus-net.AspNetCore 在 Program.cs 文件中,继续完成对 Prometheus 的集成与典型业务指标的埋点示例:
usingMicrosoft.AspNetCore.Builder;
usingMicrosoft.Extensions.DependencyInjection;
usingPrometheus;
varbuilder=WebApplication.CreateBuilder(args);
// 注册 Prometheus 服务
builder.Services.AddControllers();
varapp=builder.Build();
// 启用 Prometheus /metrics 暴露端点(默认路径为 /metrics)
app.UseMetricServer();
// 可选:采集请求级应用指标(如请求总数、处理时长等)
app.UseHttpMetrics();
// 示例业务 API
app.MapGet("/hello", () =>
{
return"Hello, Prometheus!";
});
// 业务自定义指标:计数器
// 定义为全局静态变量,避免 GC 回收
staticreadonlyCounterOrderCreatedCounter=Metrics.CreateCounter("order_created_total", "订单创建次数");
app.MapPost("/order", () =>
{
// ... 业务逻辑 ...
OrderCreatedCounter.Inc();
returnResults.Ok(new { Message="Order Created!" });
});
app.Run(); 这样,应用在运行后会自动启动一个 /metrics HTTP 端点,Prometheus 服务端可定期抓取(scrape)。默认情况下,/metrics 暴露了 HTTP 请求数、时延等基础指标。你可以按业务需要定义自定义指标(如上例的订单创建总数)。
Prometheus 服务器端添加 job 抓取此 .NET 服务:
scrape_configs:
-job_name: 'my-dotnet-app'
static_configs:
-targets: ['localhost:5000'] #替换为你的服务地址和端口 你还可以根据需要定义 Histogram、Gauge 等其他类型的业务指标:
// 记录处理时间
staticreadonlyHistogramProcessDuration=Metrics.CreateHistogram(
"order_process_duration_seconds",
"订单处理时长(秒)"
);
app.MapPost("/process", () =>
{
using (ProcessDuration.NewTimer())
{
// 假设这里是长时间的业务处理
System.Threading.Thread.Sleep(500);
returnResults.Ok(new { Message="Processed!" });
}
}); Prometheus 为 C# 应用提供了强大的监控能力,无论你是需要统计 HTTP 基础指标,还是希望上报业务自定义指标,都可以通过 prometheus-net 以最少的代码量实现。配合 Grafana,还能快速构建美观的数据可视化大屏,让监控不再是难事! 希望这篇文章能帮助你在 .NET 项目中顺利接入 Prometheus。如果有更多监控需求和问题,欢迎留言交流。
参考资料: