Ниже приведен 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 минут.