Линейная интерполяция в PromQL или MetricsQL

Я оцениваю VictoriaMetrics для приложения IoT, в котором иногда возникают пробелы в серии из-за проблем с оборудованием или связью. В некоторых ситуациях отчетности временных рядов нам полезно интерполировать значения для пропущенных временных интервалов. Я вижу, что MetricsQL (который расширяет PromQL) имеет функцию keep_last_value(), которая заполняет пробелы удерживание последнего наблюдаемого значения до появления нового (что будет полезно для нас), но в некоторых ситуациях линейная интерполяция между значениями до и после разрыва является более реалистичной оценкой недостающей части. Есть ли в PromQL или MetricsQL функция, которая будет выполнять линейную интерполяцию отсутствующих данных в серии, или можно создать более сложный запрос, который этого добьется?

Уточнение желаемой интерполяции

Я бы хотел простой интерполяции между точками непосредственно перед и после разрыва; я считаю, что это то, что делает функция TimescaleDB interpolate (). Другими словами, если мой временной ряд:

(1:00, 2)
(2:00, 4)
(3:00, NaN)
(4:00, 5)
(5:00, 1)

Я хочу, чтобы интерполированное значение 3:00 было 4,5, на полпути между точками непосредственно перед и после. Я не хочу, чтобы оно было 6 (это то, что я бы получил, экстраполируя из точек перед отсутствующим, игнорируя точки после), и мне не нужно какое-либо значение, которое я получил бы, если бы сделал линейную регрессию в целом серии и интерполированы в 3 часа (предположительно 3 или что-то близкое к этому).

Конечно, это простая иллюстрация, и также возможно, что разрыв может длиться более одного временного шага. Но в этом случае я бы все равно хотел, чтобы интерполяция основывалась исключительно на точках непосредственно до и сразу после разрыва, игнорируя остальную часть ряда.


person mactyr    schedule 24.06.2020    source источник


Ответы (1)


Окончательный ответ

Используйте функцию interpolate, которая теперь доступна в VictoriaMetrics, начиная с v1.38.0.

Исходное предложение

Это не обеспечивает точной интерполяции, запрошенной в измененном вопросе, но может быть полезно для других с немного другими требованиями

Попробуйте объединить функцию pred_linear с оператором default из MetricsQL следующим образом:

metric default predict_linear(metric[1h], 0)

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

person valyala    schedule 01.07.2020
comment
Интересная идея, но, читая predict_linear, не похоже, что он будет делать ту интерполяцию, которую я ищу. Я добавил раздел к вопросу, разъясняющий точное поведение, которое я ищу (который, как мне кажется, совпадает с interpolate() в TimescaleDB, для справки). Достигнет ли predict_linear этого? Или есть другой способ? - person mactyr; 01.07.2020
comment
Спасибо за обновленный вопрос! Я только что добавил interpolate функцию в VictoriaMetrics - подробности см. В - person valyala; 02.07.2020
comment
Превосходно. Я с нетерпением жду возможности попробовать. - person mactyr; 03.07.2020