【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有自己的类型,都存储在Types.db中,文件内容如下。
其中第一列为类型的名称;第二列为对类型的描述(包括:GAUGE,DERIVE,COUNTER,ABSOLUTE),由四列组成,分别为数据源名、类型、最小值和最大值组成,中间以冒号”:”进行分隔。U表示没有定义,意思就是没有范围。用户可以根据需要定义自己的collectd的类型,以方便理解。
我们可以定义从名称上容易理解的类型。实现方式是在文件types.db中添加自己定义的类型,或者自定义mytypes.db文件。如 :
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开发的插件的程序可用。
配置插件,在此处我们配置插件的路径为”/root”,并通过Import将写好的test.py模块进行进行加载。如果有多个模块可以调用多个Import。然后配置模块,模块名和Import相对应。在模块中可以根据插件的需要配置自己的参数,在此处为了看效果随便配置了参数t和Interval。
2)开发自己的python程序。
创建test.py文件,并且放到”/root”路径下。在test.py文件中引入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还提供了更加灵活稳定的框架,支持自定义插件用于采集满足需求的数据。