Pull to refresh

Собственные метрики в Pilot-Web

Level of difficultyMedium
Reading time4 min
Views490

Привет, друзья!

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

Мы в метрику Prometheus будем выводить количество онлайн пользователей в веб-версии. Для этого нам нужен метод GetPeople, метод IsOnline и метод для авторизации Auth/SignIn (без авторизации мы не сможем обращаться к доступным методам api), а также Node_exporter.


Node_exporter - это специальная программа, которая собирает метрические данные показателей оборудования и ОС. Но мы также можем её использовать для забора нужных нам метрик.

Теперь по порядку:

  1. Устанавливаем и запускаем 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

Tags:
Hubs:
+3
Comments0

Articles