События мониторинга#
В таблице представлены варианты метрик и запросов для мониторинга модуля 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
Есть два варианта проверки работоспособности:
Добавить в среде контейнеризации объект Route на unimon-sender на порт 8081 и путь /actuator/health/components.
Через терминал в среде контейнеризации выполнить команду:
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
}
}
}