События мониторинга#

В таблице представлены варианты метрик и запросов для мониторинга модуля Unimon-agent.

Название метрики

Краткое описание

Тип на дашборде

Подробное описание

Пример запроса

Доступность

up

Доступность unimon-agent

graph

В метрике должно быть указано "labels.app": "unimon-agent", значение 1-доступен

process_start_time_seconds

Доступность

graph

Подсчет количества уникальных значений по лейблу "labels.pod" за момент времени с гранулярностью $time. Условно верная метрика, не отражает фактического статуса недоступности, а строит предположение на основе отсутствия значения в окне гранулярности $time, так при условии, что Abyss в одно окно гранулярности не забрал метрику, например сфейлилась аналитическая задача фактически сервис доступен для потребителя и функционирует, а на графике зафиксировано сокращение количества реплик. Снижение количества реплик, если оно не ожидается, это основание посмотреть что, что-то идет не так

Query: select $time as "time", count(distinct("labels.pod")) as "pod"from "$druidtable" $where and name = 'process_start_time_seconds' and "labels.namespace"='$namespace' and "labels.pod" in ([[pod)group by $time

process_start_time_seconds

Uptime pod / Версия приложения

table

Отображение аптайма контейнера с приложением на основе метрики process_start_time_seconds. Неожиданное уменьшение времени без изменения имени pod свидетельствует о перезапуске контейнера

Query: select "labels.app" as "App", "labels.distribVersion" as "Version", "labels.pod" as "Pod", TIMESTAMP_TO_MILLIS(CURRENT_TIMESTAMP) / 1000 - LATEST(CAST("value" AS FLOAT)) as "Uptime"from "$druidtable" $where and name = 'process_start_time_seconds' and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by "labels.app", "labels.pod", "labels.distribVersion"

Производительность

prometheus_tsdb_head_samples_appended_total

Скорость добавления sample в локальную базу

graph

Интенсивность считывания и добавления сэмплов в БД Prometheus на основе метрики prometheus_tsdb_head_samples_appended_total (Total number of appended samples. TYPE prometheus_tsdb_head_samples_appended_total counter). Показатель отражает текущую интенсивность входящего потока сэмплов

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as "value", "labels.pod" as "pod"from "$druidtable" $where and name = 'prometheus_tsdb_head_samples_appended_total' and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod"

prometheus_tsdb_head_series

Количество временных рядов

graph

Количество активных временных рядов в Prometheus на основе метрики prometheus_tsdb_head_series (Total number of series in the head block). От количества активных временных рядов зависит величина потребления памяти, что при бесконтрольном росте может приводить к исчерпанию памяти. При наличии большого значения данной метрики и низком количестве endpoint сбора метрик рекомендуется обратить внимание на публикуемые метрики и рассмотреть возможные пути оптимизации количества публикуемых метрик, например исключить дублирование метрик или уменьшение вариативности значений лейблов с целью сокращения временных рядов

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as "value", "labels.pod" as "pod"from "$druidtable" $where and name = 'prometheus_tsdb_head_series' and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod"

prometheus_target_scrapes_sample_out_of_order_total

Количество sample отклоненных из-за несоответсвия ожидаемому порядку

table

Количество сэмплов с неверным порядком на основе метрики prometheus_target_scrapes_sample_out_of_order_total (Total number of samples rejected due to not being out of the expected order. TYPE prometheus_target_scrapes_sample_out_of_order_total counter). Может возникать при федерировании, например с корневого Прометея, свидетельствует о получении сэмплов с более ранней датой, чем уже получено

Query: select (LATEST("value") - EARLIEST("value")) as "value", "labels.pod" as "pod"from "$druidtable" $where and name = 'prometheus_target_scrapes_sample_out_of_order_total' and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by "labels.pod"

scrape_samples_scraped

Количество собранных sample

graph

Количество собранных сэмплов на основе метрики scrape_samples_scraped (the number of samples the target exposed). Отражает количество сэмплов, которое было собрано с endpoint

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value"), "labels.pod"from "$druidtable" $where and name = 'scrape_samples_scraped' and "labels.namespace" = '$namespace' – and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod" \ select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as "system-federate-metrics"from "$druidtable" $where and name = 'scrape_samples_scraped' and "labels.job"='system-federate-metrics' – and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT30S')

scrape_duration_seconds

Длительность сбора sample

graph

Длительность сбора метрик на основе метрики scrape_duration_seconds. Если длительность сбора превышает timeout сбора, сбор не будет осуществлен

Query: select TIME_FLOOR(__time, 'PT15S') as "time", AVG("value") as "AVG", MIN("value") as "MIN", MAX("value") as "MAX" – "labels.pod"from "$druidtable" $where and name = 'scrape_duration_seconds' and "labels.namespace" = '$namespace' – and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT15S') – "labels.pod"

prometheus_sd_discovered_targets

Количество целей сбора

graph

Количество целей сбора на основе метрики prometheus_sd_discovered_targets (Current number of discovered targets) в разрезе конфигурации сбора

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.config"from "$druidtable" $where and name = 'prometheus_sd_discovered_targets' and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod) and "labels.name" = 'scrape' and "value" > 0group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.config"

prometheus_remote_storage_succeeded_samples_total

Скорость отправки sample в удаленное хранилище

graph

Интенсивность успешной отправки сэмплов при настроенной конфигурации remote_write в endpoint для приема метрик на основе метрики prometheus_remote_storage_succeeded_samples_total (Total number of samples successfully sent to remote storage). Стоит учитывать, что отправка производится пакетами сэмплов, по умолчанию 100 сэмплов в пакете. В нормальном случае должна коррелировать с метрикой считывания и добавления сэмлов. При заметной разнице, есть вероятность, что endpoint приема метрик не справляется с нагрузкой, вследствие чего может расти очередь отправки метрик и запаздывание появления метрик в хранилище

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.url"from "$druidtable" $where and (name = 'prometheus_remote_storage_succeeded_samples_total' or name ='prometheus_remote_storage_samples_total') and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.url"

prometheus_remote_storage_pending_samples

Количество ожидающих sample в очередях шард для отправки в удаленное хранилище

graph

Показывает количество метрик ожидающих отправку в очереди на основе метрики prometheus_remote_storage_pending_samples (The number of samples pending in the queues shards to be sent to the remote storage). Рост данного показателя может означать медленную обработку метрик endpoint приема метрик или другие проблемы с данным endpoint. Возможно следует произвести переконфигурирование размера пакета отправки. На основе этого показателя рассчитывается количество потоков отправки пакетов метрик. Не должно быть постоянного роста, но некоторое колебание считать нормой

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as "pending samples", – (LATEST("value") - EARLIEST("value"))/15 as "pending samples per sec", "labels.pod", "labels.url"from "$druidtable" $where and name = 'prometheus_remote_storage_pending_samples' and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.url"

prometheus_remote_storage_sent_batch_duration_seconds_count

Количество пакетной отправки sample в удаленное хранилище в секунду

graph

Интенсовность отправки пакетов метрик в удаленное хранилище на основе метрики prometheus_remote_storage_sent_batch_duration_seconds (Duration of sample batch send calls to the remote storage). Интенсивность вызова REST API сервиса приема метрик, отражает нагрузку на сервис приема метрик

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.url"from "$druidtable" $where and name = 'prometheus_remote_storage_sent_batch_duration_seconds_count' and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.url"

prometheus_remote_storage_queue_highest_sent_timestamp_seconds, prometheus_remote_storage_highest_timestamp_in_seconds

Отставание метки времени метрики в очереди

graph

На основе метрик prometheus_remote_storage_queue_highest_sent_timestamp_seconds (Timestamp from a WAL sample, the highest timestamp successfully sent by this queue, in seconds since epoch) и prometheus_remote_storage_highest_timestamp_in_seconds (Highest timestamp that has come into the remote storage via the Appender interface, in seconds since epoch) вычисляем фактическое отставание метрик в секундах. Должно быть приемлемым

Query: select "time", "time_" - "time_in_queue" as "lag", "labels.pod"from ( select TIME_FLOOR(_time, 'PT15S') as "time", MAX("value") - MIN("value") as "value", "labels.pod", LATEST("value") FILTER (where name = 'prometheus_remote_storage_queue_highest_sent_timestamp_seconds') as "time_in_queue", LATEST("value") FILTER (where name = 'prometheus_remote_storage_highest_timestamp_in_seconds') as "time" from "$druidtable" $where and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod) group by TIME_FLOOR(__time, 'PT15S'), "labels.pod")

prometheus_remote_storage_sent_bytes_total

Скорость отправки sample в удаленное хранилище, байт в секунду

graph

Description: Количество байт отправленных в сервис удаленного приема метрик в секунду на основе метрики prometheus_remote_storage_sent_bytes_total (The total number of bytes sent by the queue)

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.url"from "$druidtable" $where and name = 'prometheus_remote_storage_sent_bytes_total' and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.url"

prometheus_remote_storage_shards, prometheus_remote_storage_shards_desired

Рекомендуемое/текущее количство шард, паралельность отправки

graph

Description: Количество активных потоков отправки пакетов метрик. удаленное хранилище и расчетнотребуемое от интенсивности обработки метрик агентом на основе метрик prometheus_remote_storage_shards (The number of shards used for parallel sending to the remote storage) и prometheus_remote_storage_shards_desired (The number of shards that the queues shard calculation wants to run based on the rate of samples in vs. samples ou)

Query: select TIME_FLOOR(__time, 'PT1M') as "time", MAX("value") as "shards", "labels.pod", "labels.url"from "$druidtable" $where and name = 'prometheus_remote_storage_shards' and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT1M'), "labels.pod", "labels.url" \ select TIME_FLOOR(__time, 'PT1M') as "time", MAX("value") as "desired", "labels.pod", "labels.url"from "$druidtable" $where and name = 'prometheus_remote_storage_shards_desired' and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT1M'), "labels.pod", "labels.url"

