获取自上次增加 Prometheus 计数器以来经过的时间

Posted

技术标签:

【中文标题】获取自上次增加 Prometheus 计数器以来经过的时间【英文标题】:get time that passed since the last increase of Prometheus counter 【发布时间】:2019-06-06 11:45:08 【问题描述】:

考虑一个 Prometheus 指标 foo_total,它计算事件 foo 的发生总数,即,只要不重新启动提供服务,该指标只会增加。

是否有任何方法可以获取自该指标上次增加以来的时间跨度(例如秒数)?我知道由于刮擦期,这个值肯定不是那么准确,但几分钟的准确度对我来说应该足够了。

背景:我想在 Grafana 中使用这种查询来了解是否定期使用某些服务以及是否在定义的宽限期内完成了某些工作。我对指标本身没有任何影响。

【问题讨论】:

【参考方案1】:

下面是 Singlestat 面板的 JSON,它将显示上次更新到 upjob="prometheus" 指标的时间。这不完全是您所要求的:这是最后一次,而不是此后的时间跨度;它仅可用作 Singlestat 面板(即,您无法获取该值并绘制它,因为它不是单个值);它只会显示仪表板时间范围内的更改。

基础查询是timestamp(changes(upjob="prometheus"[$__interval]) > 0) * 1000,因此该查询基本上会返回在最后$__interval 秒内发生任何变化的所有时间戳(由时间范围和Singlestat 面板的大小动态确定,以像素为单位)。然后 Singlestat 面板将显示最后一个值(如果有)。 (* 1000 之所以存在,是因为 Grafana 需要以毫秒为单位的时间戳。)


  "type": "singlestat",
  "title": "Last Change",
  "gridPos": 
    "x": 0,
    "y": 0,
    "w": 12,
    "h": 9
  ,
  "id": 8,
  "targets": [
    
      "expr": "timestamp(changes(upjob=\"prometheus\"[$__interval]) > 0) * 1000",
      "intervalFactor": 1,
      "format": "time_series",
      "refId": "A",
      "interval": "10s"
    
  ],
  "links": [],
  "maxDataPoints": 100,
  "interval": null,
  "cacheTimeout": null,
  "format": "dateTimeAsIso",
  "prefix": "",
  "postfix": "",
  "nullText": null,
  "valueMaps": [
    
      "value": "null",
      "op": "=",
      "text": "N/A"
    
  ],
  "mappingTypes": [
    
      "name": "value to text",
      "value": 1
    ,
    
      "name": "range to text",
      "value": 2
    
  ],
  "rangeMaps": [
    
      "from": "null",
      "to": "null",
      "text": "N/A"
    
  ],
  "mappingType": 1,
  "nullPointMode": "connected",
  "valueName": "current",
  "prefixFontSize": "50%",
  "valueFontSize": "80%",
  "postfixFontSize": "50%",
  "thresholds": "",
  "colorBackground": false,
  "colorValue": false,
  "colors": [
    "#299c46",
    "rgba(237, 129, 40, 0.89)",
    "#d44a3a"
  ],
  "sparkline": 
    "show": false,
    "full": false,
    "lineColor": "rgb(31, 120, 193)",
    "fillColor": "rgba(31, 118, 189, 0.18)"
  ,
  "gauge": 
    "show": false,
    "minValue": 0,
    "maxValue": 100,
    "thresholdMarkers": true,
    "thresholdLabels": false
  ,
  "tableColumn": ""

如果您希望这更可靠,您可以定义一个 Prometheus 记录规则,如果在过去几秒/分钟内发生任何变化,则其值等于当前时间戳(取决于 Prometheus 收集指标的频率) 或规则的先前值。例如。 (未测试):

groups:

- name: last-update
  rules:

  - record: last-update
    expr: |
      timestamp(changes(upjob="prometheus"[1m]) > 0)
        or
      last-update

upjob="prometheus" 替换为您的度量选择器,将1m 替换为至少与您的收集间隔一样长的间隔,理想情况下要更长一些,以涵盖任何收集间隔抖动或错过的刮擦)。

然后,您将在 Grafana 中使用类似 time() - last-update 的表达式来获取自上次更改以来的时间跨度。您可以在任何类型的面板中使用它,而不必依赖面板为您选择最后一个值。

编辑: Prometheus 2.7.0 版本中预期的新功能之一(如果按照 6 周的发布时间表,大约需要 2-3 周)是@987654321 @。这意味着您应该能够在没有记录规则帮助的情况下实施后一种“更可靠”的解决方案。

如果我理解正确,查询应该如下所示:

time() - max_over_time(timestamp(changes(upjob="prometheus"[5m]) > 0)[24h:1m])

但是,就像以前一样,这不是一个特别有效的查询,尤其是在处理大量系列时。您可能还想从中减去 5 分钟,并使用 clamp_min 将其限制为非负值,以调整 5 分钟范围。

【讨论】:

以上是关于获取自上次增加 Prometheus 计数器以来经过的时间的主要内容,如果未能解决你的问题,请参考以下文章

使用 prometheus 的自定义计数器在 /actuator/prometheus 上不可见

Prometheus 增加功能警报

查找上次更改时值是增加还是减少

如果自上次事件以来传感器读数没有更改,则如何在未发送传感器读数时计算窗口上的聚合?

Prometheus - 计算给定指标标签的指标增加

自上次更新以来构建失败