CollectD
collectd是一个守护(daemon)进程,用来定期收集系统和应用程序的性能指标cpu,同时提供了机制,以不同的方式来存储这些指标值。它会在系统运行和存储信息时周期性的统计系统的相关统计信息。利用这些信息有助于查找当前系统性能瓶颈(如作为性能分析 performance analysis)和预测系统未来的 load(如能力部署capacity planning)等。
collectD的基本常用使用命令
cd /etc/init.d
- ./collectd start/stop/restart
- service collectd restart
- cat /var/log/messages |grep collectd
查看collectd的日志文件操作内容
collectD以此时工作目的为准(3个步骤:配置文件和操作数据和发送数据)
cd /opt/collectd/conf.d
读取配置文件collectd.conf时会在后面自动加载这路径下的子配置文件。
- vi status.conf 创建子配置文件,输入下面两段代码。
<LoadPlugin python>
Globals true
</LoadPlugin>
这里的loadplugin将python解释器添加到collect的插件中。
<Plugin python>
ModulePath "/opt/collectd/python-plugin"
LogTraces true
Import "status"
<Module status>
URL "192.0.0.1"
# 注意这里值必须是双引号 "", 单引号会报错读不出来。值可以是多个比如
#url "127.0.1.1" "142.9.9.9"
</Module>
# 可以有多个block ,与上面对齐就行在block下面直接添加,无需加逗号。
#<Module xx>xx</Module>
#<Module xx>xx</Module>
</Plugin>
modulepath就是collectd执行数据读取的地方。这个路径下有 status.py 读取数据的脚本。并被import 导入
logtraces true 与日志有关
import status 导入status.py数据操作这个模块
Module status 这个block名和status.py名一模一样。里面的url参数名 (想传入status.py的参数)
- vi status.py爬取页面数据,代码很简单。dispatch分发到collectd里,在设置LoadPlugin network这个plugin发送数据到指定显示工具。
import collectd
import re
import urllib
IVRURL = 'http://10.10.22.1:8000'
METRICS = {}
def config(conf=None):
global URL
for c in conf.children:
URL = c.values[0]
# 注意点 1:conf就是上面配置文件里的block模块的对象。conf.children好理解一点就相当于列表[ block1,block2,block3,...] ,block数字 就是上面配置文件写的那几个块。
# c.key 配置文件block中的参数URL c.value 得到的是配置文件block中的参数值,可能有多个所以是列表。c.value[0] --->"192.0.0.1"
def transform(name):
name = re.sub("\(.*\)", "", name)
name = name.lower().strip()
name = re.sub("[^a-z0-9]+", "_", name)
return name
def read():
try:
res = urllib.urlopen(URL).read()
data = re.findall(r'<TD align=right width=50%>\n(.*?):\n</TD>\n<TD width=50%>\n(.*?)\n</TD>', res)
metrics = dict(data)
METRICS = dict([(transform(k), v) for k, v in metrics.items()])
for i in METRICS.keys():
if '(' in i:
metrics_field = re.sub(r'\(.*?\)', '', i)
METRICS[metrics_field] = METRICS.pop(i)
except Exception as e:
collectd.info(str(e))
# collectd插件的打印日志语法:collectd.error(".*")
vals = collectd.Values(type='gauge')
vals.plugin = 'status'
for k, v in METRICS.items():
try:
METRICS[k] = int(v)
except Exception as e:
METRICS.pop(k)
else:
# collectd.info("%s: %s"% (k, v))
vals.dispatch(values=[v], type_instance=k)
# 注意点 2:创建发送数据到collectd的对象:vals,collectd再通过配置的network把数据发送到指定显示工具。
# type="guage" 数据的类型,常用的还有counter,collectd内置类型(一般数值啊都是guage和counter 具体什么意思百度一下你就知道,所以代码中我把值不是数字的key删除)。你可以再collect.conf 主配置文件里查看内置类型文件的path。
# vals.plugin 当前脚本的名字
# vals.dispatch 分发数据到collectd,注意这里value必须是列表 [ ]。别问为什么不需要知道为什么。type_instance 就是key。
collectd.register_config(config)
collectd.register_read(read)
#注册这两个函数让collectd知道并运行这两个函数,发送数据到collectd。这与python的flask框架的蓝图有点相似。
- vi /etc/collectd.conf
找到你collectd的主配置文件
LoadPlugin network
<Plugin network>
<Server "www.web.com" "25826">
# 注意 改前面显示工具url就行,端口好像不需要改。具体多百度就知道。
#SecurityLevel ""
#Username ""
#Password ""
</Server>
</Plugin>
collectd 读取字配置文件导入python解释器,和import获取数据的脚本status,脚本里获取数据注册conf和注册read两个函数,conf函数获取配置文件参数,read函数dispatch分发数据到collectd。collectd收到数据发送到指定工具。