collectd插件编写

转自: http://tech.it168.com/a2016/1025/2993/000002993954.shtml

【IT168 技术】目前在做一个对物理机的性能指标监控的项目。在业内实现方式主要有如下两种方案:

1、在物理机中部署agent程序,实现对数据指标的采集。此方案在采集数据和容错处理上都比较简单,而且由于agent分布在不同的物理机上,天生的就避免了集中式采集所造成的性能问题。采用agent方式的缺点是在项目上线进行实施部署时会存在较大的工作量,因为需要对所有的物理机进行agent的安装部署。并且一旦agent程序被有意无意的停掉,将获取不到数据。

2、通过远程访问的方式获取物理机的连接,运行操作系统指令获取数据指标。此方案不需要安装agent程序,实施工作量小,但是由于使用的是远程交互的方式,不太容易进行错误处理,一旦出现操作系统命令运行阻塞,而且采集程序没有及时发现,接踵而来的是大量的操作系统命令阻塞,会存在导致物理机宕机的风险。另外一方面当采集成百上千的物理机数据时,一定要考虑分布式采集。

在开发过程中发现了collectd开源框架,下面将从以下几方面对collectd进行介绍:

1、collectd介绍

2、collectd的基本安装配置

3、collectd插件编写

 collectd介绍

collectd是一个守护进程,由c语言实现,用来收集系统信息,可以通过多种方式使其可用(文件、网络等)。守护进程本身只有给插件载入、查询和提交的功能,除此之外没做其他事情,数据的采集和获取都是通过插件进行。collectd支持多种插件,主要分为read类型的插件和write类型的插件。Read类型的插件就是用于读取监控项的指标的插件。write类型的插件就是将获取到的值写入文件、数据库、缓存等介质中。目前collectd可以应用在 Linux,Solaris,Mac OS X,AIX,FreeBSD,NetBSD 和 OpenBSD 等常见的操作系统中。

上图为collectd的架构图,图中可以看到collectd进程通过和各种插件交互完成对数据的采集。

  collectd基本安装配置

下面简要介绍Collectd的安装配置。将要以Centos7.X操作系统为例进行介绍。在服务器联网的情况下,可以通过Yum进行安装,过程如下:

1、安装collectd软件

# yum install epel-release

# yum install collectd

2、启动collectd服务,并且设置开机启动

# systemctl start collectd

# systemctl enable collectd

根据以上命令collectd已经成功的安装到服务器上,并且配置了开机自启动。

另外服务的停止命令和重启命令分别为:

# systemctl stop collectd

# systemctl restart collectd

4 、修改collectd的配置文件

collectd的插件都需要在collectd.conf文件中进行开启和关闭。例如,可以将”LoadPlugin cpu”前的 “#”号去掉,用于启动cpu的read监控。

基于collectd的插件编写

collectd有自己的类型,都存储在Types.db中,文件内容如下。

基于collectd的插件编写

其中第一列为类型的名称;第二列为对类型的描述(包括:GAUGE,DERIVE,COUNTER,ABSOLUTE),由四列组成,分别为数据源名、类型、最小值和最大值组成,中间以冒号”:”进行分隔。U表示没有定义,意思就是没有范围。用户可以根据需要定义自己的collectd的类型,以方便理解。

我们可以定义从名称上容易理解的类型。实现方式是在文件types.db中添加自己定义的类型,或者自定义mytypes.db文件。如 :

基于collectd的插件编写

1、加入如下信息:test value:GAUGE:0:U

2、然后修改collectd.conf启用自定义的mytypes.db文件

这样就成功添加了一个自定义的类型 test。

collectd插件编写

collectd实现了常见的指标的监控。但是在实际的项目中collectd已经提供了的插件明显是不够的,这样就需要开发自己的read插件,来实现对更多的指标的数据采集。另外在实现自己的项目时,总是希望采集得到的数据能够存入自定义的数据存储中,这时就需要自己实现 write插件,将获取到的数据按照要求插入自己的数据存储中。

collectd 支持各种自定义扩展,C-plugins,Perl-plugins,Java-plugins,Python-plugins,UNIX 域套接字,Java 的 MBean 的支持等。这样就允许通过python或者java等程序实现read和write的插件。下面通过一个简单的例子介绍一下使用python语言开发自己的read插件和write插件。

