如何用Prometheus与Node.js绘制每分钟HTTP请求数图表
每分钟HTTP请求数图表实现方案
关于方案一:手动重置Counter的可行性
不推荐这么做。Prometheus的采集间隔并非严格固定,若采集延迟或失败,重置Counter会直接丢失未采集的请求数据。此外,Counter的设计语义是单调递增,手动破坏这一规则会导致Prometheus内置的increase、rate等函数计算出异常值(比如负数增量),完全背离指标监控的初衷。
关于方案二:Increase函数返回浮点值的处理
increase(http_requests_total[1m])返回浮点值是正常现象,因为Prometheus是基于时间序列的采样点插值计算增量,并非精确统计每分钟的请求数。处理方式有三种:
- 可视化层取整:在Grafana等可视化工具中,将面板的数值格式设置为整数,直接四舍五入或截断小数,不影响趋势展示。
- 接受近似值:这个浮点值是真实请求增量的近似值,对于流量趋势分析来说足够准确,无需纠结是否为整数。
- 函数取整:使用
round(increase(http_requests_total[1m]))对结果四舍五入,得到整数形式的增量值。
更优实践:用Rate函数计算每分钟请求数
实际监控中更常用rate函数,它返回每秒请求数,乘以60即可得到每分钟请求数:
rate(http_requests_total[1m]) * 60
该结果同样可能是浮点值,处理方式和increase一致。rate函数更适合长期趋势分析,而increase更适合查看特定时间段的绝对增量。
Node.js端代码规范
无需手动重置Counter,保持其单调递增即可。示例代码如下:
const express = require('express'); const { Counter, register } = require('prom-client'); const app = express(); // 定义带标签的请求计数器 const httpRequestsCounter = new Counter({ name: 'http_requests_total', help: 'Total number of HTTP requests', labelNames: ['method', 'path'] }); // 中间件统计所有请求 app.use((req, res, next) => { httpRequestsCounter.inc({ method: req.method, path: req.path }); next(); }); // 暴露Prometheus指标端点 app.get('/metrics', async (req, res) => { res.set('Content-Type', register.contentType); res.send(await register.metrics()); }); app.listen(3000, () => console.log('Server running on port 3000'));
内容的提问来源于stack exchange,提问作者Shemm11
相关产品推荐
相关产品推荐

