一、配置监控目录与文件的实时大小
实现原理:脚本采集数据,通过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()
目录结构如下:
希望能给到你帮助