prometheus_remote_storage_sent_batch_duration_seconds_sum

Средняя длительность отправки пакета sample в удаленное хранилище

graph

Средняя длительность отправки пакета сэмплов в сервис приема метрик на основе метрики prometheus_remote_storage_sent_batch_duration_seconds (Duration of sample batch send calls to the remote storage). Длительность отражает задержку отработки запроса сервисом удаленного приема метрик, и зависит от загруженности данного сервиса или других сетевых задержек. Следует анализировать с временем отработки запроса самого сервиса для определения на какой этап уходит время при зафиксированном его росте

Query: select "time", "sum" / "cnt" as "duration", "labels.pod"from ( select TIME_FLOOR(__time, 'PT30S') as "time", "labels.pod", LATEST(CAST("value" AS FLOAT)) FILTER (where name = 'prometheus_remote_storage_sent_batch_duration_seconds_sum') - EARLIEST(CAST("value" AS FLOAT)) FILTER (where name = 'prometheus_remote_storage_sent_batch_duration_seconds_sum') as "sum", LATEST(CAST("value" AS INTEGER)) FILTER (where name = 'prometheus_remote_storage_sent_batch_duration_seconds_count') - EARLIEST(CAST("value" AS INTEGER)) FILTER (where name = 'prometheus_remote_storage_sent_batch_duration_seconds_count') as "cnt" from "$druidtable" $where and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod) group by TIME_FLOOR(__time, 'PT30S'), "labels.pod")

