Nightingale配置自定义监控项(exec模块)

一、配置监控目录与文件的实时大小

实现原理:脚本采集数据,通过telegraf的exec模块上报给夜莺展示

1.配置python(代码在最后)

##安装python3,有的话就跳过
[root@localhost ~]# yum -y install python3
##解压dirsize.tar.gz
[root@localhost home]# tar -zxvf dirsize.tar.gz
[root@localhost home]# cd dirsize/
[root@localhost dirsize]# ll
total 8
-rwxr-xr-x 1 root root  272 Apr 29 15:43 config.py
-rw-r--r-- 1 root root 1476 Apr 29 15:42 directory_size.py
-rwxr-xr-x 1 root root    0 Apr 29 09:55 __init__.py
drwxr-xr-x 2 root root   35 Apr 29 15:41 __pycache__
##配置采集目录与文件
[root@localhost dirsize]# vim config.py
##采集目录的绝对路径;格式:'绝对路径',结尾加"/",配置多个目录时,中间用逗号隔开
##如果你只想采集目录或文件,也可以为空,但要注意‘[]’必须要保留
Path = [
    '/home/gxslzy/', 
    '/home/mysql/',
    '/asdfas/'
]
filename = [
    '/home/dirsize/logs.log',
    '/home/gxslzy/7111-bhhc/nohup2022-05-05.out'
]
:wq #保存退出
##配置完成路径以后,运行directory_size.py(测试)
[root@localhost dirsize]# python3 directory_size.py 
filesize,directory="/home/gxslzy/" size=547754993374
filesize,directory="/home/mysql/" size=209941368
filesize,filename="/home/dirsize/logs.log" size=36506
filesize,filename="/home/gxslzy/7111-bhhc/nohup2022-05-05.out" size=25968922
#查看日志
[root@localhost dirsize]# vim logs.log
2022-04-29 16:14:35,071 - INFO: 进入初始化方法……
2022-04-29 16:14:35,071 - INFO: 初始化目录路径:['/home/gxslzy/', '/home/mysql/', '/asdfas/']
2022-04-29 16:14:35,071 - INFO: 正在计算目录大小……
2022-04-29 16:14:35,646 - WARNING: 已采集---监控项名称:filesize 采集目录:"/home/gxslzy/" 大小:547754993374kb
2022-04-29 16:14:35,653 - WARNING: 已采集---监控项名称:filesize 采集目录:"/home/mysql/" 大小:209941368kb
2022-04-29 16:14:35,654 - ERROR: 目录'/asdfas/'不存在 #如果配置了错误的目录路径,日志会抛出异常

2.配置telegraf

[root@localhost telegraf]# vim telegraf.conf
#新增
[[inputs.exec]]
  commands = ["python3 /home/dirsize/directory_size.py",] #配置运行python启动的路径
  timeout = "10s" #表示每间隔几秒执行一个脚本采集,建议不低于10秒
  name_suffix = "_exec"
  data_format = "influx"
:wq #保存退出
##重启
[root@localhost telegraf]# systemctl restart telegraf

web页面查看

常见问题:如果你重启了一段时间后,“对象视角”里迟迟没有自定义的监控项,需要重启一下n9e的server和webapi

在“即时查询”中,可以看到我们脚本采集到的目录和大小。

**值得注意的是,目录大小的单位我们采集的是kb单位,这样夜莺才能兼容展示

接下来,配置一个大盘,看下最终效果

可以看到,简单的效果就出来了,细心的朋友可以发现,默认配置好以后采取的大小和实际服务器中查看到后是有些出入的,我们可以这样优化一下大盘配置

 

如上图所示,左边的是注释,右边的单位一定要选择IEC算法类型,确保脚本算出来的值能和夜莺进行兼容同步

采集文件的方式和目录的基本相同,唯一改变的地方是PromQL中筛选的键为filename,而不是directory 

二、python代码

config.py

#!/usr/bin/python3
#!encoding=utf-8
'''
    作者:陈浩
    更新日期:2022.5.5
    名称:配置被采集的目录与文件路径
'''

#Path字段;采集目录的绝对路径,格式:'绝对路径',结尾加"/"
#filename字段;采集文件的绝对路径,格式:'文件的绝对路径'
Path = [
    '/home/deploy/forestar_bs_chenhao/',
    '/home/deploy/sclzz_lx/',
    '/usr/local/'
]

filename = [
    '/home/dirsize/logs.log',
    '/home/gxslzy/7111-bhhc/nohup2022-05-05.out'
]

directory_size.py

#!/usr/bin/python3
#!encoding=utf-8
'''
    作者:陈浩
    更新日期:2022.5.5
    名称:采集目录与文件大小
'''
import os
import re
import os.path
import logging
import config

logging.basicConfig(level=logging.DEBUG, filename=os.path.abspath(os.path.dirname(__file__)) + '/logs.log',
                    filemode='a', format='%(asctime)s - %(levelname)s: %(message)s')

class DirectorySize:
    """获取目录大小的类"""
    def __init__(self, Path, filename):
        """初始化方法"""
        self.path = Path
        self.filename = filename
        logging.info("进入初始化方法……")
        logging.info("初始化目录路径:{}".format(self.path))
        logging.info("初始化文件路径:{}".format(self.filename))

    def get_size(self):
        """获取目录大小的方法"""
        logging.info("正在计算目录大小……")
        i = []
        for i in self.path:
            if not os.path.exists(i):
                logging.error("目录'%s'不存在"%i)
            else:
                os.chdir(i)
                change = os.getcwd()
                sizes = os.popen("du -b --max-depth=0 | awk '{print $1}'")
                sizes = sizes.read().strip()
                num = int("".join(map(str, sizes)))
                logging.warning('已采集---监控项名称:filesize 采集目录:"{0}" 大小:{1}b'.format(i, num))
                print('filesize,directory="{0}" size={1}'.format(i, num))
        logging.info("采集目录完毕")

    def get_file_size(self):
        """获取文件大小的方法"""
        logging.info("正在计算文件大小……")
        i = []
        for i in self.filename:
            filepath = os.path.dirname(i)
            if not os.path.exists(filepath):
                logging.error("目录'%s'不存在"%filepath)
            else:
                filename = os.path.basename(i)
                os.chdir(filepath)
                files = os.popen("du -b %s | awk '{print $1}'"%filename)
                files = files.read().strip()
                logging.warning('已采集---监控项名称:filesize 采集文件:"{0}" 大小:{1}b'.format(filepath + '/' + filename, files))
                print('filesize,filename="{0}" size={1}'.format(filepath + '/' + filename, files))
        logging.info("采集文件完毕")

if __name__ == '__main__':
    """主程序"""
    dirsize = DirectorySize(config.Path, config.filename)
    dirsize.get_size()
    dirsize.get_file_size()

目录结构如下:

 希望能给到你帮助

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博客网友陈浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值