Привет, друзья!
Сегодня поговорим про написание собственных метрик 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