prometheus_remote_storage_sent_batch_duration_seconds_sum

Длительность отправки пакетов sample в удаленное хранилище

graph

Длительность отправки определенного количества пакетов сэмпов на основе метрики prometheus_remote_storage_sent_batch_duration_seconds (Duration of sample batch send calls to the remote storage)

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as "value", "labels.pod", name from "$druidtable" $where and (name = 'prometheus_remote_storage_sent_batch_duration_seconds_sum' or name = 'prometheus_remote_storage_sent_batch_duration_seconds_count') and "labels.namespace" = '$namespace'group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", name

Ошибки и сбои

prometheus_remote_storage_enqueue_retries_total

Неудачные попытки постановки в очередь из-за переполнения очереди шард

graph

Показывает переполнение очереди на отправку метрик на основе метрики prometheus_remote_storage_enqueue_retries_total (Total number of times enqueue has failed because ashards queue was full). В норме должно быть 0

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.url"from "$druidtable" $where and name = 'prometheus_remote_storage_enqueue_retries_total' and "labels.namespace" = '$namespace'group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.url"

prometheus_remote_storage_retried_samples_total

Количество повторно отправленных sample после ошибки

graph

Количество сэмплов, которые не были отправлены в удаленное хранилище, но были повторены, поскольку ошибка отправки была исправима на основе метрики prometheus_remote_storage_retried_samples_total (Total number of samples which failed on send to remote storage but were retried because the send error was recoverable). В норме должно тримится к 0

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.url"from "$druidtable" $where and name = 'prometheus_remote_storage_retried_samples_total' and "labels.namespace" = '$namespace'group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.url"

prometheus_remote_storage_dropped_samples_total

Количество sample, которые были отброшены после чтения из WAL перед отправкой в удаленное хранилище

graph

Количество сэмплов, которые были отброшены из-за переполнения очереди на основе метрики prometheus_remote_storage_dropped_samples_total (Total number of samples which were dropped after being read from the WAL before being sent via remote write)

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.url"from "$druidtable" $where and name = 'prometheus_remote_storage_dropped_samples_total' and "labels.namespace" = '$namespace'group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.url"

prometheus_remote_storage_failed_samples_total

Количество неотправленных sample

graph

Количество sample, которые не были отправлены в сервис приема метрик на основе метрики prometheus_remote_storage_failed_samples_total (Total number of samples which failed on send to remote storage, non-recoverable errors). В норме должно быть равно 0

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.url"from "$druidtable" $where and name = 'prometheus_remote_storage_failed_samples_total' and "labels.namespace" = '$namespace'group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.url"

prometheus_target_scrapes_exceeded_sample_limit_total, prometheus_target_scrapes_sample_duplicate_timestamp_total, prometheus_target_scrapes_sample_out_of_bounds_total, prometheus_target_scrapes_sample_out_of_order_total

Ошибки сбора

graph

На графике отражено наличие ошибок на основе метрик: prometheus_target_scrapes_exceeded_sample_limit_total (Total number of scrapes that hit the sample limit and were rejected), prometheus_target_scrapes_sample_duplicate_timestamp_total (Total number of samples rejected due to duplicate timestamps but different values), prometheus_target_scrapes_sample_out_of_bounds_total (Total number of samples rejected due to timestamp falling outside of the time bounds), prometheus_target_scrapes_sample_out_of_order_total (Total number of samples rejected due to not being out of the expected order)

Query: select TIME_FLOOR(_time, 'PT30S') as "time", (LATEST("value") - EARLIEST("value")) as " ", "labels.pod", name from "$druidtable" $where and (name = 'prometheus_target_scrapes_exceeded_sample_limit_total' or name like 'prometheus_target_scrapes_sample%_total') and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", name

prometheus_target_scrapes_sample_duplicate_timestamp_total

Количество sample отклоненных из-за дублирования временных меток, но с разными значениями

table

Количество сэмплов отклоненных из-за дублирования временных меток, но с разными значениями за выбранный период на основе метрики prometheus_target_scrapes_sample_duplicate_timestamp_total (Total number of samples rejected due to duplicate timestamps but different values)

Query: select (LATEST("value") - EARLIEST("value")) as "value", "labels.pod" as "pod"from "$druidtable" $where and name = 'prometheus_target_scrapes_sample_duplicate_timestamp_total' and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod)group by "labels.pod"

В таблице представлены варианты метрик и запросов для мониторинга модуля Unimon-sender.

Название метрики

Описание, что вычисляем

Тип на дашборде

Описание

Пример запроса

Доступность

unimon_sender_health_status

