自定义监控功能
本文档介绍了 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_ctrl
和 mxmgr_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/
目录下:
- 创建
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
对,内容为具体监控的值
-
创建
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
表,就可以看到入库后的自定义监控信息。
- 查询
category
显示比以前多出了自定义项目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://<IP>:<port>/metrics
查看监控信息是否包含了自定义项目。
2.3 添加到 Grafana 面板
数据入库或进入 Prometheus 后,就可以在 Grafana Dashboard 上创建自定义的 panel,按照自己的需要设计制作可视化图表了。
此非本文中重点,因此只给出简单步骤。
这里以 非Prometheus 的用户为例,编写 SQL 语句查询监控信息:
添加图表后,可以看到我们自定义的监控信息已经以折线图可视化呈现出来:
进一步点击齿轮图标,添加告警项目: