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

Веб-сервис Monitor для диагностики и трассировки

Monitor - веб-сервис для сбора статистики и трассировки с сервисов web с последующей передачей собранных данных потребителям, таким как prometheus и jaeger. Для передачи статистики используется протокол prometheus, в то время как для передачи трассировки используется протокол OTLP. Данный сервис может быть развёрнут как в операционной системе Windows, так и Linux.

Important

Monitor не является обязательным компонентом системы и необходим только для агрегации данных с их последующей передачей. Устанавливайте его только в том случае, если вы хотите отслеживать состояние системы с помощью счётчиков производительности или же выполнять трассировку запросов для выявления проблем производительности.

Important

Monitor предоставляет доступ к счётчикам производительности по протоколам http/https всем, у кого есть доступ по адресу /metrics. Крайне рекомендуется ограничивать доступ к методам сервиса Monitor, оставляя его только для определённых потребителей.

Установка Monitor в Windows

Выполните предварительные настройки и создание учётной записи, если эти действия не были выполнены ранее.

Important

Сервисы web и monitor используют счётчики производительности Windows для получения информации о работе сервера, например дисковой очереди. Для их корректной работы рекомендуется добавить созданную учётную запись в группу Performance Monitor Users.

В Диспетчер служб IIS создайте новый пул приложений monitor и укажите версию среды CRL .NET равную Без управляемого кода.

В качестве учётной записи укажите “tessa”. Для настройки учётной записи необходимо выбрать созданный в предыдущем пункте пул приложений и нажать Дополнительные параметры…:

В открывшемся окне в поле Удостоверение нажать на кнопку с изображением трех точек:

Выбрать Особая учетная запись, нажав на кнопку Установить… откроется окно, где необходимо указать учетную запись (в формате имя домена\имя учетной записи и пароль):

Параметр Режим запуска должен быть равен значению Всегда запущен / AlwaysRunning.

Данный режим запуска указывает IIS немедленно запустить рабочий процесс для приложения, не дожидаясь первоначального запроса к нему.

Для параметра Тайм-аут простоя (в минутах) укажите значение 0.

Тайм-аут простоя равный 0 означает, что время ожидания приложения никогда не истекает. IIS не уничтожит приложение, даже если оно не получало ни одного HTTP-запроса в течение неопределенного времени.

Убедитесь, что веб-сайт Default Web Site запущен (щелкаем правой кнопкой на сайте, далее Управление веб-сайтом → Запустить).

Создайте директорию C:\inetpub\wwwroot\tessa\monitor, если она не была создана ранее. Скопируйте в неё содержимое папки Services\monitor, которая находится в папке с основной сборкой TESSA.

Далее в диспетчере IIS вы увидите Default Web Site и вложенную в него папку tessa\monitor. Папку необходимо преобразовать в приложение через контекстное меню.

В открывшемся окне для параметра Пул приложений укажите значение monitor.

С помощью того же контекстного меню на приложении monitor выберите пункт Управление приложением → Дополнительные параметры.

В открывшемся окне для параметра Предварительная установка включена установите значение True.

Перезапустите пул приложений monitor.

Установка Monitor в Linux

Important

Сервисы web и monitor используют программу iostat для получения информации о работе сервера, например дисковой очереди. Для их корректной работы рекомендуется установить её.

Настройка службы monitor для systemd

Создайте конфигурационный файл веб-сервиса и откройте его на редактирование, используя команду в терминале:

sudo nano /etc/systemd/system/monitor.service

Скопируйте следующий текст:

[Unit] Description=Syntellect TESSA Monitor

[Service] WorkingDirectory=/home/tessa/tessa/monitor ExecStart=/home/tessa/tessa/monitor/Tessa.Monitor 5200 Restart=always RestartSec=10 SyslogIdentifier=monitor User=tessa UMask=002 Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install] WantedBy=multi-user.target

Закройте редактор с сохранением изменений.

Tip

Строка WorkingDirectory содержит путь до папки с веб-сервисом. Строка ExecStart должна содержать тот же путь вместе с именем исполняемого файла Tessa.Monitor.

Настройте автозапуск веб-сервиса и запустите его, выполнив команду в терминале:

sudo systemctl enable monitor && sudo systemctl start monitor

Tip

Здесь monitor соответствует имени сервиса monitor.service без расширения .service.

Проверьте, что сервис успешно запущен, выполнив команду:

sudo systemctl status monitor

Если всё корректно, то рядом с именем сервиса будет выведен зелёный кружок.

Если режим просмотра статуса не закрылся сам, закройте его нажатием кнопки Q.

Tip

Если позже вы измените файл сервиса .service, то сначала выполните команду sudo systemctl daemon-reload и затем перезапустите изменённый сервис sudo systemctl restart monitor.

Tip

Посмотреть сообщения журнала по всем запущенным службам можно, выполнив команду: sudo journalctl -xe.

Настройка службы monitor для systemv

sudo nano /etc/init.d/monitor

Скопируйте следующий текст:

#!/bin/sh ### BEGIN INIT INFO # Provides: monitor # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Stop/start monitor ### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

if [ -L $0 ]; then SCRIPTNAME=`/bin/readlink -f $0` else SCRIPTNAME=$0 fi

NAME="monitor" DAEMONUSER="tessa" DAEMONDIR="/home/$DAEMONUSER/tessa/monitor" DAEMON="$DAEMONDIR/monitor" DAEMON_ARGS="5200" LOGDIR="/home/$DAEMONUSER/tessa/logs/" LOGFILE="$LOGDIR/monitor.log" PIDFILE="/var/run/monitor.pid"

# Exit if the package is not installed [ -x "$DAEMON" ] || exit 0

. /lib/init/vars.sh

. /lib/lsb/init-functions

do_start() { log_daemon_msg "Starging system $NAME daemon" su - $DAEMONUSER -c "mkdir -p '$LOGDIR'" su - $DAEMONUSER -c "rm -f '$LOGFILE'" start-stop-daemon --start --name "$NAME" --user $DAEMONUSER \ --background --make-pidfile --pidfile "$PIDFILE" \ --stdout "$LOGFILE" --stderr "$LOGFILE" \ --chdir "$DAEMONDIR" \ --exec "$DAEMON" -- $DAEMON_ARGS RETVAL="$?" log_end_msg $? return "$RETVAL" }

do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred log_daemon_msg "Stopping system $NAME daemon" start-stop-daemon --stop --quiet --oknodo --retry=5 --pidfile "$PIDFILE" RETVAL="$?" log_daemon_msg $? rm -f $PIDFILE return "$RETVAL" }

case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting " "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping " "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; restart) log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; status) status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $? ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|status}" >&2 exit 3 ;; esac

exit $RETVAL

Закройте редактор с сохранением изменений.

Important

Переменные скрипта DAEMONUSER, DAEMONDIR, LOGDIR зависят от установки monitor. В случае необходимости запуска от другого пользователя укажите его имя в DAEMONUSER. В случае установки monitor в директорию, отличную от /home/$DAEMONUSER/tessa/, измените переменные DAEMONDIR, LOGDIR таким образом, чтобы они соответствовали директории установки monitor.

Important

Ознакомьтесь с документацией start-stop-daemon для вашей операционной системы. В некоторых версиях вместо двух аргументов --stdout и --stderr используется один --output. В этом случае скорректируйте соответствующую часть функции do_start (--stdout "$LOGFILE" --stderr "$LOGFILE" замените на --output "$LOGFILE").

Задайте права на исполнение данного сервиса.

sudo chmod 755 /etc/init.d/monitor

Добавьте сервис в автозапуск.

  • Наиболее надёжный способ:

    sudo ln -s /etc/init.d/monitor /etc/rc0.d/S01monitor

  • Если доступна команда chkconfig:

    sudo chkconfig --add /etc/init.d/monitor

  • Если доступна команда update-rc.d:

    sudo update-rc.d monitor defaults

  • Если доступна команда rc-update:

    sudo rc-update add monitor default

Запустите сервис, выполнив команду:

sudo service monitor start

Проверьте, что сервис успешно запущен, выполнив команду:

sudo service monitor status

Описание работы веб-сервиса Monitor

При запуске, сервис monitor начинает слушать порт 5100 на входящие подключения от сервисов web. После установления подключения, monitor каждую секунд отправляет запрос на актуализацию счётчиков производительности каждому подключенному сервису web. В то же время он постоянно принимает данные трассировки, которые пересылаются согласно настройкам app.json с использованием протокола OTLP. Счётчики производительности же отдаётся при обращении по адресу /metrics с использованием протокола prometheus.

Important

Передача данных между сервисами web и monitor не защищена шифрованием. Крайне рекомендуется устанавливать сервис monitor на одном сервере с сервисами web (в случае, если используется несколько серверов, то устанавливайте по одному сервису monitor на каждый сервер) для повышения производительности и безопасности.

Конфигурационные параметры app.json

  • Параметр:

    "TracingHost": "localhost"

    Адрес, используемый для передачи трассировки. В качестве допустимых адресов возможно указать localhost, IP-адрес или DNS-имя серверов. По умолчанию localhost.

  • Параметр:

    "TracingPort": 4317

    Порт, используемый для передачи трассировки. По умолчанию указан порт 4317, используемый для протокола gRPC.

  • Параметр:

    "TracingProtocol": "Grpc"

    Протокол, используемый для передачи трассировки. Поддерживаются значения gRPC и HttpProtobuf (HTTP с использованием protobuf). По умолчанию Grpc.

  • Параметр:

    "EnableUnrestrictedAccess": false

    Определяет, должен ли сервис monitor принимать входящие подключения со всех сетевых интерфейсов. По умолчанию отключён. Не рекомендуется включать кроме случаев, когда сервис monitor и сервисы web расположены на разных серверах.

Трассировка серверов приложений

