2

我在 nodejs 中使用prom-client来发布/metrics端点。我想监控随着时间的推移偶尔发生的不同数量的销售。

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

这是一个带有 a 的简单设置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。不过,除了 prometheus 的聚合功能之外,在内部保持滚动平均值似乎很尴尬。

4

1 回答 1

1

在不知道捕获这些数据的确切目的的情况下,很难判断量表、摘要或直方图是否最适合您的需求,但我会尽我所能的假设。但首先,让我们从简化 Prometheus 所做的事情开始,这可能有助于可视化我的发展方向。

Prometheus 是一个时间序列数据库。这意味着,每次您的数据被抓取时,它都会在给定的时间戳上保留您的指标快照及其记录值,因此在一个非常简化的版本中,您最终会得到类似<timestamp, your_metric{label="1"} value>.

假设您想要仅捕获销售期间支付的金额并且您的客户数量有限,Gauges 可以帮助您在任何给定时间查看支付金额,通过标签区分任何客户*(尽管,计数器也会做得很好)。

现在,您的问题是关于跟踪数据。绘制这应该不是问题。即使数据不是连续的,您也会在任何绘图仪中看到数据,例如 Grafana。但是,看到点 ( <timestamp, value of your metric for each label combination>) 或细线不会说明任何故事,使它们几乎毫无意义并且难以跟踪。为了使这些数据连续,您可以做的就是随着时间的推移进行聚合。随着时间的推移进行聚合,您无需在每个时间戳获取聚合值,而是您选择的时间窗口内获取聚合值。

让我们试着想象一下:

Prometheus 每 2 秒抓取一次数据。在 30 分钟内,您的仪表仅记录 4 次销售。两个不同的客户在 1 分钟有两个,两个不同的客户在 20 分钟有两个。如果按原样绘制,您将看到 4 个点。如果您对此进行汇总,例如按平均值计算,您将在第 1 分钟和第 20 分钟看到 2 个点,其中包含两次销售的平均值。

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

*我强调指标基数的重要性:添加到指标中的标签越多,prometheus 必须进行计算的条目就越多,因为对于每个标签组合,它都会创建一个时间序列

于 2021-11-16T15:34:54.427 回答