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

时间:2019-01-11 14:26:17

标签: prometheus

考虑一个普罗米修斯度量标准foo_total,该度量标准统计事件foo的发生总数,即,只要不重新启动提供服务,该度量标准就只会增加。

从该指标的最后一次增加以来,是否有任何方法可以获取时间跨度(例如秒数)?我知道由于刮板的时间,确定的值不是那么准确,但是对我来说只需几分钟就足够了。

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

1 个答案:

答案 0 :(得分:4)

以下是Singlestat面板的JSON,它将显示上一次更新up{job="prometheus"}指标的时间。这与您要求的不完全相同:这是最后一次而不是之后的时间;它仅在Singlestat面板中有用(即,由于它不是单个值,因此您无法获取该值并以图形方式对其进行绘制);并且只会显示仪表板时间范围内的更改。

基础查询为timestamp(changes(up{job="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(up{job=\"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(up{job="prometheus"}[1m]) > 0)
        or
      last-update

用指标选择器替换up{job="prometheus"},并以至少等于收集间隔的间隔替换1m,最好用更长的间隔替换,以覆盖任何收集间隔的抖动或遗漏的刮擦)。

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

编辑:Prometheus 2.7.0发行版(预计会在2-3周内发布,如果保持其6周的发布时间表,预计将在2-3周内推出)的新功能之一是{{ 3}}。这意味着您应该能够在没有记录规则的帮助下实现后一种“更可靠”的解决方案。

如果我理解正确,查询应该看起来像这样:

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

但是,就像以前一样,这并不是一个特别有效的查询,尤其是对于大量序列而言。您可能还希望从中减去5分钟,并使用clamp_min将其限制为非负值,以调整5分钟范围。