调用HTTP API获取数据时Prometheus Metrics异常被删问题排查
问题:调用Node.js接口后Prometheus指标被删除
环境与配置
Docker部署Prometheus启动命令
docker run -d --name prometheus -p 9090:9090 -v /tmp/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /tmp/prom-metrics-volume:/prometheus prom/prometheus --storage.tsdb.retention.time=1y --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus --web.console.libraries=/usr/share/prometheus/console_libraries --web.console.templates=/usr/share/prometheus/consoles
Prometheus配置文件(prometheus.yml)
global: scrape_interval: 10s external_labels: monitor: 'prometheus' scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090'] - job_name: 'report' scrape_interval: 5s static_configs: - targets: ['host.docker.internal:3000']
Node.js查询接口代码
const getPrometheusData = async function (clientId, logicNumber, ruleNumber) { let currDate = new Date(); let startDate = (currDate.getTime() - 172800000); // 2天的毫秒数 let endDate = currDate.getTime(); let step = "5s" let url = "http://localhost:9090/api/v1/query?query=lead_allocation_status_at_logic_and_rule_level" + "{client=\"" + clientId + "\", instance=\"host.docker.internal:3000\", job=\"report\", logic=\"Logic " + logicNumber + "\", rule=\"Rule " + ruleNumber + "\"}&start=" + startDate + "&end=" + endDate + "&step=" + step; return fetch(url) .then(response => response.json()) .then(data => { console.log(data.data.result); let tmpResponse = {}; for (let i=0;i<_.size(data.data.result);++i) { tmpResponse[data.data.result[i].metric.status] = parseInt(data.data.result[i].value[1]); } return {"status": 200, "data": tmpResponse}; }).catch(err => { return {"status": 500, "data": "Error: " + err}; }); }
问题现象
创建指标后数据可正常长期持久化,但调用上述Node.js接口,执行到return fetch(url)这一行后,Prometheus中的指标被删除。
排查思路
- 查看Prometheus容器日志:执行
docker logs prometheus,重点检查接口调用前后是否有数据删除、存储异常或配置重载相关的日志信息 - 修正查询接口参数:当前使用
/api/v1/query接口却传入了start/end/step参数,这些是/api/v1/query_range接口的专属参数,参数不匹配可能触发异常,先修改URL使用正确的接口,验证问题是否复现 - 检查存储目录权限:查看宿主机
/tmp/prom-metrics-volume的权限及文件所有者,确保Prometheus容器内的运行用户对该目录有读写权限,权限异常可能导致存储数据损坏或被误清理 - 验证指标是否真被删除:调用接口后,直接通过Prometheus UI手动查询
lead_allocation_status_at_logic_and_rule_level指标,确认是数据实际被删除,还是Node.js查询参数错误导致未返回结果 - 隔离测试查询请求:用
curl在终端直接发起和Node.js相同的查询请求(替换变量为实际值),看是否会触发指标删除,排除Node.js的fetch请求携带特殊头或参数的影响 - 测试简单查询:修改Node.js代码,查询一个基础指标(比如
up),验证是否还会出现指标删除问题,排查是特定查询参数还是接口调用本身导致的问题 - 检查自动清理或配置变动:确认是否有其他进程修改Prometheus配置文件导致重载,或是否有自定义的自动清理规则,这些操作可能影响指标存储
内容的提问来源于stack exchange,提问作者ace
相关产品推荐
相关产品推荐