Доступность

Общая работоспособность (1-UP, 0-DOWN, 2-Частичная работоспособность) Если хоть один из компонентов сервиса (метрики unimon_sender_health_status{component=<имя компонента>}) DOWN, тогда общая метрика будет в состоянии 2 - частичная работоспособность. Если все компоненты в DOWN, тогда и общий статус DOWN

unimon_sender_health_status, где component="unimon-server"

Доступность

Работоспособность (1-UP, 0-DOWN) DOWN, если число последних ошибок при взаимодействии с unimon-server больше параметра UNIMON_SERVER_HEALTH_STATUS_ERRORS_THRESHOLD

unimon_sender_health_status, где component="unimon-filter"

Доступность

Работоспособность (1-UP, 0-DOWN) DOWN, если число последних ошибок при взаимодействии с unimon-filter больше параметра UNIMON_FILTER_HEALTH_STATUS_ERRORS_THRESHOLD

unimon_sender_health_status, где component="unimon-metadata"

Доступность

Работоспособность (1-UP, 0-DOWN) DOWN, если число последних ошибок при взаимодействии с unimon-metadata больше параметра UNIMON_METADATA_HEALTH_STATUS_ERRORS_THRESHOLD

unimon_sender_health_status, где component="kafka-producer"

Доступность

Работоспособность (1-UP, 0-DOWN) DOWN, если число последних ошибок при взаимодействии с kafka-producer больше параметра UNIMON_KAFKA_HEALTH_STATUS_ERRORS_THRESHOLD

unimon_sender_health_status, где component="kafka-topic"

Доступность

Работоспособность (1-UP, 0-DOWN) DOWN, если число последних ошибок при взаимодействии с kafka-topic больше параметра UNIMON_KAFKA_HEALTH_STATUS_ERRORS_THRESHOLD

process_start_time_seconds

Доступность

graph

Подсчет количества уникальных значений по лейблу "labels.pod" за момент времени с гранулярностью $time. Условно верная метрика, не отражает фактического статуса недоступности, а строит предположение на основе отсутствия значения в окне гранулярности $time. Так при условии, что Abyss в одно окно гранулярности не забрал метрику, например, сфейлилась аналитическая задача, на графике будет зафиксировано сокращение количества реплик, а фактически сервис доступен для потребителя и функционирует. Снижение количества реплик, если оно не ожидается, основание посмотреть, что что-то идет не так

Query: select TIME_FLOOR("__time", 'PT1M') as "time", count(distinct("labels.pod")) as "pod"from "$druidtable" $where and name = 'process_start_time_seconds' and "labels.namespace"='$namespace' and "labels.app"='$app' and "labels.pod" in ($pod) --and "value"!='0'group by TIME_FLOOR("__time", 'PT1M')

process_uptime_seconds

Uptime pod /Версия приложения

table

Отображение аптайма контейнера с приложением на основе метрики process_uptime_seconds (The uptime of the Java virtual machine). Неожиданное уменьшение времени без изменения имени pod свидетельствует о перезапуске контейнера

