目录
1.node_exporter介绍
Node Exporter 是 Prometheus 官方发布的,用于采集节点的系统信息,比如 CPU,内存,磁盘和网络等信息。采用node_exporter也是为了使用其自带的自定义监控项功能。
2.下载地址
在里面可以看到各种版本的,这里的amd64就是x86-64位的,不是amd处理器的意思。
如果是arm架构的系统可以根据版本选择arm5、arm6、arm7
3. 安装
主要步骤如下:
- 创建系统级别的用户和组prometheus
- 解压安装包
- 编写启动脚本
groupadd prometheus useradd -g prometheus -m -d /var/lib/prometheus -s /sbin/nologin prometheus tar -zxvf node_exporter-1.1.0.linux-amd64.tar.gz mv node_exporter-1.1.0.linux-amd64 /usr/local/node_exporter |
编辑服务启动文件centos7可以参考
[root@suys01 ~]# more /usr/lib/systemd/system/node_exporter.service [Unit] Description=node_exporter After=network.target [Service] User=prometheus ExecStart=/usr/local/node_exporter/node_exporter --web.config=/usr/local/node_exporter/config.yml --collector.textfile.directory=/data/node_exporter [Install] WantedBy=multi-user.target [root@suys01 ~]# |
蓝色的是一行,collector.textfile.directory配置从指定文件读取监控指标信息
设置开机启动
systemctl enable node_exporter systemctl restart node_exporter |
4.自定义监控项目
1.利用参数--collector.textfile.directory配置从指定文件读取监控指标信息。
2.利用linux系统的 crontab定时任务脚本收集自定义信息写入--collector.textfile.directory指定目录下的文件,供node_exporter读取。
3.放入collector.textfile.directory指定目录的文件,后缀必须是*.prom,也就是说crontab运行结果写入文件的后缀必须是*.prom,还必须有读取权限。
4. 结果格式必须是metircs 格式
metric name {<label name>=<label value>, ...} value 主要分为三个部分 Value: metric 的数值 例如: dm_147_tablespace_total_gb{checktime="2022-03-07 09:40", name="TBS_PROD"} 2 dm_147_tablespace_total_gb: 我自定义的 147的表空间总大小单位GB checktime="2022-03-07 09:40": 取值时间 name="TBS_PROD" : 表空间名称 2: 就是 2G 表示 TBS_PROD 空间的大小 |
5.达梦数据库自定义样例
本次我只实现了几个比较简单的监控项
- "dmserver" "dmwatcher" "dmmonitor" "dmap" "dmagent" 是否存活监控
- 表空间使用率的监控(表空间大小,空闲大小,使用比例)
- 死锁监控
- session监控
- 设置系统crontab,dmdba用户执行即可
- 相关例子如下:
[dmdba@suys3 node_exporter]$ more /home/dmdba/shell/dem_shell.sh #!/bin/bash source /home/dmdba/.bash_profile filepath='/home/dmdba/node_exporter/dm_process.prom' v_date=$(date '+%Y-%m-%d %H:%M') echo "#"检查时间:$v_date >${filepath} dm_service=("dmserver" "dmwatcher" "dmmonitor" "dmap" "dmagent") for dm in ${dm_service[@]} do ps_out=`ps -ef | grep $dm | grep -v 'grep'` result=$(echo $ps_out | grep "$dm") if [[ "$result" == "" ]];then echo "${dm}_status{checktime=\"$v_date\"} 0" >> ${filepath} else echo "${dm}_status{checktime=\"$v_date\"} 1" >> ${filepath} fi done disql -s SYSDBA/SYSDBA > /tmp/tablespace.log<<EOF SET ECHO OFF SET FEEDBACK OFF SET LINESHOW OFF SET HEADING OFF SET TIMING OFF SET LINESIZE 5000 SET PAGESIZE 1000 spool /home/dmdba/node_exporter/tablespace.prom SELECT 'dm_147_tablespace_free_gb{checktime="${v_date}", name="'||F.TABLESPACE_NAME|| '"} '|| round(F.FREE_SPACE / 1024,2) as A FROM (SELECT TABLESPACE_NAME, ROUND(SUM(BLOCKS * (SELECT PARA_VALUE / 1024 FROM V\$DM_INI WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE') / 1024)) FREE_SPACE FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES / 1048576)) TOTAL_SPACE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) T WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME; SELECT 'dm_147_tablespace_total_gb{checktime="${v_date}", name="'||F.TABLESPACE_NAME|| '"} '|| round(T.TOTAL_SPACE / 1024,2) as B FROM (SELECT TABLESPACE_NAME, ROUND(SUM(BLOCKS * (SELECT PARA_VALUE / 1024 FROM V\$DM_INI WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE') / 1024)) FREE_SPACE FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES / 1048576)) TOTAL_SPACE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) T WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME; SELECT 'dm_147_tablespace_free_per{checktime="${v_date}",name="'||F.TABLESPACE_NAME|| '"} '|| (ROUND((F.FREE_SPACE / T.TOTAL_SPACE) * 100)) as C FROM (SELECT TABLESPACE_NAME, ROUND(SUM(BLOCKS * (SELECT PARA_VALUE / 1024 FROM V\$DM_INI WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE') / 1024)) FREE_SPACE FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES / 1048576)) TOTAL_SPACE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) T WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME; select 'dm_lock_count{checktime="${v_date}" } '|| count(*) from v\$lock l,sysobjects o where l.table_id=o.id and blocked=1; select 'user_sessoion{username="'||user_name||'",state="'||state||'", checktime="${v_date}"} '|| count(*) from v\$sessions group by user_name,state; spool off quit EOF [dmdba@suys3 node_exporter]$ |
注意 系统表带$的,在shell文本里面要转义,加上一个”\”
如果客户已经部署了dem,相关数据可以直接查询dem的数据,再展现处理。
6.结果文本说明
dm_147_tablespace_free_gb{checktime="2022-01-14 11:30", name="SYSTEM"} 0.14 |
表空间剩余大小 单位G, name=表空间名称 value =0.14G=140M |
dm_147_tablespace_total_gb{checktime="2022-01-14 11:30", name="TBS_PROD"} 2 |
表空间总大小 单位G name=表空间名称 value =2G |
dm_147_tablespace_free_per{checktime="2022-01-14 11:30",name="SYSTEM"} 91 |
表空间空闲率 单位% name=表空间名称 value=91 就是91% |
dm_lock_count{checktime="2022-01-17 09:10" } 0 |
查询死锁的数量 0 就是 0个死锁 |
user_sessoion{username="SYSDBA",state="ACTIVE", checktime="2022-01-17 09:10"} 1 |
用户session会话查询 username 数据库用户名 state用户会话sesssion状态 如 ACTIVE |
dmserver_status{checktime="2022-01-17 09:15"} 1 |
操作系统中数据库 dnserver 进程是否存活 1=存在 0=不存在 |
dmwather_status{checktime="2022-01-17 09:15"} 0 |
操作系统中数据库dmwather进程是否存活 1=存在 0=不存在 |
dmmonitor_status{checktime="2022-01-17 09:30"} 0 |
操作系统中数据库dmmonitor进程是否存活 1=存在 0=不存在 |
dmap_status{checktime="2022-01-17 09:30"} 1 |
操作系统中数据库dmap进程是否存活 1=存在 0=不存在 |
dmagent_status{checktime="2022-01-17 09:30"} 1 |
操作系统中dmagent进程是否存活 1=存在 0=不存在 |
发布效果如下:
后面有时间,会发一版python版本,主要是本人不太会shell解析文件,想后面解析一下mmonitor进程show命令结果,请大家关注!!!