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

在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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值