要从Nginx+Prometheus导出自定义业务维度监控报表,需四步:1.用OpenResty+lua-prometheus在Nginx中提取service_name等标签并上报带标签指标;2.配置Prometheus正确抓取/metrics端点并保留标签;3.用PromQL按service、endpoint等维度聚合查询;4.通过Grafana CSV导出、Prometheus API或Alertmanager webhook自动归档生成报表。

要从 Nginx + Prometheus 体系中导出自定义业务维度的监控报表,核心在于:让 Nginx 暴露带业务标签(如 service_name、api_path、user_type)的指标,Prometheus 抓取后,再通过 PromQL 聚合筛选,最后用 Grafana 可视化或 API 导出数据。
1. 在 Nginx 中注入业务维度标签
Nginx 原生不支持自定义标签,需借助 nginx-module-vts(推荐)或 nginx-lua-prometheus 实现。更灵活且常用的方式是用 OpenResty + lua-prometheus:
- 在
server或location块中用 Lua 提取请求中的业务信息,例如从 Header(X-Service-Name)、URL 参数(?app=pay)、或路径前缀(/api/v2/order/→order_service)提取维度 - 调用
metric:inc(1, label_values...)上报带标签的指标,例如:http_requests_total{service="payment", endpoint="/create", status="200", env="prod"} - 确保
prometheus_metric_cache_size足够大,避免高并发下 label 组合爆炸
2. 配置 Prometheus 正确抓取并保留标签
在 scrape_configs 中确认:
- target 地址指向 OpenResty 的
/metrics端点(如http://nginx:9145/metrics) - 禁用默认的
honor_labels: false(保持为默认即可),避免 Prometheus 覆盖你上报的 label - 若需统一添加环境/集群等静态维度,用
metric_relabel_configs添加__labels,例如:- action: labeladd<br> label: env<br> value: staging
3. 用 PromQL 构建带业务维度的聚合查询
导出报表前,先验证能按需切片。例如:
- 各服务每分钟请求数:
sum by (service, endpoint) (rate(http_requests_total{env="prod"}[1m])) - 支付服务错误率(4xx/5xx 占比):
sum by (service) (rate(http_requests_total{service="payment", status=~"4..|5.."}[1h])) / sum by (service) (rate(http_requests_total{service="payment"}[1h])) - 按用户等级(来自 Header
X-User-Level)统计响应延迟 P95:histogram_quantile(0.95, sum by (le, user_level) (rate(nginx_http_request_duration_seconds_bucket{job="nginx-openresty"}[1h])))
4. 导出报表的三种实用方式
Grafana 表格面板 + CSV 导出:创建 Table 面板,Query 使用上述 PromQL,开启 “Show in CSV” 选项,点击右上角「⋯」→ Export CSV。
Prometheus HTTP API 批量拉取:调用 /api/v1/query_range,指定 query、start、end、step,返回 JSON,用脚本转为 Excel/CSV。
Alertmanager + webhook 自动归档:配置一个低频 alert(如每天 00:00 触发),用 webhook 将 PromQL 结果 POST 到自建服务,生成日报并存入 S3 或数据库。


















