Привет, друзья!
Сегодня поговорим про написание собственных метрик Pilot-Web для Prometheus. Здесь нам понадобятся методы API нашего Web'а. Запускаем devTools (F12), переходим в networks и авторизовываемся через браузер и смотрим доступные нам запросы. Из полезных это GetPeople (данные по пользователям базы), IsOnline (в сети ли пользователь в Вебе), GetOrganizationUnits (данные по организационной структуре) и другие.

Мы в метрику Prometheus будем выводить количество онлайн пользователей в веб-версии. Для этого нам нужен метод GetPeople, метод IsOnline и метод для авторизации Auth/SignIn (без авторизации мы не сможем обращаться к доступным методам api), а также Node_exporter.
Node_exporter - это специальная программа, которая собирает метрические данные показателей оборудования и ОС. Но мы также можем её использовать для забора нужных нам метрик.
Теперь по порядку:
Устанавливаем и запускаем node_exporter через юнит systemd. Основное отличие от стандартного юнита это добавление --collector.textfile.directory /tmp в ExecStart. Теперь папка /tmp будет прослушиваться нашем экспортером.
Установка:
wget https://github.com/prometheus/node_exporter/releases/download/**/node_exporter-*.tar.gz tar -xvf node_exporter-.linux-amd64.tar.gz sudo mv node_exporter-/node_exporter /usr/local/bin/
Создание юнита /etc/systemd/system/node_exporter.service:
[Unit] Description=Node Exporter Wants=network-online.target After=network-online.target [Service] User=node_exporter Group=node_exporter Type=simple ExecStart=/usr/local/bin/node_exporter --collector.textfile.directory /tmp [Install] WantedBy=multi-user.target
Запуск сервиса:
sudo systemctl daemon-reload sudo systemctl enable node_exporter sudo systemctl start node_exporter sudo systemctl status node_exporter
Проверяем запросом: curl http://localhost:9100/metrics
2. Меняем конфигурацию prometheus. Добавляем новую job_name:
scrape_configs: - job_name: 'node' file_sd_configs: - files: - "/etc/prometheus/file_sd/node_exporter.yaml"
Т.к. мы строчкой file_sd_configs сказали прометеусу что будем брать информацию о node exporter из файла, то создадим этот файл по пути, который указан /etc/prometheus/file_sd/node_exporter.yaml со следующим содержимым:
--- - targets: - IP:9100 labels: role: web-server project: pilot-web
IP - адрес сервера, где стоит node_exporter.
В labels указываем метки, по которым можем фильтровать и отрисовывать графики.
Перезапускаем prometheus. Можем проверить работоспособность нашего node_exporter перейдя по пути http://ip_prometheus:9090/targets (ip_prometheus - адрес, где стоит наш prometheus).

3.Пишем скрипт, который будет заходить к нам в Pilot-Web, авторизовываться, выдавать нам количество онлайн пользователей, авторизованных через Web и записывает это количество в файл метрик для мониторинга. Скрипт может быть написан на любом языке. Я написал на python. Кратко о скрипте:
В переменных указываем пути к файлу cookie (там будет храниться наш токен для авторизации на основе логина и пароля), директорию, которую мы указывали в node_exporter (/tmp, там node_exporter будет отслеживать появление файлов метрик), имя файла для метрик, url для авторизации и url для api. В login_data указать данные, которые используем для входа.
Далее делаем запрос на получение пользователей GetPeople и для каждого пользователя выполняем запрос на проверку статуса (онлайн/офлайн) /Person/IsOnline, тех кто онлайн записываем в список user_status. Длину этого списка записываем в файл метрик status_data.prom.
В начале можно протестировать скрипт в ide и уже потом заливать на сервер.
#!/usr/bin/python3 import requests import json COOKIE_FILE = "/tmp/cookies.txt" MAINDIR = "/tmp" METRICS = "status_data.prom" url = "https://<PILOT-WEB>/api/Auth/SignIn" url_api = "https://<PILOT-WEB>/api" login_data = { "username": "username", "password": "pass" } def load_cookies(): try: with open(COOKIE_FILE, "r") as file: return json.load(file) except (FileNotFoundError, json.JSONDecodeError): return {} response = requests.post(url, headers={"Content-Type": "application/json;charset=UTF-8"}, json=login_data, cookies={}) if response.status_code == 200: cookies = response.cookies with open(COOKIE_FILE, "w") as file: cookie_dict = {name: value for name, value in cookies.items()} json.dump(cookie_dict, file) cookie_dict2 = load_cookies() people_responce = requests.get(f"{url_api}/Metadata/GetPeople", headers={"Content-Type": "application/json;charset=UTF-8"}, cookies=cookie_dict2) if people_responce.status_code == 200: people_data = people_responce.json() user_status = [] for person in people_data: person_id = person.get("id") person_login = person.get("login") if person_id is None: continue status_response = requests.get(f"{url_api}/Person/IsOnline", params={"personId": person_id}, cookies=cookie_dict2) status_response.raise_for_status() is_online = status_response.json() if is_online == True: user_status.append({ "id": person_id, "login": person_login, "isOnline": is_online}) with open(f"{MAINDIR}/{METRICS}", "w") as file: file.write("# HELP users_online count person online\n") file.write("# TYPE users_online gauge\n") file.write(f"users_online{{host=\"web\"}} {len(user_status)}")
Заливаем скрипт на сервер, например в папку /usr/local/sbin/script_online.py делаем ему разрешение на выполнение: chmod +x /usr/local/sbin/script_online.py и закидываем в cron. Теперь скрипт у нас будет отрабатывать в то время, которое мы задали в cron.
Теперь, если перейти по адресу метрик node_exporter http://ip:9100/metrics мы увидим нашу метрику users_online

4.В Grafana подключаемся к нашему серверу prometheus (если еще не были подключены) и создаем новый дашборд. В окне создания дашборда в разделе Queries -> Code прописываем users_online{host="web"} и нажимаем Refresh. Должен отобразиться график активности наших пользователей в Web-версии. Сохраняем дашборд.

Минусы сбора метрик таким способом в Pilot-Web:
Задействуется лицензия для авторизации в Pilot-Web;
Мало методов API;
Сложность настройки;
Плюсы сбора метрик таким способом в Pilot-Web:
Возможность получать кастомные метрики в Web;
Создание метрик в базовом стеке Prometheus + Grafana
