自定义监控功能

本文档介绍了 YMatrix 中自定义监控配置的方法。此功能从 v4.8.2 开始支持。

1 背景

首先,你需要了解如何部署 Grafana 监控或者 Prometheus 监控

以本地 Grafana 监控为例(SELECT mxmgr_init_local();) 监控部署完成一两分钟后,就可以在 matrixmgr 数据库下的 local.system 表中查询到监控数据入库。

这些信息是由 telegraf 收集并通过 mxgate 插入到该表中的。telegraf 和 mxgate 进程是 mxmgr_init_local() 函数部署为后台服务的,即 supervisorctl status 命令输出所示的 mxmgr_gate_ctrlmxmgr_telegraf_ctrl 服务:

$ 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 的 Dashboard 展示集群监控的图表。

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 编写自己的 Dashboard 面板和告警项目。

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  `ip link|grep mtu|awk -F ':' '{print $2}'|grep -vE "lo|docker|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/ 下的统计信息,单独运行输出结果如下:

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. 创建 interrupt.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 测试输出。

先在 /tmp 下找到 telegraf 配置文件名:

$ 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

得到如下输出结果,可以看到我们自定义的脚本的输出已经包含在 telegraf 测试输出里:

脚本放置好后,每次 telegraf 采集系统监控信息时,就会自动执行自定义脚本并加载入库。稍等 1~2 分钟后,查询数据库 local.system 表,就可以看到入库后的自定义监控信息。

  1. 查询 category 显示比以前多出了自定义项目 net_devnet_interrupts_by_cpunet_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://<IP>:<port>/metrics 查看监控信息是否包含了自定义项目。

2.3 添加到 Grafana 面板

数据入库或进入 Prometheus 后,就可以在 Grafana Dashboard 上创建自定义的 panel,按照自己的需要设计制作可视化图表了。

此非本文中重点,因此只给出简单步骤。

这里以 非Prometheus 的用户为例,编写 SQL 语句查询监控信息:

添加图表后,可以看到我们自定义的监控信息已经以折线图可视化呈现出来:

进一步点击齿轮图标,添加告警项目: