Prometheus采集Node.js服务时仅抓取部分指标 非nodejs_前缀指标丢失
排查修复步骤
首先明确:能正常抓取nodejs_前缀的指标,说明服务网络连通性、/metrics接口路径、基础抓取认证配置全是正常的,问题要么出在Node.js服务侧的指标生成逻辑,要么出在Prometheus抓取时的指标过滤规则,按以下顺序排查即可:
第一步:先验证服务侧/metrics接口的原始输出
进入Node.js服务所在Pod,执行命令curl localhost:<你的服务监听端口>/metrics,直接看接口返回的原始指标内容,分两种情况处理:
- 如果返回内容里根本没有
http_request_duration_seconds相关的bucket、sum、count系列指标,问题出在express-prom-bundle的配置上,逐一核对以下项:- 检查中间件挂载顺序:必须把
app.use(promBundle(配置项))写在所有业务路由、其他业务中间件的最前面,要是挂在路由后面,请求不会被中间件捕获,甚至会导致HTTP相关指标根本没完成注册。 - 检查初始化配置:不要设置
metricsPrefix: 'nodejs_',否则所有HTTP类指标会被自动加上nodejs前缀,变成nodejs_http_request_duration_seconds,查不带前缀的指标自然找不到;不要把httpDurationMetricName改成其他自定义名称;确认没有配置全路径匹配的excludeRoutes规则把所有请求都排除统计。 - 如果你自定义了prom-client的Registry实例,初始化express-prom-bundle的时候必须通过
reg参数传入你自定义的注册表,否则HTTP指标会被注册到默认注册表,你对外暴露的/metrics接口如果只返回自定义注册表的内容,就不会包含这些HTTP指标。
- 检查中间件挂载顺序:必须把
- 如果返回内容里能正常看到完整的
http_request_duration_seconds系列指标,问题出在Prometheus侧的抓取过滤配置。
第二步:检查Prometheus侧的指标过滤规则
根据你的Prometheus部署模式对应检查:
- 如果你是手动维护Prometheus的prometheus.yaml配置,找到对应Node.js服务的
scrape_configs抓取任务,检查metric_relabel_configs配置段:
最常见的错误是加了只保留nodejs前缀指标的keep规则,类似:
这个规则会直接丢弃所有不带nodejs_前缀的指标,要么删掉这条规则,要么调整正则放行你需要的HTTP指标,比如改成metric_relabel_configs: - source_labels: [__name__] action: keep regex: 'nodejs_.*'regex: '^(nodejs_.*|http_.*)$'。 - 如果你是用Prometheus Operator模式部署,检查对应服务的ServiceMonitor/PodMonitor自定义资源,看
metricRelabelings字段下有没有和上面一样的前缀过滤规则,做相同调整即可。
第三步:验证指标入库与仪表盘配置
配置修改后等待1-2个抓取周期(默认1分钟),按以下步骤验证:
- 先到Prometheus自带的Graph页面,直接查询
http_request_duration_seconds_bucket,不要加任何额外标签过滤,确认能查到对应Node.js实例的时序数据。 - 如果Prometheus里能查到数据但仪表盘不显示,检查仪表盘的查询语句,大概率是硬编码了namespace、job、instance这类标签的匹配规则,和你实际服务的标签不匹配导致查不到结果。
内容的提问来源于stack exchange,提问作者malpa222
相关产品推荐
相关产品推荐

