Мониторинг#
В данном разделе описаны возможности мониторинга для FaceStream и LUNA Streams.
Содержание раздела:
1․ Общая информация — описание доступных систем мониторинга и их особенностей, конфигурация InfluxDB и ClickHouse
2․ Мониторинг FaceStream — включение мониторинга и описание отправляемых данных
3․ Мониторинг LUNA Streams — отправляемые данные и экспорт метрик в формате Prometheus
Общая информация#
Мониторинг — это функционал, который позволяет собирать, хранить и анализировать данные о работе систем, что помогает в диагностике, оптимизации и обеспечении стабильности.
Мониторинг в FaceStream отключен по умолчанию и реализован как:
В LUNA Streams есть несколько методов мониторинга:
- Отправка данных в InfluxDB (включен по умолчанию)
- Отправка данных в ClickHouse
- Экспорт метрик в формате Prometheus через ресурс
/metrics(отключен по умолчанию)
При выборе между базами данных рекомендуется изучить документацию Influx и Clickhouse.
На текущий момент в LUNA Streams по умолчанию используется InfluxDB (в будущих версиях ClickHouse станет БД мониторинга по умолчанию, т.к. превосходит InfluxDB по производительности и аналитическим возможностям, особенно в условиях высоких нагрузок).
Далее описаны основные моменты при работе с БД InfluxDB и ClickHouse.
InfluxDB#
Для работы с InfluxDB необходимо зарегистрироваться с помощью логина и пароля и указать имя бакета, имя организации и токен. Все эти данные задаются при запуске контейнера InfluxDB с помощью переменных окружения.
Для того, чтобы использовать мониторинг FaceStream или LUNA Streams, необходимо в настройках FaceStream или настройках LUNA Streams задать для полей "bucket", "organization", "token" точно такие же данные, которые указывались при запуске контейнера InfluxDB. Так, например, если при запуске контейнера InfluxDB использовались следующие настройки...:
-e DOCKER_INFLUXDB_INIT_BUCKET=luna_monitoring \
-e DOCKER_INFLUXDB_INIT_USERNAME=luna \
-e DOCKER_INFLUXDB_INIT_PASSWORD=password \
-e DOCKER_INFLUXDB_INIT_ORG=luna \
-e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=kofqt4Pfqjn6o \
... то в настройках FaceStream или LUNA Streams должны быть указаны следующие параметры:
"influxdb": {
"organization": "luna",
"token": "kofqt4Pfqjn6o",
"bucket": "luna_monitoring",
Логин и пароль используются для доступа к пользовательскому интерфейсу InfluxDB.
Настройки FaceStream и LUNA Streams содержат разные данные полей "bucket", "organization" и "token" по умолчанию. Если необходимо использовать мониторинг для обоих сервисов, то нужно задать одинаковые настройки. При необходимости можно сохранять данные FaceStream и LUNA Streams в разные бакеты (см. ниже).
Для того, чтобы разделить данные мониторинга FaceStream и LUNA Streams, можно создать отдельные бакеты после запуска контейнера InfluxDB. Это можно сделать с помощью одного из следующих способов:
- с помощью пользовательского интерфейса InfluxDB (вкладка Explore > Create bucket) после старта контейнера InfluxDB
- с помощью команды
influx bucket create -n <bucket_name> -o <organization_name>в InfluxCLI после старта контейнера InfluxDB
Обратите внимание, что имя организации должно быть таким же, как при создании контейнера InfluxDB.
Отправляемые данные в InfluxDB отличаются для LUNA Streams и FaceStream. См. соответствующие разделы ниже для более подробной информации об отправляемых данных.
Просмотр данных InfluxDB#
Для просмотра данных мониторинга можно использовать интерфейс InfluxDB.
-
перейдите в пользовательский интерфейс InfluxDB
<server_ip>:<influx_port>. Порт по умолчанию — 8086. Данные для входа по умолчанию — luna/password. -
выберите вкладку Explore
-
выберите способ отображения информации в выпадающем списке (график, гистограмма, таблица и пр.)
-
выберите бакет внизу страницы
-
отфильтруйте необходимые данные
-
нажмите "Submit".
ClickHouse#
В качестве альтернативы InfluxDB для мониторинга FaceStream и LUNA Streams можно использовать БД ClickHouse.
ClickHouse — это колоночная СУБД, где данные хранятся не строками, а столбцами. Это позволяет быстро читать и агрегировать данные только по нужным колонкам, минуя обработку всей строки. См. документацию ClickHouse.
Для того, чтобы использовать мониторинг FaceStream или LUNA Streams, необходимо в настройках FaceStream или настройках LUNA Streams задать для полей "db_user", "db_password" точно такие же данные, которые указывались при запуске контейнера ClickHouse. Так, например, если при запуске контейнера ClickHouse использовались следующие настройки...:
-e CLICKHOUSE_USER=luna \
-e CLICKHOUSE_PASSWORD=password \
... то в настройках FaceStream или LUNA Streams должны быть указаны следующие параметры:
{
"storage_type": "clickhouse",
"db_user": "luna",
"db_password": "password",
}
По умолчанию в настройках FaceStream и настройках LUNA Streams указан адрес 127.0.0.1, что означает, что ClickHouse развёрнут на том же сервере, что и сервис LUNA Configurator. Для использования удалённого сервера с ClickHouse необходимо изменить параметры host, port и http_port.
Партиционирование данных в ClickHouse
Для оптимизации производительности таблицы мониторинга в ClickHouse автоматически партиционируются по дням. Это обеспечивает:
- ускорение выполнения запросов (за счет уменьшения объема сканируемых данных)
- эффективное управление данными (возможность работы с отдельными временными интервалами)
- оптимизацию операций очистки устаревших данных
Просмотр данных ClickHouse#
Для визуализации данных мониторинга из ClickHouse используется платформа Grafana. Для её работы требуются настроенные дашборды.
В качестве готового решения можно использовать инструмент "LUNA Dashboards", который включает в себя Grafana и набор необходимых дашбордов.
Подробную информацию см. в разделе "Мониторинг" руководства администратора LUNA PLATFORM 5.
Мониторинг FaceStream#
Включение мониторинга#
Для включения мониторинга FaceStream нужно выполнить следующие действия:
-
перейти в пользовательский интерфейс Configurator:
http://<configurator_server_ip>:5070/ -
ввести "FACE_STREAM_CONFIG" в поле "Setting name" и нажать "Apply Filters"
-
включить настройку "send_data" и выбрать тип хранения данных для мониторинга "storage_type" в секции "monitoring"
-
в зависимости от выбранного типа хранения данных (InfluxDB или ClickHouse), укажите соответствующие значения в секции "monitoring":
- для InfluxDB — в подсекции influxdb:
bucket,organization,token— значения должны соответствовать параметрам "DOCKER_INFLUXDB_INIT_BUCKET", "DOCKER_INFLUXDB_INIT_ORG", "DOCKER_INFLUXDB_INIT_ADMIN_TOKEN", заданным при запуске контейнера InfluxDB - для ClickHouse — в подсекции clickhouse:
db_user,db_password— значения должны соответствовать параметрам "CLICKHOUSE_USER" и "CLICKHOUSE_PASSWORD", заданным при запуске контейнера ClickHouse
- для InfluxDB — в подсекции influxdb:
-
перезапустить контейнер FaceStream:
docker restart facestream
Отправляемые данные в InfluxDB#
В InfluxDB отправляются следующие элементы:
- элемент
measurements. Он равен значениюfs-requests. -
набор тегов:
fs_ip— IP-адрес, где развернут FaceStreamsource— поле "name", задаваемое при создании потока в LUNA Streams (опционально)stream_id— идентификатор потока
-
набор полей:
track_id— идентификатор трекаevent_id— идентификатор события, полученный от LUNA PLATFORMrequest_id— внешний идентификатор для связи с мониторингом сервисов LUNA PLATFORMtrack_start_time— время начала трекаtrack_best_shot_time— время, когда кадр с отправляемым лучшим снимком появился в системеtrack_best_shot_min_size_time(опционально) — время, когда размер детекции достиг значения, заданного в параметре "best_shot_min_size"track_best_shot_proper_size_time(опционально) — время, когда размер детекции достиг значения, заданного в параметре "best_shot_proper_size"liveness_start_time(опционально) — время начала работы Livenessliveness_end_time(опционально) — время окончания работы Livenessbestshot_count— количество отправленных лучших снимков в одном запросе в LP вместе с текущим лучшим снимком. Так, например, если было выполнено 2 отправки по 10 лучших снимков, то значение данного параметра будет равно 10, а значение параметраtrack_send_countравно 2time_from_first_frame_to_send— время, которое прошло от появления первого кадра в FS до отправки в LPtrack_send_count— порядковый номер отправки данных с трека
Поля, содержащие время, отправляются в виде UTC с точностью до микросекунд.
-
элемент
timestamp. Он равен времени отправки лучшего снимка или лучших снимков в микросекундах.
Частота отправки данных в InfluxDB регулируется параметром "flushing_period" настроек FaceStream.
Лучших снимков может быть несколько, т.к. отправка с одного трека одновременно считается одним измерением. Для сохранения этого измерения в InfluxDB используются данные последнего лучшего снимка из группы лучших снимков. Данные, которые уникальны для каждого лучшего снимка (
track_best_shot_time,liveness_start_time,liveness_end_time) будут теряться для всех лучших снимков кроме последнего в случае такой отправки.
Если опциональные поля отсутствуют, то данные этих полей не будут отправлены в БД Influx.
При нормальной работе мониторинга, в логи FaceStream не выводится дополнительной информации. Если при мониторинге выявлена ошибка, то соответствующее сообщение появится в логах FaceStream.
Отправляемые данные в ClickHouse#
В ClickHouse данные отправляются в формате JSON в таблицу fs_requests базы данных, указанной в параметре db_name.
В отличие от InfluxDB, где данные делятся на теги и поля, ClickHouse использует единую табличную структуру с поддержкой JSON. Каждое событие представлено записью, где:
time— временная метка создания записи;data— данные с информацией о событии в JSON-формате, которая в противном случае была бы распределена по тегам и полям в InfluxDB. Содержание полей внутриdataидентичны тегам и полям, отправляемых в InfluxDB (см. их описание выше в Отправляемые данные в InfluxDB).
Пример содержимого поля data:
{
"fs_ip": "127.0.0.1",
"source": "main_stream",
"stream_id": "b5d6fd45-fcca-453d-ac05-3e594054b813",
"track_id": "8d57654a-3905-4326-8db6-dcf8000000a3",
"event_id": "f9687459-986b-406d-9c1f-0d6289be5256",
"request_id": "1536751345,6a5c2191-3e9b-f5a4-fc45-3abf43625c5f",
"track_start_time": 1705314645123456,
"track_best_shot_time": 1705314645123456,
"bestshot_count": 10,
"time_from_first_frame_to_send": 150,
"track_send_count": 2
}
Опциональные поля, которые могут быть включены в поле data:
track_best_shot_min_size_timeиtrack_best_shot_proper_size_time— отправляются, если в настройках потока включен параметрprimary_track_policy.liveness_start_timeиliveness_end_time— отправляются, если в настройках потока включенliveness.
При отправке нескольких лучших снимков с одного трека уникальные данные для каждого снимка (
track_best_shot_time,liveness_start_time,liveness_end_time) сохраняются только для последнего снимка в группе.
Мониторинг LUNA Streams#
Отправляемые данные в InfluxDB#
Мониторинг возможен для двух типов событий: запрос (все запросы) и ошибка (только неудавшиеся запросы).
Каждое событие — это точка временного ряда. Для сервиса API точка представлена с использованием следующих данных:
- тип события (запросы или ошибки)
- отметка времени начала запроса
- теги
- поля
Для других сервисов набор типов событий может отличаться. Например, сервис Handlers также собирает данные об использовании SDK, выполненных оценках и лицензировании.
Тег — это индексированные данные в хранилище. Он представлен в виде словаря, где
- keys — имена тегов (строка),
- values — строка, целое число или число с плавающей запятой.
Поле представляет собой неиндексированные данные в хранилище. Оно представлено в виде словаря, где
- keys — имена полей (строка),
- values — строка, целое число или число с плавающей запятой.
Сохранение данных для серии запросов запускается при каждом запросе. Каждая точка содержит данные о соответствующем запросе (время выполнения и т.д.).
- теги
| Имя тега | Описание |
|---|---|
| service | сервис, всегда "luna-streams" |
| route | объединение метода запроса и ресурса запроса (POST:/streams) |
| status_code | HTTP статус код ответа |
- поля
| Имя поля | Описание |
|---|---|
| request_id | идентификатор запроса |
| execution_time | время выполнения запроса |
Сохранение данных для серии ошибок запускается при сбое запроса. Каждая точка содержит error_code ошибки LUNA.
- теги
| Имя тега | Описание |
|---|---|
| service | сервис, всегда "luna-streams" |
| route | объединение метода запроса и ресурса запроса (POST:/streams) |
| status_code | HTTP статус код ответа |
| error_code | код ошибки LUNA PLATFORM |
- поля
| Имя поля | Описание |
|---|---|
| request_id | идентификатор запроса |
Сохранение данных для серии лицензирования запускается при старте сервиса и каждые 60 секунд. Каждая точка содержит данные проверки лицензии.
- теги
| Имя тега | Описание |
|---|---|
| service | сервис, всегда "luna-streams" |
| license_status | статус лицензии ("ok", "warning", "error", "exception") |
- поля
| Имя поля | Описание |
|---|---|
| license_streams_limit_rate | процент использованных запросов |
| warnings | предупреждающие сообщения о лицензии |
| errors | сообщения об ошибках лицензии |
Отправляемые данные в ClickHouse#
Мониторинг возможен для двух типов событий: запрос (все запросы) и ошибка (только неудавшиеся запросы).
В отличие от InfluxDB, где данные делятся на теги и поля, ClickHouse использует единую табличную структуру с поддержкой JSON. Каждое событие представлено записью, где:
time— временная метка создания записи;data— данные с информацией о событии в JSON-формате, которая в противном случае была бы распределена по тегам и полям в InfluxDB.
Сохранение данных мониторинга выполняется для каждого обрабатываемого запроса. Каждая запись содержит информацию о соответствующем запросе (время выполнения и др.). Пример содержимого поля data:
{
"service": "luna-streams",
"route": "POST:/streams",
"status_code": 200,
"request_id": "1536751345,6a5c2191-3e9b-f5a4-fc45-3abf43625c5f",
"execution_time": 123.45
}
Сохранение данных для ошибок запускается при сбое запроса. Каждая запись содержит error_code ошибки LUNA Streams.
{
"service": "luna-streams",
"route": "POST:/streams",
"status_code": 400,
"error_code": 12022,
"request_id": "1536751345,6a5c2191-3e9b-f5a4-fc45-3abf43625c5f"
}
Сохранение данных для лицензирования запускается при старте сервиса и каждые 60 секунд. Каждая запись содержит данные проверки лицензии.
{
"service": "luna-streams",
"license_status": "error",
"license_streams_limit_rate": 120,
"errors": "License limit exceeded: 120.0 % of the available license limit is used. Please contact VisionLabs for license upgrade or delete redundant streams."
}
Экспорт метрик в формате Prometheus#
Сервис LUNA Streams может собирать и сохранять метрики в формате Prometheus в виде данных временных рядов, которые можно использовать для отслеживания поведения сервиса. Метрики могут быть интегрированы в систему мониторинга Prometheus для отслеживания производительности. См. официальную документацию Prometheus для подробной информации.
По умолчанию сбор метрик отключен. Сбор метрик включается в группе параметров "LUNA_SERVICE_METRICS".
Обратите внимание, что все данные метрик сбрасываются при завершении работы сервиса.
Тип метрик#
Доступно два типа метрик:
- счетчики, которые увеличиваются с каждым событием
- кумулятивные гистограммы, которые используются для измерения распределения продолжительности или размера событий
Кумулятивная гистограмма — это отображение, которое подсчитывает совокупное количество наблюдений во всех интервалах до указанного интервала. См. описание в Wikipedia.
Доступны следующие метрики типа счетчики:
request_count_total— общее количество запросовerrors_count_total— общее количество ошибок
Каждый из них имеет как минимум два лейбла для сортировки:
status_code(илиerror_codeдля метрик ошибок)path— путь, состоящий из метода запроса и маршрута конечной точки
Лейблы представляют собой ключевые пары, состоящие из имени и значения, которые присваиваются метрикам.
При необходимости можно добавить пользовательские типы лейблов, указав пару label_name=label_value в параметре "extra_labels".
Обратите внимание, что пара
label_name=label_valueбудет добавлена к каждому сервису LUNA PLATFORM.
Специальный менеджер распределяет все запросы, проходящие через сервис, среди счетчиков, используя эти метки. Это обеспечивает, что два успешных запроса, отправленных на разные конечные точки или на одну конечную точку, но с разными кодами состояния, будут доставлены к различным метрикам.
Неудачные запросы распределяются по метрикам
request_count_totalиrequest_errors_total.
Метрика requests типа кумулятивные гистограммы отслеживает длительность запросов к сервису. Для гистограммы определяются следующие интервалы (бакеты), в которые попадают измерения:
- 0.0001
- 0.00025
- 0.0005
- 0.001
- 0.0025
- 0.005
- 0.01
- 0.025
- 0.05
- 0.075
- 0.1
- 0.25
- 0.5
- 0.75
- 1.0
- 2.5
- 5.0
- 7.5
- 10.0
- Inf
Таким образом диапазон времени запроса может быть разбит на несколько интервалов, начиная от очень быстрых запросов (0.0001 секунды) до очень долгих (Inf - бесконечность). У гистограмм также есть метки для классификации данных, такие как status_code для статуса запроса или route для указания маршрута запроса.
Примеры
Если отправить один запрос в ресурс /healthcheck, за которым последуют три запроса в ресурс /docs/spec, один из которых будет перенаправлен (код состояния ответа 301), то при выполнении запроса к ресурсу /metrics, в теле ответа будет выдан следующий результат:
# HELP request_count_total Counter of requests
# TYPE request_count_total counter
request_count_total{path="GET:/docs/spec",status_code="200"} 2.0
request_count_total{path="GET:/docs/spec",status_code="301"} 1.0
request_count_total{path="GET:/healthcheck",status_code="200"} 1.0
Если отправить один неверный POST-запрос к ресурсу /streams, то при выполнении запроса к ресурсу /metrics, в теле ответа будет выдан следующий результат:
# HELP request_count_total Counter of requests
# TYPE request_count_total counter
request_count_total{path="POST:/streams",status_code="401"} 1.0
# HELP request_errors_total Counter of request errors
# TYPE request_errors_total counter
request_errors_total{error_code="12010",path="POST:/streams"} 1.0
# HELP requests Histogram of request time metrics
# TYPE requests histogram
requests_sum{route="GET:/docs/spec",status_code="200"} 0.003174567842297907
requests_bucket{le="0.0001",route="GET:/docs/spec",status_code="200"} 0.0
requests_bucket{le="0.00025",route="GET:/docs/spec",status_code="200"} 0.0
requests_bucket{le="0.0005",route="GET:/docs/spec",status_code="200"} 0.0
requests_bucket{le="0.001",route="GET:/docs/spec",status_code="200"} 1.0
...
requests_count{route="GET:/docs/spec",status_code="200"} 2.0
requests_sum{route="GET:/docs/spec",status_code="301"} 0.002381476051209132
Настройка сбора метрик для Prometheus#
Prometheus необходимо настроить на сбор метрик LUNA PLATFORM.
Пример конфигурации Prometheus для сбора метрик сервисов LP:
- job_name: "luna-streams"
static_configs:
- targets: ["127.0.0.1:5160"]
...
- job_name: "luna-configurator"
static_configs:
- targets: ["127.0.0.1:5070"]
См. пример запуска Prometheus в официальной документации.