摘要:Prometheus 是一个开源的系统监控和告警工具。它本质上是一个时序数据库,配合强大的查询语言 PromQL,可以让你对系统各项指标(如 CPU、内存、请求次数和延迟等)进行采集、存储和分析。
Prometheus 是一个开源的系统监控和告警工具。它本质上是一个时序数据库,配合强大的查询语言 PromQL,可以让你对系统各项指标(如 CPU、内存、请求次数和延迟等)进行采集、存储和分析。
在 C# 应用中,结合开源的 prometheus-net 库,可以非常方便地暴露 HTTP Metrics 接口,供 Prometheus 服务端定期拉取(scrape)数据,实现:
应用健康状况实时监控
定制化业务指标上报
自动化报警(搭配 Alertmanager)
可视化仪表盘(如 Grafana)
优点标准化:Prometheus 已成为云原生领域事实标准,生态丰富。
实时性强:采用 pull 模式,采集延迟较低。
易集成:prometheus-net 等库封装简洁,支持 ASP.NET Core。
可扩展性好:指标格式灵活,支持业务自定义。
可视化强大:结合 Grafana 可以实现多维度可视化。
缺点对高吞吐写入支持有限:单机 Prometheus 在极大规模下有性能瓶颈。
持久化有限:本地存储,超出保留周期数据自动丢弃,需配合远程存储。
采集模式为“推”不方便:必须被动暴露接口,不适合被“防火墙”保护的内网或批量短命任务。
告警配置偏重静态:规则多为 YAML 文件,需要额外运维。
单体或多服务 C# API/微服务,需监控接口 QPS、延迟和资源使用。
想统一纳管到 Prometheus 监控平台的.Net 服务。
有业务侧自定义 Metrics 上报/告警需求,如订单量、支付成功率等。
配合 Kubernetes、Docker 等容器平台时,轻松支持自动采集与监控。
不适用的场景主要是高吞吐写入统计和对“事件流”而不是“指标”的监控。
下面以 ASP.NET Core WebAPI 为例,集成 prometheus-net 并暴露指标接口:
1. 安装依赖包dotnetaddpackageprometheus-net.AspNetCore 2. 配置并使用中间件在文件中,继续完成对 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;这样,应用在运行后会自动启动一个/metricsHTTP 端点,Prometheus 服务端可定期抓取(scrape)。默认情况下,/metrics暴露了 HTTP 请求数、时延等基础指标。你可以按业务需要定义自定义指标(如上例的订单创建总数)。3. Prometheus 服务端配置示例scrape_configs:
-job_name: 'my-dotnet-app'
static_configs:
-targets: ['localhost:5000'] #替换为你的服务地址和端口4. 完善与扩展
你还可以根据需要定义 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。如果有更多监控需求和问题,欢迎留言交流。
参考资料:
来源:opendotnet