Query: select "labels.app" as "App", "labels.distribVersion" as "Version", "labels.pod" as "Pod", MAX("value") as "Uptime"from "$druidtable" $where and name = 'process_uptime_seconds' and "labels.namespace" = '$namespace' and "labels.app" = '$app' and "labels.pod" in ([[pod) and "value" like '%.%'group by "labels.app", "labels.pod", "labels.distribVersion"order by "Uptime"

Производительность

http_server_requests_seconds_count

HTTP запросы в секунду (усредненные за 30 секунд)

graph

Интенсивность http-запросов, полученных Unimon-sender в разрезе uri, HTTP метода и HTTP кода, на основе метрики http_server_requests_seconds_count

Query: select TIME_FLOOR("__time", 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.status", "labels.uri", "labels.method"from "$druidtable" $where and name = 'http_server_requests_seconds_count' and "labels.namespace"='$namespace' and "labels.app"='$app' – and "labels.method"='POST' and "labels.pod" in ($pod) and "labels.uri" in ([[API)group by TIME_FLOOR("__time", 'PT30S'), "labels.pod", "labels.status", "labels.uri", "labels.method"

http_server_requests_seconds

Среднее время выполнения запроса

graph

Среднее время выполнения запроса в разрезе uri, HTTP метода и HTTP кода на основе метрики http_server_requests_seconds. Показывает за какое время в среднем сервис обрабатывает запрос

Query: select "time", "sum" / "cnt" as " ", "labels.pod", "labels.status", "labels.uri", "labels.method"from ( select TIME_FLOOR(__time, 'PT30S') as "time", "labels.pod", "labels.status", "labels.uri", "labels.method", LATEST(CAST("value" AS FLOAT)) FILTER (where name = 'http_server_requests_seconds_sum') - EARLIEST(CAST("value" AS FLOAT)) FILTER (where name = 'http_server_requests_seconds_sum') as "sum", LATEST(CAST("value" AS INTEGER)) FILTER (where name = 'http_server_requests_seconds_count') - EARLIEST(CAST("value" AS INTEGER)) FILTER (where name = 'http_server_requests_seconds_count') as "cnt" from "$druidtable" $where and "labels.namespace"='$namespace' and "labels.app"='$app' – and "labels.method"='POST' and "labels.pod" in ([[pod) and "labels.uri" in ([[API) group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.status", "labels.uri", "labels.method")

http_server_requests_seconds_max

Максимальная длительность HTTP запроса

table

Максимальная продолжительность выполнения запроса в течении временного окна на основе метрики http_server_requests_seconds_max. Временное окно по умолчанию 2 минуты

Query: select TIME_FLOOR(__time, 'PT30S') as "time", MAX("value") as " ", "labels.pod", "labels.uri", "labels.method", "labels.status"from "$druidtable" $where and name = 'http_server_requests_seconds_max' and "labels.namespace" = '$namespace' and "labels.app" = '$app' and "labels.pod" in ([[pod) and "labels.uri" in ([[API)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.uri", "labels.method", "labels.status"

http_server_requests_seconds

Количество HTTP запросов со статусом 200

table

Количество запросов со статусом 200 за выбранный интервал на основе метрики http_server_requests_seconds

Query: select TIME_FLOOR("__time", 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.uri", "labels.method"from "$druidtable" $where and name = 'http_server_requests_seconds_count' and "labels.namespace"='$namespace' and "labels.app"='$app' – and "labels.method"='POST' and "labels.status" = '200' and "labels.pod" in ($pod) and "labels.uri" in ([[API)group by TIME_FLOOR("__time", 'PT30S'), "labels.pod", "labels.uri", "labels.method"

http_server_requests_seconds

Количество HTTP запросов со статусом отличным от 200

table

Количество запросов со статусом отличным от 200 за выбранный интервал на основе метрики http_server_requests_seconds

Query: select TIME_FLOOR("__time", 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.uri", "labels.method"from "$druidtable" $where and name = 'http_server_requests_seconds_count' and "labels.namespace"='$namespace' and "labels.app"='$app' – and "labels.method"='POST' and "labels.status" != '200' and "labels.pod" in ($pod) and "labels.uri" in ([[API)group by TIME_FLOOR("__time", 'PT30S'), "labels.pod", "labels.uri", "labels.method"

kafka_producer_topic_record_send_total

Скорость отправки сообщений в Kafka

graph

Интенсивность отправки сообщений в Kafka в разрезе topic и pod на основе метрики kafka_producer_topic_record_send_total (The total number of records sent for a topic)

Query: select TIME_FLOOR("__time", 'PT30S') as "time", LATEST("value") as " ", "labels.pod","labels.topic"from "$druidtable"$whereand name = 'kafka_producer_topic_record_send_total'and "labels.namespace"='$namespace'and "labels.app"='$app' and "labels.pod" in ($pod)–and "value"!='0'group by TIME_FLOOR("__time", 'PT30S'), "labels.pod", "labels.topic"

kafka_producer_request_rate

Запросы в секунду

graph

Среднее количество отправленных запросов в секунду на основе метрики kafka_producer_request_rate (The number of requests sent per second), должно идти ровно без особых всплесков, всплески могут оказать влияние на производительность брокеров или вызвать увличение задержки в обработке запросов

Query: select $time as "time", "value" as "value", "labels.pod" as "pod"from "$druidtable"where $defaultfilterand name = 'kafka_producer_request_rate'and "labels.namespace"='$namespace'and "labels.app"='$app'and "labels.pod" in ($pod)–and "value"!='0'group by $time, "labels.pod", "value"

kafka_producer_response_rate

Ответы в секунду

graph

Среднее количество полученных ответов от брокера продюсеру в секунду на основе метрики kafka_producer_response_rate (The number of responses received per second)

Query: select $time as "time", "value" as "value", "labels.pod" as "pod"from "$druidtable"where $defaultfilterand name = 'kafka_producer_response_rate'and "labels.namespace"='$namespace'and "labels.app"='$app'and "labels.pod" in ($pod)–and "value"!='0'group by $time, "labels.pod", "value"

kafka_producer_request_latency_avg

Среднее время запроса

graph

Средняя задержка запроса в миллисекундах kafka_producer_request_latency_avg (The average request latency in ms). Время между отправкой продюсером и ответом брокера. Размеры сообщений могут влиять на данный показатель увеличивая его

Query: select $time as "time", "value" as "value", "labels.pod" as "pod"from "$druidtable"$whereand name = 'kafka_producer_request_latency_avg'and "labels.namespace"='$namespace'and "labels.app"='$app'and "labels.pod" in ($pod)–and "value"!='0'group by $time, "labels.pod", "value"

kafka_producer_node_request_latency_max

Максимальное время запроса

graph

Максимальная задержка запроса в миллисекундах в разрезе по nodes Kafka на основе метрики kafka_producer_node_request_latency_max

Query: selectTIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod","labels.node_id"from "$druidtable"$whereand name = 'kafka_producer_node_request_latency_max'and "labels.namespace"='$namespace'and "labels.app"='$app'and "labels.pod" in ($pod)–and "value"!='0'group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.node_id"

kafka_producer_node_request_size_max

Максимальный размер отправленного запроса

graph

Максимальный размер отправленного запроса в разрезе по nodes Kafka на основе метрики kafka_producer_node_request_size_max

Query: selectTIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod","labels.node_id"from "$druidtable"$whereand name = 'kafka_producer_node_request_size_max'and "labels.namespace"='$namespace'and "labels.app"='$app'and "labels.pod" in ($pod)–and "value"!='0'group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.node_id"

jvm_memory_used_bytes

Heap Memory

graph

Величина используемой HEAP памяти jvm_memory_used_bytes (The amount of used memory) sum all "labels.area" = 'heap'

Query: selectTIME_FLOOR(__time, 'PT15S') as "time", SUM("value") as " ", "labels.pod"from "$druidtable" $whereand name = 'jvm_memory_used_bytes'and "labels.area" = 'heap'and "labels.namespace"='$namespace'and "labels.app"='$app' and "labels.pod" in ($pod)–and "value"!='0'group by TIME_FLOOR(__time, 'PT15S'), "labels.pod"

jvm_memory_used_bytes

NonHeap Memory

graph

Величина используемой non-HEAP памяти jvm_memory_used_bytes (The amount of used memory) sum all "labels.area" = 'nonheap'

Query: selectTIME_FLOOR(__time, 'PT15S') as "time", SUM("value") as " ", "labels.pod"from "$druidtable"$where and name = 'jvm_memory_used_bytes'and "labels.area" = 'nonheap'and "labels.namespace"='$namespace'and "labels.app"='$app' and "labels.pod" in ($pod)–and "value"!='0'group by TIME_FLOOR(__time, 'PT15S'), "labels.pod"

jvm_gc_live_data_size_bytes, jvm_gc_max_data_size_bytes, jvm_gc_live_data_size_bytes_util

Утилизация heap OLD GEN после full GC

graph

Утилизация пула старшего поколения после вызова GC. 100 * "jvm_gc_live_data_size_bytes" / "jvm_gc_max_data_size_bytes" as "jvm_gc_live_data_size_bytes_util" HELP jvm_gc_max_data_size_bytes Max size of old generation memory pool. TYPE jvm_gc_max_data_size_bytes gauge HELP jvm_gc_live_data_size_bytes Size of old generation memory pool after a full GC. TYPE jvm_gc_live_data_size_bytes gauge

Query: select "time", 100 *"jvm_gc_live_data_size_bytes" / "jvm_gc_max_data_size_bytes" as "jvm_gc_live_data_size_bytes_util", "labels.pod"from ( select TIME_FLOOR(__time, 'PT30S') as "time", "labels.pod", LATEST("value") FILTER (where name = 'jvm_gc_live_data_size_bytes') as "jvm_gc_live_data_size_bytes", LATEST("value") FILTER (where name = 'jvm_gc_max_data_size_bytes') as "jvm_gc_max_data_size_bytes" from "$druidtable" $where and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod) group by TIME_FLOOR(__time, 'PT30S'), "labels.pod")

jvm_gc_live_data_size_bytes

Размер heap OLD GEN после full GC

graph

Размер пула старшего поколения после вызова GC на основе метрики jvm_gc_live_data_size_bytes (Size of old generation memory pool after a full GC)

Query: select TIME_FLOOR(__time, 'PT15S') as "time", LATEST("value") as " ", "labels.pod"from "$druidtable" $where and name = 'jvm_gc_live_data_size_bytes' and "labels.namespace"='$namespace' and "labels.app"='$app' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT15S'), "labels.pod"

jvm_gc_memory_allocated_bytes_total

Увеличение размера молодого поколения между вызовами GC

graph

Увеличение пула молодого поколения между вызовами GC на основе метрики jvm_gc_memory_allocated_bytes_total (Incremented for an increase in the size of the young generation memory pool after one GC to before the next)

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod"from "$druidtable" $where and name = 'jvm_gc_memory_allocated_bytes_total' and "labels.namespace"='$namespace' and "labels.app"='$app' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod"

jvm_gc_pause_seconds_max

Максимальное время в minor GC

table

Максимальное время в GC на основе метрики jvm_gc_pause_seconds_max (Time spent in GC pause). Временное окно по умолчанию около 2х минут

Query: select MAX("value") as " ", "labels.pod"from "$druidtable" $where and name = 'jvm_gc_pause_seconds_max' and "labels.action" = 'end of minor GC' and "labels.namespace" = '$namespace' and "labels.app" = '$app' and "labels.pod" in ([[pod)group by "labels.pod"

jvm_gc_pause_seconds_max

Максимальное время в major GC

table

Максимальное время в GC на основе метрики jvm_gc_pause_seconds_max (Time spent in GC pause). Временное окно по умолчанию около 2х минут

Query: select MAX("value") as " ", "labels.pod"from "$druidtable" $where and name = 'jvm_gc_pause_seconds_max' and "labels.action" = 'end of major GC' and "labels.namespace" = '$namespace' and "labels.app" = '$app' and "labels.pod" in ([[pod)group by "labels.pod"

process_files_open_files,process_files_max_files

Утилизация файловых дескрипторов для процесса

graph

Утилизация файловых дескрипторов в относительной величине на основе метрик process_files_open_files (The open file descriptor count) и process_files_max_files (The maximum file descriptor count) 100 *"process_files_open_files" / "process_files_max_files" as "process_files_util"

Query: select "time", 100 *"process_files_open_files" / "process_files_max_files" as "process_files_util", "labels.pod"from ( select TIME_FLOOR(__time, 'PT30S') as "time", "labels.pod", LATEST("value") FILTER (where name = 'process_files_open_files') as "process_files_open_files", LATEST("value") FILTER (where name = 'process_files_max_files') as "process_files_max_files" from "$druidtable" $where and "labels.namespace" = '$namespace' and "labels.pod" in ([[pod) group by TIME_FLOOR(__time, 'PT30S'), "labels.pod")

process_files_max_files

Максимальное количество файловых дескрипторов для процесса

table

Максимальное значение файловых дескрипторов process_files_max_files (The maximum file descriptor count)

Query: select MAX("value") as " ", "labels.pod"from "$druidtable" $where and name = 'process_files_max_files' and "labels.namespace" = '$namespace' and "labels.app" = '$app' and "labels.pod" in ([[pod)group by "labels.pod"

process_files_open_file

Количество открытых файловых дескрипторов

table

Абсолютная величина открытых файловых дескрипторов process_files_open_files (The open file descriptor count)

Query: select LATEST("value") as " ", "labels.pod"from "$druidtable" $where and name = 'process_files_open_files' and "labels.namespace"='$namespace' and "labels.app"='$app' and "labels.pod" in ($pod)group by "labels.pod"

jvm_memory_used_bytes

Heap Memory Pools

graph

Величина используемой памяти HEAP в разрезе memory pools на основе метрики jvm_memory_used_bytes (The amount of used memory)

Query: select TIME_FLOOR(__time, 'PT30S') as "time", avg("value") as " ", "labels.pod", "labels.id"from "$druidtable" $where and name = 'jvm_memory_used_bytes' and "labels.area" = 'heap' and "labels.namespace"='$namespace' and "labels.app"='$app' and "labels.pod" in ($pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.id"

jvm_memory_used_bytes

NonHeap Memory Pools

graph

Величина используемой памяти non-HEAP в разрезе memory pools на основе метрики jvm_memory_used_bytes (The amount of used memory)

Query: select TIME_FLOOR(__time, 'PT30S') as "time", avg("value") as " ", "labels.pod", "labels.id"from "$druidtable" $where and name = 'jvm_memory_used_bytes' and "labels.area" = 'nonheap' and "labels.namespace"='$namespace' and "labels.app"='$app' and "labels.pod" in ($pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.id"

jvm_threads_live_threads,jvm_threads_daemon_threads

Количество потоков

graph

Текущее количество потоков на основе метрик jvm_threads_live_threads (The current number of live threads including both daemon and non-daemon threads) и jvm_threads_daemon_threads (The current number of live daemon threads). Показывает общее количество "живых" потоков и количество потоков демонов выполняющих фоновые задачи

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod", namefrom "$druidtable" $where and (name = 'jvm_threads_live_threads' or name = 'jvm_threads_daemon_threads') and "labels.namespace"='$namespace' and "labels.app"='$app' and "labels.pod" in ($pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", name

jvm_threads_states_threads

Число потоков в разрезе статусов

graph

Количество потоков по их состояниям на основе метрики jvm_threads_states_threads. Наличие потоков с состоянием BLOCKED показывает количество заблокированных потоков, что может сказываться на производительности

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.state"from "$druidtable" $where and name = 'jvm_threads_states_threads' and "labels.namespace"='$namespace' and "labels.app"='$app' and "labels.pod" in ([[pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.state"

jvm_gc_pause_seconds

Garbage Collector per second

graph

Интенсивность вызова GC в секунду на основе метрики jvm_gc_pause_seconds (Time spent in GC pause)

Query: select TIME_FLOOR(__time, 'PT1M') as "time", LATEST("value") as " ", "labels.pod", name, "labels.action", "labels.cause"from "$druidtable" $where and (name = 'jvm_gc_pause_seconds_count') and "labels.namespace"='$namespace' and "labels.app"='$app' and "labels.pod" in ($pod)group by TIME_FLOOR(__time, 'PT1M'), "labels.pod", name, "labels.action", "labels.cause"

jvm_gc_pause_seconds

Garbage Collector average time per collect

graph

Средняя длительность цикла вызова GC на основе метрики jvm_gc_pause_seconds (Time spent in GC pause)

Query: select "time", "sum" / "cnt" as "duration", "labels.pod", "labels.action", "labels.cause"from ( select TIME_FLOOR(__time, 'PT30S') as "time", "labels.pod", "labels.action", "labels.cause", LATEST(CAST("value" AS FLOAT)) FILTER (where name = 'jvm_gc_pause_seconds_sum') - EARLIEST(CAST("value" AS FLOAT)) FILTER (where name = 'jvm_gc_pause_seconds_sum') as "sum", LATEST(CAST("value" AS INTEGER)) FILTER (where name = 'jvm_gc_pause_seconds_count') - EARLIEST(CAST("value" AS INTEGER)) FILTER (where name = 'jvm_gc_pause_seconds_count') as "cnt" from "$druidtable" $where and "labels.namespace" = '$namespace' and "labels.pod" in ($pod) group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", "labels.action", "labels.cause")

jvm_classes_loaded_classes,jvm_classes_unloaded_classes_total

Загруженные / выгруженные классы

graph

Текущее количество загруженных классов на основе метрики jvm_classes_loaded_classes (The number of classes that are currently loaded in the Java virtual machine). Количество выгруженных классов на основе метрики jvm_classes_unloaded_classes_total (The total number of classes unloaded since the Java virtual machine has started execution)

Query: select TIME_FLOOR(__time, 'PT30S') as "time", LATEST("value") as " ", "labels.pod", namefrom "$druidtable" $where and (name = 'jvm_classes_loaded_classes' or name = 'jvm_classes_unloaded_classes_total') and "labels.namespace"='$namespace' and "labels.app"='$app' and "labels.pod" in ($pod)group by TIME_FLOOR(__time, 'PT30S'), "labels.pod", name

logback_events_total

Скорость записи логов в секунду в разрезе уровня,

graph

Интенсивность вызова событий библиотеки логирования logback на основе метрики logback_events_total в разрезе уровней логирования. Позволяет увидеть наличие и частоту возникновение логов в разрезе их уровней

Query: select TIME_FLOOR("__time", 'PT30S') as "time", LATEST("value") as " ", "labels.pod", "labels.level"from "$druidtable" $where and name = 'logback_events_total' and "labels.namespace"='$namespace' and "labels.app"='$app' and "labels.pod" in ($pod)group by TIME_FLOOR("__time", 'PT30S'), "labels.pod", "labels.level"

kafka_producer_request_total

Общее количество отправленных запросов

graph

kafka_producer_response_total

Общее количество полученных ответов

graph

kafka_producer_node_request_rate

Количество отправленных запросов в секунду в разрезе по nodes Kafka

graph

kafka_producer_node_request_total

Общее количество отправленных запросов в разрезе по nodes Kafka

graph

kafka_producer_request_size_max

Максимальный размер отправленного запроса

graph

kafka_producer_request_latency_max

Максимальная задержка запроса в миллисекундах

graph

kafka_producer_metrics_push_success_total

Количество успешно отправленных метрик

graph

kafka_topics_get_success_total

Количество успешных попыток получения топиков Kafka

graph

unimon_sender_filters_in_cache

Количество полученных фильтров (закешированных в текущий момент)

graph

unimon_sender_metadata_buffer_size

Объем буфера метаданных

graph

unimon_sender_instances_in_cache

Количество полученных действующих подключений (закешированных в текущий момент)

graph

unimon_sender_metrics_collected_total

Количество собранных метрик

graph

unimon_sender_metrics_not_collected_total

Количество отфильтрованных метрик

graph

unimon_sender_instances_in_cache

Количество полученных действующих подключений (закешированных в текущий момент)

graph

Ошибки и сбои

kafka_producer_topic_record_error_total

Ошибки отправки сообщений в Kafka

graph

Количество отправленных записей, которые привели к ошибкам на основе метрики kafka_producer_topic_record_error_total (The total number of record sends that resulted in errors for a topic). В норме должно быть 0

Query: select TIME_FLOOR("__time", 'PT30S') as "time", LATEST("value") as " ", "labels.pod","labels.topic"from "$druidtable"$whereand name = 'kafka_producer_topic_record_error_total'and "labels.namespace"='$namespace'and "labels.app"='$app'and "labels.pod" in ($pod)–and "value"!='0'group by TIME_FLOOR("__time", 'PT30S'), "labels.pod", "labels.topic"

kafka_producer_record_error_rate

Среднее количество отправленных записей в секунду, которые привели к ошибкам

graph

kafka_producer_topic_record_error_rate

Среднее количество отправленных записей в секунду, которые привели к ошибкам в разрезе по топикам

graph

unimon_sender_get_instances_error_total

Количество ошибок при получении списка подключений

graph

unimon_sender_get_filters_errors_total

Количество ошибок при получении фильтров

graph

unimon_sender_send_metadata_errors_total

Количество ошибок при отправке метаданных

graph

unimon_metric_validation_failure_total

Количество метрик не прошедших валидацию

graph

kafka_producer_metrics_push_failure_total

Количество неуспешно отправленных метрик

graph

kafka_producer_record_error_total

Общее количество отправлено неуспешно отправленных метрик

graph

kafka_topics_get_failure_total

Количество неуспешных попыток получения топиков Kafka

graph

Для unimon-sender реализован healthcheck, который помогает определить работоспособность сервиса на текущий момент, а также работоспособность всех компонентов, с которыми взаимодействует данный сервис. Healthcheck можно использовать для геобалансировки.

При использовании ingressgateway можно получить healthcheck по endpoint:

Unimon-sender : https://{istio.geo.ingress.sender.balancer.host}/actuator/health/components

Есть два варианта проверки работоспособности:

  1. Добавить в среде контейнеризации объект Route на unimon-sender на порт 8081 и путь /actuator/health/components.

  2. Через терминал в среде контейнеризации выполнить команду:

curl http://0.0.0.0:8081/actuator/health/components

Пример ответа для автономной работы:

{
"status" : "UP",
"components" : {
"kafka-producer" : {
"status" : "UP",
"details" : {
"lastErrorsCount" : 0
}
},
"kafka-topic" : {
"status" : "UP",
"details" : {
"lastErrorsCount" : 0
}
}
}
}

Пример ответа для неавтономной работы:

{
"status" : "UP",
"components" : {
"kafka-producer" : {
"status" : "UP",
"details" : {
"lastErrorsCount" : 0
},
"kafka-topic" : {
"status" : "UP",
"details" : {
"lastErrorsCount" : 0
}
}
},
"unimon-filter" : {
"status" : "UP",
"details" : {
"lastErrorsCount" : 0
}
},
"unimon-metadata" : {
"status" : "UP",
"details" : {
"lastErrorsCount" : 0
}
},
"unimon-server" : {
"status" : "UP",
"details" : {
"lastErrorsCount" : 0
}
}
}