Для трассировки запросов к серверам приложений используется API .NET ActivitySource. Данные трассировки передаются в monitor, который передаёт их по протоколу OTLP через gRPC/HTTP потребителям. Так, можно передавать данные напрямую (например, в Jaeger), или же через специальные процессоры (OpenTelemetry Collector), которые позволяют отфильтровать трассировку или преобразовать её в другой формат для потребителя.

Список имён доступных источников трассировок:

Имя Группа Описание
Tessa.Web.OpenTelemetry.SqlClient Queries Трассировка всех SQL запросов, проходящих через провайдер для СУБД Microsoft SQL Server
Npgsql Queries Трассировка всех SQL запросов, проходящих через провайдер для СУБД PostgreSQL
CardRepository Cards Трассировка всех операций с карточками и универсальных запросов к сервису карточек
CardNewComponent Cards Трассировка всех операций создания карточек
CardGetComponent Cards Трассировка всех операций получения карточек
CardStoreComponent Cards Трассировка всех операций сохранения карточек
CardDeleteComponent Cards Трассировка всех операций удаления карточек
ActivityExtensionTraceListener Extensions Трассировка всех операций, производимых в серверных расширениях работы с карточками
ViewQueryExecutor Views Трассировка выполнения SQL запросов представлений.
Сюда не входит трассировка по выполнению программных представлений и перехватчиков любых представлений
WorkflowEngine Processes Трассировка обработки сигнала процесса WorkflowEngine
GetContentByLink ContentByLink Трассировка выполнения запросов на получение контента по ссылке

Note

Предпочтительнее использовать группу, если не требуется детально разделять источник возникновения события. Например, включите трассировку представлений с указанием группы Views вместо имени ViewQueryExecutor.

Note

Для написания своей трассировки обратитесь к документации .NET или же к “Руководству разработчика” к разделу Добавление трассировки обработки запросов и счётчиков производительности на сервере.

По умолчанию трассировка запросов в TESSA отключена. Для включения трассировки обратитесь к документации по Командам управления компонентами.

Диагностика серверов приложений

Для диагностики состояния серверов приложений используется API .NET Meter. Данные этих счётчиков передаются в monitor, который отдаёт их по протоколу prometheus при обращении по адресу /metrics. Далее, по данным этих счётчиков можно настраивать предупреждения в prometheus (например, при превышении пороговых значений потребления памяти) или же строить графики в grafana.

TESSA собирает данные со счётчиков .NET Runtime и AspNetCore, SqlClient, Npgsql. Также, TESSA собирает данные со своих счётчиков, таких как:

Название Описание Тэги
total-get-requests Количество запросов на получение карточки (учитываются как внутренние, так и внешние запросы) CardTypeID - идентификатор типа запрашиваемой карточки или Guid.Empty если он неизвестен
current-get-requests Количество запросов на получение карточки в данный момент (учитываются как внутренние, так и внешние запросы) Отсутствуют
total-store-requests Количество запросов на сохранение карточки (учитываются как внутренние, так и внешние запросы) CardTypeID - идентификатор типа сохраняемой карточки или Guid.Empty если он неизвестен
current-store-requests Количество запросов на сохранение карточки в данный момент (учитываются как внутренние, так и внешние запросы) Отсутствуют
total-new-requests Количество запросов на получение объекта новой карточки (учитываются как внутренние, так и внешние запросы) CardTypeID - идентификатор типа карточки или Guid.Empty если он неизвестен
current-new-requests Количество запросов на получение объекта новой карточки в данный момент (учитываются как внутренние, так и внешние запросы) Отсутствуют
total-delete-requests Количество запросов на удаление карточки (учитываются как внутренние, так и внешние запросы) CardTypeID - идентификатор типа удаляемой карточки или Guid.Empty если он неизвестен
current-delete-requests Количество запросов на удаление карточки в данный момент (учитываются как внутренние, так и внешние запросы) Отсутствуют
total-card-requests Количество универсальных запросов (учитываются как внутренние, так и внешние запросы) RequestType - идентификатор типа запроса или Guid.Empty если он неизвестен
current-card-requests Количество универсальных запросов в данный момент (учитываются как внутренние, так и внешние запросы) Отсутствуют
total-view-requests Количество запросов на получение данных из представлений (учитываются как внутренние, так и внешние запросы) ViewAlias - название представления
current-view-requests Количество запросов на получение данных из представлений в данный момент (учитываются как внутренние, так и внешние запросы) Отсутствуют
total-content-by-link-requests Количество запросов на получение контента по ссылке ContentType - тип запрашиваемого контента
total-content-by-link-requests-duration Суммарное время выполнения запросов на получение контента по ссылке в миллисекундах ContentType - тип запрашиваемого контента
current-content-by-link-requests Количество запросов на получение контента по ссылке в данный момент ContentType - тип запрашиваемого контента

Note

Для написания своих счётчиков обратитесь к документации .NET или же к “Руководству разработчика” к разделу Добавление трассировки обработки запросов и счётчиков производительности на сервере.

Back to top