赞
踩
实现原理:脚本采集数据,通过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()
目录结构如下:
希望能给到你帮助
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。