在RHEL7+浪潮NX560T集群上部署collectd+graphite监控遇到了好多坑。特此记录
部署collectd
1.找不到预编译的二进制包,只能从官方下载源码编译了。按官方说明编译会自动安装到/opt/collectd中。然后按网上的说明将源码目录下的启动文件拷贝到系统目录下
cp contrib/redhat/init.d-collectd /etc/init.d/collectd
然后systemctl restart collectd并不行。因为这个文件里面的配置信息不对Orz。vim这个文件把对应配置信息指向/opt/collectd中。然后出现了权限问题Orz。
最后手动执行/opt/collectd/sbin/collectd启动colletcd。每次重启都要先ps然后手动kill然后再执行/opt/collectd/sbin/collectd
2.colletcd的配置文件被装到了/opt/collectd/etc/collectd.conf里面。启动colletcd前先要编写配置文件。每次修改配置文件都要重启collectd。
3.配置文件中Hostname和Interval要打开,然后所有的字符值都要用“”包围。另外我的AutoLoadPlugin设置为True并不会有效果。这个坑de了半天。
4.write_graphite中配置选项中prefix和postfix不用打开。打开之后graphite中机器的名字就变成了prefix+hostname+postfix贼长又没啥用。
部署graphite
1.直接用docker部署,倒是没有什么问题。不过不知道为什么colletcd不能找到graphite,要手动重启一下collectd。这个镜像没有把数据保存到宿主机,容器挂了数据就没了OTZ
docker run -d --name graphite --restart=always -p 18081:80 -p 2003-2004:2003-2004 -p 2023-2024:2023-2024 -p 8125:8125/udp -p 8126:8126 graphiteapp/graphite-statsd
collectd python插件开发
1.看网上的教程会发现需要一个colletcd库。千万TMD不要去pip 安装。你会发现可以装上一个collectd库,然鹅找不到教程中的函数。这个colletcd库不知道是多年前哪个大兄弟搞的,按Pypi上的说明是跟colletcd通信用的库,这命名啥玩意啊。直接import colletcd就行了,当colletcd调用这个py的时候这个库会被找到
2.colletcd的文档能不能写细一点啊。Python插件配置文件如下:
<Plugin python>
ModulePath "/home/kyf/collectd_plugin"
LogTraces true
Import "energy"
Import "predict_temp"
<Module energy>
PluginName "server_power"
</Module>
<Module predict_temp>
PluginName "predicted_server_temperature"
</Module>
</Plugin>
ModulePath指向python文件存放的目录
Import的值为python文件的文件名
Module块中的值应该可以在py里面configrue_callback里面读到,然鹅并不行,也不知道为啥
3.能耗插件代码
import psutil
import traceback
import collectd
class server_power(object):
def __init__(self):
self.plugin_name="server_power"
self.interval=30
self.hostname="controler"
def configure_callback(self,conf=None):
for node in conf.children:
val = str(node.values[0])
if node.key == "HostName":
self.hostname = val
elif node.key == 'Interval':
self.interval = int(float(val))
elif node.key == 'PluginName':
self.plugin_name = val
else:
collectd.warning('[plugin] %s: unknown config key: %s' % (self.plugin_name, node.key))
def read_callback(self):
try:
cpu_usage=psutil.cpu_percent()
cpu_freq_list=psutil.cpu_freq()
cpu_freq=cpu_freq_list[0]/cpu_freq_list[2]
memory_usage=psutil.virtual_memory()[2]
server_power_float=cpu_usage*cpu_freq*100+memory_usage*20
#type要在types.db里面声明,但是官方建议新建一个asyouwant.db文件,并在配置文件中配置对应选项。不过不太明白
#types.db与grahpite的关系。还是选用了types.db里面已有的。参见https://collectd.org/documentation/manpages/types.db.5.shtml.
val = collectd.Values(type="count")
val.plugin = self.plugin_name
val.host = self.hostname
#一共有4种,参见文档
val.type_instance ="GAUGE"
val.interval = self.interval
val.values = [server_power_float]
val.dispatch()
collectd.info('%s plugin [verbose]: %s' % (self.plugin_name, str(server_power_float)))
except Exception as exp:
#会输出日志到/opt/colletcd/var/log/collectd.log日志文件中
collectd.warning('%s plugin run into exception: %s' % (self.plugin_name, exp.message))
# collectd.warning(traceback.print_exc())
server_power1=server_power()
collectd.register_config(server_power1.configure_callback)
collectd.register_read(server_power1.read_callback)
4.插件中用到了Keras+tensorflow。第一个坑是CPU太旧了,导致tensorflow报错非法指令。将tf降级到1.5解决。第二个坑是tf+py2.7读取模型会有一个bug。按github的issue上面在模型Load之后添加
model._make_predict_function()
就可以了