colletcd+graphite部署踩坑和自定义插件开发

it2022-05-05  152

在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()

就可以了


最新回复(0)