получить время, прошедшее с момента последнего увеличения счетчика Прометея - PullRequest
0 голосов
/ 11 января 2019

Рассмотрим метрику Прометея foo_total, которая подсчитывает общее количество событий foo, т. Е. Метрика будет увеличиваться только до тех пор, пока не будет перезапущена служба предоставления.

Есть ли способ получить временной интервал (например, количество секунд) с момента последнего увеличения этого показателя? Я знаю, что из-за периода очистки, значение наверняка не настолько точное, но точность в несколько минут должна быть достаточной для меня.

Справочная информация : я хочу использовать такой тип запросов в Grafana, чтобы иметь представление о том, регулярно ли используются некоторые службы и выполняются ли некоторые задания в течение определенного льготного периода. Я не имею никакого влияния на саму метрику.

1 Ответ

0 голосов
/ 14 января 2019

Ниже приведен JSON для панели Singlestat, которая будет отображать время последнего обновления метрики up{job="prometheus"}. Это не совсем то, что вы просили: это последний раз, а не промежуток времени с тех пор; это полезно только в качестве панели Singlestat (то есть вы не можете взять значение и отобразить его, так как это не одно значение); и он будет отображать только изменения, охватываемые временным диапазоном приборной панели.

Базовым запросом является timestamp(changes(up{job="prometheus"}[$__interval]) > 0) * 1000, поэтому запрос в основном возвращает все временные метки, в которых произошли какие-либо изменения в течение последних $__interval секунд (определяется динамически по временному диапазону и размеру панели Singlestat в пикселях). Панель Singlestat будет отображать последнее значение, если оно есть. (* 1000 есть, потому что Графана ожидает метки времени в миллисекундах.)

{
  "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 с интервалом, по крайней мере, равным интервалу сбора, а в идеале - немного дольше, чтобы покрыть любой джиттер интервала сбора или пропущенные фрагменты).

Тогда вы будете использовать выражение, подобное time() - last-update в Grafana, чтобы получить временной интервал с момента последнего изменения. И вы можете использовать его на любой панели, не полагаясь на то, что панель выберет для вас последнее значение.

Редактировать: Одна из новых функций, ожидаемых в выпуске Prometheus 2.7.0 (который должен выйти через 2-3 недели, если они будут придерживаться своего 6-недельного графика выпуска), - поддержка подзапросов . Это означает, что вы должны иметь возможность реализовать последнее, «более надежное» решение без помощи правила записи.

Если я правильно понимаю, запрос должен выглядеть примерно так:

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

Но, как и раньше, этот запрос не будет особенно эффективным, особенно для большого числа серий. Вы также можете отнять 5 минут и ограничить его, используя clamp_min, до неотрицательного значения, чтобы скорректировать диапазон до 5 минут.

...