Интеграция Deephaven и Prometheus, часть 3: объединение данных временных рядов

Джейк Малфорд

Объединение ваших данных в режиме реального времени в единый источник достоверности — в данном случае в одну таблицу, которой вы можете управлять, — упрощает и повышает эффективность анализа.

В предыдущих двух частях нашей серии статей о Prometheus мы обсуждали, как получать данные как из Prometheus REST API, так и из веб-перехватчиков предупреждений Prometheus. Теперь у нас есть два постоянных потока данных: один, который отслеживает наши показатели, и другой, который сообщает нам, когда оповещения были запущены и разрешены.

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

Присоединение данных о времени

На данный момент наше приложение Prometheus создает два источника данных в реальном времени. Для дальнейшего анализа мы хотим объединить эти таблицы.

Deephaven поддерживает несколько операций соединения; в общем, таблицы объединяются через ряд столбцов, используемых в качестве ключей для сопоставления строк из двух таблиц. Prometheus REST API и вебхуки предупреждений Prometheus имеют три общих поля: задание, экземпляр и временная метка. Используя одни и те же имена столбцов для отслеживания этих таблиц, две таблицы можно легко соединить.

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

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

Язык запросов Deephaven предоставляет методы для группировки времени на основе временных интервалов. lowerBin позволяет вам привязать временную метку к ячейке, а upperBin позволяет вам привязать временную метку к ячейке. Например, если у нас есть метка времени 2020-01-01T00:35:01.5 и интервал T1S (1 секунда), lowerBin преобразует это время в 2020-01-01T00:35:01, а upperBin преобразует это время в 2020-01-01T00:35:02.

Мы можем использовать любой из этих методов бина, чтобы округлить наши временные метки из Prometheus, чтобы соединить их вместе. В этом примере кода показано, как уменьшить временные метки до полсекунды.

nanos_bin = 500000000 # We want to floor our Prometheus timestamps to half a second
prometheus_alerts_floored = prometheus_alerts.update(
    "PrometheusDateTimeFloored = lowerBin(PrometheusDateTime, nanos_bin)"
).dropColumns("PrometheusDateTime")
prometheus_metrics_floored = prometheus_metrics.update(
    "PrometheusDateTimeFloored = lowerBin(PrometheusDateTime, nanos_bin)"
).dropColumns("PrometheusDateTime")
prometheus_alerts_metrics = prometheus_alerts_floored.join(prometheus_metrics_floored, "PrometheusDateTimeFloored, Job, Instance")

Теперь у нас есть одна таблица, содержащая данные из обеих наших тиковых таблиц! Отсюда вы можете манипулировать и анализировать эти данные в пользовательском интерфейсе Deephaven — например, динамически отображать ваши данные или фильтровать интересующие значения.

Образец приложения

Пример приложения Prometheus alerts metrics демонстрирует, как объединить две таблицы, содержащие данные о времени срабатывания, и сохранить их в Deephaven.

Этот проект доступен для запуска кем угодно, поэтому не стесняйтесь запускать его локально и изменять правила предупреждений, таблицы данных или любую другую конфигурацию, чтобы увидеть различные вещи, которые вы можете выполнить с помощью Deephaven!