LINUX.ORG.RU
ФорумAdmin

Получить последнне значение состояния интерфейса

 


0

2

Здравствуйте!

Я запутался в настройках query optins / refresh timing и нуждаюсь в вашем совете.

Я хочу создать дашборд с панелями, используя плагин Flow для построения динамических диаграмм состояния сети. Telegraf опрашивает маршрутизаторы по SNMP каждые 10 секунд, чтобы получить статус интерфейса Up(1)/Down(2) и сохраняет результаты запроса в InfluxDBv2.

Grafana должна выполнить запрос и получить одну (последнюю) точку из серии. В зависимости от значения этой точки (1 или 2) плагин меняет цвет ссылки на диаграмме на зелёный (для 1) или красный (для 2).

В Influx я чётко вижу правильные значения, вставляемые каждые 10 секунд.

Чтобы взять только последнюю точку в серии, запрос в Grafana выглядит следующим образом:

FROM snmp WHERE agent_host::tag = RTR01 AND ifName::tag = 1/1/c8/1 SELECT field (ifOperStatus) ORDER BY TIME descending LIMIT 1 FORMAT AS Time series ALIAS woo

Настройка Query options :

Max data points: 1

Min interval: No limit

Interval: 15s

Relative time: 15s

Time shift: now-20s and now-5s

Моя логика:

Точки в influxdb добавляются каждые 10 с. В Grafana я устанавливаю интервал 15 с, чтобы каждая точка серии, соответствующая 10 с, заведомо попадала в этот интервал. Частота обновления составляет 15 с. Чтобы избежать ситуации с задержкой ответа SNMP, приводящей к отсутствию точек в последние 15 секунд перед обновлением (nox-15s), я сдвигаю интервал обновления на 5 секунд (now-20s - now-5s). В «Inspect:Data» я вижу только одно значение каждый раз, но это либо полученное правильное значение (1 или 2), либо пустое. Поочередно: со значением, пусто, со значением, пусто, со значением, пусто и т. д.

2025-09-19 13:05:30 1

2025-09-19 13:05:45 : <пусто>

2025-09-19 13:06:00 1

2025-09-19 13:06:15 : <пусто>

2025-09-19 13:06:30 1

2025-09-19 13:06:45 : <пусто>

и т. д.

Почему они пустые? При запросе к influxdb из CLI никаких пустых записей нет.

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

И ещё один вопрос.

Возможна ситуация, когда не были получены 1-2 SNMP-ответа. Мне кажется практичным взять не одну, а (например) пять последних точек и считать, что интерфейс находится в состоянии Up, только если три из этих пяти точек имеют значение 1 (Up). Как можно добиться такого поведения? С помощью запроса? С помощью преобразования?

Заранее спасибо за помощь!


SELECT field (ifOperStatus) ORDER BY TIME descending LIMIT 1

Ты запрос писал вручную, или строил через веб-морду графаны?

Именно со второй версией influxdb не работал, но

    1. вообще из него не запрашивают отдельное значение Обычно берут функцию от метрики (чаще всего mean, но в твоем случае last) т.е. last(field(ifOperStatus))
    1. в GROUP BY попробуй добавить fill()

скорее всего, если бы ты строил запрос через графану, все это уже было бы автоматом

router ★★★★★
()

Например, запрос из первой версии, созданный через графану:

SELECT mean("active") FROM "nginx" WHERE ("host" =~ /^$host$/) AND $timeFilter GROUP BY time($__interval), "host", "server", "port" fill(none)
router ★★★★★
()
Ответ на: комментарий от router

Спасибо за совет, попробую. Запрос строил через веб-морду графаны, через influxQL. Он в этом плане аналогичен v1 (в CLI influxv2 даже интерфейс отсылает к первой версии: influx v1 shell). Запрос через Flux я не осилил.

Я, честно говоря, не могу понять, почему в grafanе вообще может возвращаться точка с нулевым значением, в то время когда в самой базе influxdb таких нет.

vmcs
() автор топика
Ответ на: комментарий от vmcs

вообще может возвращаться точка с нулевым значением

Не совсем. Во всех tsdb, емнип, для определенности разрешено деление на ноль. Т.е. данных может не быть, и это не проблема. Результат зависит от параметров запроса (параметр fill)

почему в grafanе вообще может возвращаться точка с нулевым значением, в то время когда в самой базе influxdb таких нет.

Да есть. Ты пишешь данные раз в 10 секунд (00:40, 00:50), а запрашиваешь данные за 00:45. Их в принципе нет. Но tsdb может интерполировать, by design

Плюс в tsdb обычно данные возвращаются за интервал, как результат функции (mean, max, min, last и т.д.)

router ★★★★★
()
Последнее исправление: router (всего исправлений: 2)
Ответ на: комментарий от router

почему в grafanе вообще может возвращаться точка с нулевым значением,

А ноль или «нет данных» или «предыдущее значение» как раз и определяется функцией «fill»

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

После множества экспериментов удалось получить желаемый результат только выкинув из запроса $timeFilter и GROUP BY time($__interval)

SELECT last(«ifOperStatus») FROM «snmp» WHERE («ifName»::tag = ‘1/1/c8/1’ AND «agent_host»::tag = ‘RTR01’) AND $timeFilter GROUP BY time($__interval) ORDER BY time DESC LIMIT 1

То есть в конечном виде:

SELECT last("ifOperStatus") FROM "snmp" WHERE ("ifName"::tag = '1/1/c8/1' AND "agent_host"::tag = 'RTR01') ORDER BY time DESC LIMIT 1

Для этого пришлось редактировать запрос вручную (raw), через веб-интерфейс (explorer) выкинуть $timeFilter невозможно. То есть удобно скомпоновать запрос в эксплороре, потом переключиться в raw, где выбросить timeFilter. Обратно из raw в эксплорер переключть запрос нельзя.

vmcs
() автор топика
Последнее исправление: vmcs (всего исправлений: 1)
Ответ на: комментарий от vmcs

через веб-интерфейс (explorer) выкинуть $timeFilter невозможно

А это обычно и не нужно. Если ты хочешь отображать значение в stat или singlestat, то у них на странице параметров свой селектор. То ли last, то ли current.

Т.е. в query будет last(field), а потом ещё в options current

router ★★★★★
()