如何在nodejs中使用prometheus跟踪零星数据



我正在nodejs中使用prom客户端发布/metrics端点。我想监控随着时间的推移偶尔发生的不同金额的销售。

在普罗米修斯中跟踪偶发或不连续度量的最佳方法是什么?现有的度量类型似乎都不适合。

  • 用于跟踪单个值(Gauge(的基本普罗米修斯度量类型面向连续数据(如CPU速度或并发请求(
  • Histogram度量可以捕获不连续的数据,但需要手动百分位数,并且显然只需要估计分位数(https://prometheus.io/docs/practices/histograms/#errors-分位数估计(。此外,当度量服务器重新启动时,计数也会被清除
  • Summary度量可以捕获不连续的数据,但"通常不可聚合"(https://latencytipoftheday.blogspot.com/2014/06/latencytipoftheday-you-cant-average.html)

这里有一个简单的Gauge设置,它显然不能捕获

import express from 'express'
import promClient, { Gauge } from 'prom-client'
export const someMetric = new Gauge({
name: 'some_metric',
help: 'Track some metric; type = [a, b, c]',
labelNames: ['one', 'two'],
})
const metricServer = express()
metricServer.get('/metrics', async (req, res) => {
console.log('Metrics scraped')
res
.set('content-type', 'text/plain')
.send(await promClient.register.metrics())
})
// intermittent callback that reports sales
service.onSale(value => {
// this will simply overwrite the previous sale :(
someMetric.labels('a', 'all').set(value)
})
metricServer.listen(9991, () =>
console.log(`🚨 Prometheus listening on http://localhost:9991/metrics`)
)

我目前的计划是创建一个新的数据库,在内部跟踪24小时的平均销售额,然后将其作为一个单一的连续指标公布给prometheus。不过,除了普罗米修斯的聚合能力之外,在内部保持滚动平均值似乎很尴尬。

在不知道捕获这些数据的确切目的的情况下,很难判断Gauge、Summary或Histogram是否最适合您的需求,但我会尽我所能进行假设。但首先,让我们从简化普罗米修斯的所作所为开始,这可能有助于想象我的去向。

普罗米修斯是一个时间序列数据库。这意味着,每次你的数据被抓取时,它都会在给定的时间戳中保存一个你的指标及其记录值的快照,所以在一个非常简化的版本中,你最终会得到类似<timestamp, your_metric{label="1"} value>的东西。

假设你想要的只是记录销售过程中支付的金额,而你的客户数量有限,Gauges可以帮助你在任何特定时间查看支付金额,通过标签区分任何客户*(不过,柜台也可以(。

现在,你的问题是关于跟踪数据。策划这件事不应该是个问题。即使数据不是连续的,您也可以在任何绘图仪中看到数据,例如Grafana。然而,看到点(<timestamp, value of your metric for each label combination>(或细线并不能说明任何故事,使它们几乎毫无意义,也很难追踪。要使这些数据连续,您可以做的是随着时间的推移进行聚合。随着时间的推移进行聚合,使您可以在所选时间窗口内获得聚合值,而不是在每个时间戳处获得聚合值。

让我们尝试将其可视化:

普罗米修斯每2秒抓取一次数据。在30分钟内,您的仪表只记录了4次销售。两个不同的客户在第1分钟发了两个,两个不同客户在第20分钟发了一个。如果你按原样绘制,你会看到4个点。如果你将其相加,例如平均值,你会在第1分钟和第20分钟看到2个点,包含两次销售的平均值。

如果你有兴趣看到一个连续的故事,例如,在给定的时间段内,你需要随着时间的推移进行汇总。关键的区别是:在任何绘制的点上,您都会看到该时间戳和所选时间窗口之间的聚合值。因此,如果您在上面的示例中使用avg_over_time而不是avg,并且您选择30分钟的时间窗口,则从0到1分钟,从1分钟到20分钟,您将看到在1分钟、从20分钟到31分钟(从1分钟开始的两次销售后30分钟(发生的两次销售的平均值,您将查看所有4次销售的平均值。然后,从第31分钟到第50分钟,您将看到最近2次销售的平均值,然后从第50分钟再次为0。如果你选择一个更大的时间窗口,比如24小时,你会得到同样的效果。请记住,这个数字越大,Prometheus DB的计算密集度就越高。有很多标签*,每个标签的值都有很高的方差,这会使这样的时间窗口变得非常缓慢。查询如下:

*我强调了度量基数的重要性:度量中添加的标签越多,普罗米修斯进行计算所需的条目就越多,因为对于每个标签组合,它都会创建一个时间序列。

最新更新