Сначала немного информации о данных.
У меня есть база данных InfluxDB с одним измерением, autobandwidth
, которая заполняется каждую минуту статистикой интерфейсов, собранной из snmp, но здесь интересны теги host
, snmp_id
и значения ifInOctets
и ifOutOctets
.
Затем у меня есть непрерывный запрос, который заполняет производную для изменения байтов в байтах / секундах с использованием non_negative_derivative
и заполняет autobandwidth_deriv
.
Я использую Grafana для отображения данных и использую этот запрос:
SELECT
mean("non_negative_derivative_ifInOctets") *8 AS "in",
mean("non_negative_derivative_ifOutOctets") *8 AS "out"
FROM "autobandwidth_deriv"
WHERE ("host" =~ /^$host$/ AND "snmp_id" =~ /^$snmp_id$/) AND $timeFilter
GROUP BY time($__interval), "host", "snmp_id"
Он прекрасно отображает данные.
Теперь у меня есть еще один запрос к получить значения 95%:
SELECT
percentile("non_negative_derivative_ifInOctets", 95) *8 AS "in 95%",
percentile("non_negative_derivative_ifOutOctets", 95) *8 AS "out 95%"
FROM "autobandwidth_deriv"
WHERE ("host" =~ /^$host$/ AND "snmp_id" =~ /^$snmp_id$/) AND $timeFilter
GROUP "host", "snmp_id"
Это дает мне значения 95% в легенде графика.
Теперь, что я хотел бы получить прямую линию, где 95 %, чтобы иметь визуальное пособие и видеть, когда трафик c поднимается выше.
Поскольку запрос effxdb возвращает только одно временное значение, он не отображается на графике.
Кроме того, потому что я иметь только одно значение времени, использование любого значения fill()
не Т помочь, нечего заполнять. И при этом установка значения NULL для подключенного в настройках графа grafana по той же причине невозможна.
После нескольких дней чтения все, что я смог найти о процентилях и графиках, все, что я в итоге сделал, - это использование подобъекта:
SELECT
MEAN("in 95%") as "in 95%", MEAN("out 95%") as "out 95%"
FROM (
SELECT
percentile("non_negative_derivative_ifInOctets", 95) *8 AS "in 95%",
percentile("non_negative_derivative_ifOutOctets", 95) *8 AS "out 95%"
FROM "autobandwidth_deriv"
WHERE ("host" =~ /^$host$/ AND "snmp_id" =~ /^$snmp_id$/) AND $timeFilter
GROUP BY time(600d), "host", "snmp_id"
)
GROUP BY time($__interval), "host", "snmp_id" fill(previous)
Теперь у меня есть линия, которую я хочу ... за исключением случаев, когда мой временной ряд пересекает границу time(600d)
, где у меня есть два значения.
Мне нужно GROUP BY time(600d)
в подвыборке в противном случае InfluxDB умничает и вычисляет, что я хочу получить все значения времени из подвыбора, и в итоге получаю данные, которые без вычисления процентиля ...
Итак, это не решение, и я делаю не знаю, что делать дальше.
Может быть, мне нужно что-то сделать в Графане, но я не могу понять, что ...