1) 在配置文件中启用插件

首先需要对配置文件进行修改,将python插件进行启用,以保证由python开发的插件的程序可用。

基于collectd的插件编写

配置插件,在此处我们配置插件的路径为”/root”,并通过Import将写好的test.py模块进行进行加载。如果有多个模块可以调用多个Import。然后配置<Module>模块,模块名和Import相对应。在<Module>模块中可以根据插件的需要配置自己的参数,在此处为了看效果随便配置了参数t和Interval。

基于collectd的插件编写

2)开发自己的python程序。

创建test.py文件,并且放到”/root”路径下。在test.py文件中引入collectd模块。collectd提供了基本的方法用于注册自己插件的配置加载函数、数据读取函数和数据写函数。

基于collectd的插件编写

以上三个方法的参数最重要的都是一个回调函数,分别用于读取配置文件、采集监控数据和处理获取的监控数据。

1、配置文件回调函数

def configure_callback(conf=None):
    pass
os.system("echo '"+str(conf)+"'>>/tmp/config.log")
try:
    for c in conf.children:
        os.system("echo '"+ str(c.values[0])+"'>>/tmp/config.log")
        except Exception ,e:
        os.system("echo '"+e+"'>>/tmp/config.log")
finally:
    pass

1中首先创建读取配置的函数。它的作用是读取collectd.conf文件中的配置,对应的就是上面配置的module,t,Interval。为了能够看到效果,我们将获取到的配置信息写入到config.log文件中。

2是创建的监控的读回调函数。在此处定义了一个getTestValue函数,返回了数字123(在真实的系统中,需要根据自己需要去获取数据)。然后定义了读回调函数read_callback,设置了类型为自定义的类型“test”,接着设置了其它的参数,最后调用dispatch方法,发送获取的结果,给write插件读取。

其中type为上文中自定义的类型,也可以为在types.db中定义的其它类型。

 2、读回调函数

def getTestValue():
    return 123
    
def read_callback():
    type = "test"
    val = collectd.Values(type)
    val.plugin = "test"
    val.host = "127.0.0.1"
    val.type_instance = "test_instance"
    val.interval = 30
    val.values = [getTestValue()]
    val.dispatch()

创建”写”回调函数,为了能够看到效果,我们将数据写 到write.log文件中。在实际的项目中,可以在此处加入自己的逻辑,将数据写入数据库,缓存等自己需要的介质中,以达到和项目集成的目的。

3、写回调函数

def write_callback(data=None):
    os.system("echo '"+str(data)+"'>>/tmp/write.log")

4中是将自己实现的回调函数注册到collectd中,使其生效。

  4、注册回调函数

collectd.register_config(configure_callback)
collectd.register_read(read_callback)
collectd.register_write(write_callback)

重启服务,将会在/tmp路径下看到config.log 和 write.log。其中config.log中将会读取 t 和 Interval参数,而在write.log中将会看到test类型 值为123的数据。

根据以上例子我们只是将获取的结果记录到了临时文件中,当然在和真实的项目集成时,我们也可以将结果写入数据库,缓存等自己需要的存储介质中。

  总结

使用collectd的开源采集框架,是一个比较好的选择。collectd实际上属于Agent的采集方式,并且 collected已经提供了很多常见的采集指标,如CPU,内存等等,不仅能够减少开发的工作量,collectd还提供了更加灵活稳定的框架,支持自定义插件用于采集满足需求的数据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • “我蹲在一棵桉树下等来顺时,身上只穿了条内裤,上衣和裤子不知丢哪里去了,很可能是掉下鱼塘里了。在供销合作社的鱼塘折...
    老韩0201阅读 465评论 1 12
  • 【感恩】 昨晚一晚的折腾,凌晨3点终于睡着,今天又能精神百倍进行学习 梦百合公司每一位工作人员毫无保留分享实战经验...
    a3be925cbda4阅读 83评论 0 0
  • 昨天中午,我趴在桌子上看电脑,厨房里传来窸窸窣窣的声音,我进去一看,6岁的儿子乐乐拿着电饭锅内胆,锅里面有一小碗米...
    葛昌明阅读 257评论 0 1