Перейти к содержанию

Мониторинг#

Мониторинг в FaceStream реализован как отправка данных в InfluxDB и отключен по умолчанию.

В LUNA Streams есть несколько методов мониторинга:

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. См. соответствующие разделы ниже для более подробной информации об отправляемых данных.

Мониторинг FaceStream#

Включение мониторинга#

Для включения мониторинга FaceStream нужно выполнить следующие действия:

  • перейти в пользовательский интерфейс Configurator: http://<configurator_server_ip>:5070/

  • ввести "FACE_STREAM_CONFIG" в поле "Setting name" и нажать "Apply Filters"

  • включить настройку "send_data" в секции «monitoring»

  • в зависимости от значений параметров "DOCKER_INFLUXDB_INIT_BUCKET", "DOCKER_INFLUXDB_INIT_ORG", "DOCKER_INFLUXDB_INIT_ADMIN_TOKEN" задаваемых при запуске контейнера InfluxDB, указать соответствующие значения в поля "bucket", "organization" и "token" в секции «monitoring».

  • перезапустить контейнер FaceStream: docker restart facestream

Отправляемые данные#

В InfluxDB отправляются следующие элементы:

  • элемент measurements. Он равен значению fs-requests.
  • набор тегов:

    • fs_ip — IP-адрес, где развернут FaceStream
    • source — поле "name", задаваемое при создании потока в LUNA Streams (опционально)
    • stream_id — идентификатор потока
  • набор полей:

    • track_id — идентификатор трека
    • event_id — идентификатор события, полученный от LUNA PLATFORM
    • request_id — внешний идентификатор для связи с мониторингом сервисов LUNA PLATFORM
    • track_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 (опционально) — время начала работы Liveness
    • liveness_end_time (опционально) — время окончания работы Liveness
    • bestshot_count — количество отправленных лучших снимков в одном запросе в LP вместе с текущим лучшим снимком. Так, например, если было выполнено 2 отправки по 10 лучших снимков, то значение данного параметра будет равно 10, а значение параметра track_send_count равно 2
    • time_from_first_frame_to_send — время, которое прошло от появления первого кадра в FS до отправки в LP
    • track_send_count — порядковый номер отправки данных с трека

    Поля, содержащие время, отправляются в виде UTC с точностью до микросекунд.

  • элемент timestamp. Он равен времени отправки лучшего снимка или лучших снимков в микросекундах.

Частота отправки данных в InfluxDB регулируется параметром "flashing_period" настроек FaceStream.

Лучших снимков может быть несколько, т.к. отправка с одного трека одновременно считается одним измерением. Для сохранения этого измерения в InfluxDB используются данные последнего лучшего снимка из группы лучших снимков. Данные, которые уникальны для каждого лучшего снимка (track_best_shot_time, liveness_start_time, liveness_end_time) будут теряться для всех лучших снимков кроме последнего в случае такой отправки.

Если опциональные поля отсутствуют, то данные этих полей не будут отправлены в БД Influx.

При нормальной работе мониторинга, в логи FaceStream не выводится дополнительной информации. Если при мониторинге выявлена ошибка, то соответствующее сообщение появится в логах FaceStream.

Мониторинг 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 сообщения об ошибках лицензии

Просмотр данных InfluxDB#

Для просмотра данных мониторинга можно использовать интерфейс InfluxDB.

  • перейдите в пользовательский интерфейс InfluxDB <server_ip>:<influx_port>. Порт по умолчанию — 8086. Данные для входа по умолчанию — luna/password.

  • выберите вкладку Explore

  • выберите способ отображения информации в выпадающем списке (график, гистограмма, таблица и пр.)

  • выберите бакет внизу страницы

  • отфильтруйте необходимые данные

  • нажмите "Submit".

Экспорт метрик в формате 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 в официальной документации.