Функция пользовательского мониторинга

Документ описывает настройку пользовательского мониторинга в YMatrix. Эта функция поддерживается начиная с версии v4.8.2.

1. Общие сведения

Прежде чем приступить, убедитесь, что вы понимаете, как развернуть мониторинг Grafana или мониторинг Prometheus.

В качестве примера рассмотрим локальный мониторинг Grafana (matrixdb@mxagent).
Через одну-две минуты после завершения развертывания мониторинга вы можете запросить данные мониторинга из таблицы local.system в базе данных matrixmgr.

Эти данные собираются telegraf и вставляются в таблицу через mxgate. Процессы telegraf и mxgate развертываются как фоновые службы с помощью функции matrixdb, как показано в выводе команды supervisorctl status:

$ supervisorctl status
Status:
        1. pc_id:{group:"mxui_collector" name:"mxui_collector"} describe:"pid 8223, uptime 2:27:36" now:1682517012 state:"Running" log_file:"/var/log/matrixdb/mxui_collector_5432.log" stdout_log_file:"/var/log/matrixdb/mxui_collector_5432.log" pid:8223
        2. pc_id:{group:"mxmgr_gate_ctrl" name:"mxmgr_gate_ctrl"} describe:"pid 10295, uptime 2:25:28" now:1682517012 state:"Running" log_file:"/var/log/matrixdb/mxmgr_gate_ctrl_5432.log" stdout_log_file:"/var/log/matrixdb/mxmgr_gate_ctrl_5432.log" pid:10295
        3. pc_id:{group:"mxmgr_telegraf_ctrl" name:"mxmgr_telegraf_ctrl"} describe:"pid 10350, uptime 2:25:26" now:1682517012 state:"Running" log_file:"/var/log/matrixdb/mxmgr_telegraf_ctrl_5432.log" stdout_log_file:"/var/log/matrixdb/mxmgr_telegraf_ctrl_5432.log" pid:10350
        4. pc_id:{group:"cylinder" name:"cylinder"} describe:"pid 6038, uptime 2:33:30" now:1682517012 state:"Running" log_file:"/var/log/matrixdb/cylinder.log" stdout_log_file:"/var/log/matrixdb/cylinder.log" pid:6038
        5. pc_id:{group:"mxui" name:"mxui"} describe:"pid 6041, uptime 2:33:30" now:1682517012 state:"Running" log_file:"/var/log/matrixdb/mxui.log" stdout_log_file:"/var/log/matrixdb/mxui.log" pid:6041

Данные, хранящиеся в таблице local.system, используются в основном для отображения диаграмм мониторинга кластера на дашбордах Grafana.

Системная информация, собираемая в таблице local.system, включает 24 категории метрик выполнения. При наличии опыта эксплуатации вы можете изучить их содержимое:

matrixmgr=# select distinct category from local.system order by 1;
   category
---------------
 cpu
 disk
 diskio
 kernel
 mem
 net
 netstat
 postgresql
 processes
 sar_cpu
 sar_cpu_util
 sar_disk
 sar_hugepages
 sar_inode
 sar_io
 sar_mem
 sar_network
 sar_paging
 sar_queue
 sar_swap
 sar_swap_util
 sar_task
 swap
 system
(24 rows)

2. Пользовательский мониторинг

Начиная с версии v4.8.2, YMatrix поддерживает пользовательский мониторинг. Вы можете определить собственные скрипты мониторинга, которые могут либо вставляться в таблицу local.system, либо отправляться в Prometheus. После успешной настройки вы сможете создавать пользовательские панели и оповещения на Grafana.

2.1 Написание пользовательских скриптов

После развертывания компонентов мониторинга пользовательские скрипты мониторинга находятся в следующей директории: /etc/matrixdb/scripts.

В этой директории содержатся:

  • monitor_bootstrap.sh
    Это точка входа для пользовательского мониторинга. Содержимое предварительно задано и не должно изменяться пользователями. Процесс telegraf периодически вызывает этот скрипт для сбора данных пользовательского мониторинга.

  • monitor_plugins/
    Эта директория предназначена для пользовательских скриптов. По соображениям безопасности только пользователь root имеет права на запись в эту директорию.

Ниже приведены два примера пользовательских скриптов мониторинга, размещённых в директории monitor_plugins/:

  1. Создайте скрипт с именем nic.sh для отображения статистики сетевых интерфейсов (NIC):
#!/bin/bash
style=grafana
#######################################################################
# NIC statistics
#######################################################################
nic_stats_output() {
    METRIC="net_dev";
    for NIC in $(ls /sys/class/net/ | grep -E 'eth|enp|ens|bond')
    do
        VAL=""
        for f in $(ls /sys/class/net/$NIC/statistics/); do
            v=$(cat /sys/class/net/$NIC/statistics/$f);
            if [ "#$style" == "#prometheus" ];then
                echo "matrixdb,device=$NIC,metric=$f $METRIC=$v"
                continue
            fi
            if [ ! -z $VAL ];then
                VAL+=","
            fi
            VAL+="$f=$v";
        done
        if [ "#$style" == "#grafana" ];then
            echo "$METRIC,device=$NIC $VAL"
        fi
    done
}
nic_stats_output

Этот скрипт выводит статистику из /sys/class/net/<NIC>/statistics/ на локальном хосте. При запуске вручную он выдаёт вывод вида:

net_dev,device=eth0 collisions=0,multicast=0,rx_bytes=54701811772,rx_compressed=0,rx_crc_errors=0,rx_dropped=0,rx_errors=0,rx_fifo_errors=0,rx_frame_errors=0,rx_length_errors=0,rx_missed_errors=0,rx_nohandler=0,rx_over_errors=0,rx_packets=328974378,tx_aborted_errors=0,tx_bytes=89613462060,tx_carrier_errors=0,tx_compressed=0,tx_dropped=0,tx_errors=0,tx_fifo_errors=0,tx_heartbeat_errors=0,tx_packets=283871697,tx_window_errors=0

Правила формата вывода скрипта: каждая строка данных должна иметь следующую структуру:

  • Первое слово — имя метрики. В приведённом примере это net_dev.
  • После первого слова может следовать список через запятую key=value тегов до первого пробела. Это метки метрики, например device=eth0.
  • После пробела идут одна или несколько пар key=value, представляющих фактические значения метрик.
  1. Создайте скрипт с именем interrupts.sh для отображения статистики аппаратных прерываний:
#!/bin/bash
style=grafana
#######################################################################
# Hardware Interrupts
#######################################################################
interrupts_output() {
    PATTERN=$(awk -F ':' '{i++; if(i>2){print $1}}' /proc/net/dev | sed 's/ //g' | tr '\n' '|' | sed 's/|$//')
    egrep "$PATTERN" /proc/interrupts | awk -v style="#$style" \
        '{ for (i=2;i<=NF-2;i++) sum[i]+=$i;}
             END {
             for (i=2;i<=NF-2; i++)
             {
                 if(style=="#prometheus"){
                     print("matrixdb,device=cpu" i-2 " net_interrupts_by_cpu="sum[i]);
                     continue;
                 }
                 val=sprintf(val "cpu" i-2 "=" sum[i]);
                       if(i!=NF-2 )
                     val=sprintf(val ",");
             }
             if(style=="#grafana")
                       print("net_interrupts_by_cpu,device=all " val)
         }'
    egrep "$PATTERN" /proc/interrupts | awk -v style="#$style" \
        '{ for (i=2;i<=NF-2; i++)
               sum+=$i;
               tags=sprintf("%s", $NF);
               if (NR!=1)
                   val=sprintf(val ",");
               val=sprintf(val tags "=" sum);

               if(style=="#prometheus"){
                   print("matrixdb,device=" $NF " net_interrupts_by_queue=" sum)
               }
               sum=0;
         } END{ if(style=="#grafana") print("net_interrupts_by_queue,device=all " val) }'
}
interrupts_output

При однократном выполнении вывод будет следующим:

net_interrupts_by_cpu,device=all cpu0=284551104,cpu1=308556439
net_interrupts_by_queue,device=all eth0-Tx-Rx-0=298072844,eth0-Tx-Rx-1=295034700

Примечание: Скрипты, размещённые в директории monitor_plugins/, должны иметь права на выполнение:

$ ls -l /etc/matrixdb/scripts/monitor_plugins/
-rwxr-xr-x 1 root root 1491 Apr 26 12:51 interrupts.sh
-rwxr-xr-x 1 root root  855 Apr 26 12:45 nic.sh

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

2.2 Проверка работоспособности скриптов

После размещения пользовательских скриптов мониторинга и проверки формата вывода вы можете протестировать их с помощью telegraf --test.

Сначала найдите файл конфигурации telegraf в директории /tmp:

$ ls -l /tmp | grep telegraf
-rw-r--r-- 1 root     root      12676 Apr 26 11:24 telegraf_5432.conf

Запустите telegraf в тестовом режиме:

$ sudo /usr/local/matrixdb/bin/telegraf --config /tmp/telegraf_5432.conf --test

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

После размещения скриптов они будут автоматически запускаться в каждом цикле сбора данных мониторинга системы. Подождите 1–2 минуты, затем выполните запрос к таблице local.system, чтобы убедиться, что данные пользовательского мониторинга были вставлены.

  1. Выполните запрос local.system, чтобы убедиться, что появились новые категории net_dev, net_interrupts_by_cpu и net_interrupts_by_queue:
matrixmgr=# SELECT distinct category FROM local.system ORDER BY 1;
        category
-------------------------
 cpu
 disk
 diskio
 kernel
 mem
 net
 net_dev
 net_interrupts_by_cpu
 net_interrupts_by_queue
 netstat
 postgresql
 processes
 sar_cpu
 sar_cpu_util
 sar_disk
 sar_hugepages
 sar_inode
 sar_io
 sar_mem
 sar_network
 sar_paging
 sar_queue
 sar_swap
 sar_swap_util
 sar_task
 swap
 system
(27 rows)

Запросите фактические собранные данные:

matrixmgr=# SELECT * FROM local.system
WHERE category IN ('net_interrupts_by_cpu', 'net_interrupts_by_queue', 'net_dev')
ORDER BY ts DESC LIMIT 10;

Вывод показывает, что данные пользовательского скрипта сохранены в виде структурированных записей, готовых для анализа:

Для пользователей Prometheus перейдите по адресу http://<prometheus-server>:9090, чтобы убедиться, что пользовательские метрики присутствуют.

2.3 Добавление в дашборд Grafana

После того как данные попали в базу данных или Prometheus, вы можете создавать пользовательские панели на дашбордах Grafana и настраивать визуализации по своему усмотрению.

Это не является основной целью данного документа, поэтому приведены только базовые шаги.

В качестве примера для пользователей, не использующих Prometheus, напишите SQL-запрос для извлечения данных мониторинга:

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

Щёлкните значок шестерёнки для настройки оповещений: