collectd | 监控系统

2020 03 25, Wed

我们平时用电脑,感觉卡了,就会看是CPU占用率比较高,还是内存满了,还是网络有问题,还是硬盘被其他程序占满了io或者带宽。但是服务器上和nas上,等到我们注意到问题登录上服务器,时间已经过去很久了。

那么我们就需要一个东西来持续记录服务器的各种情况,这个工具叫collectd,在Unix上通用。可惜的是Windows上,比较接近的工具(SSC Serv)是收费的,可以考虑用别的东西来替代,比如说用powershell自己写。

这个服务也被广泛用在服务器、路由器和嵌入式等等设备上。比如说装了openwrt的同学可以看到wrt很多默认安装了collectd,就是为了记录下系统的状态,在需要的时候展示出来。

Installation

在各个发行版上的名字都叫collectd,用包管理装就行了。macOS上我一直用brew。

可以等到我们改好配置文件以后再启动。

Usage

collectd本身基于rrdtools编写的,会生成专有的rrd数据库,后来又加了很多插件,也可以输出到很多其他地方,比如说csv和各种日志系统,还有一些数据库支持直接接受collectd的数据,比如说很出名的时序序列数据库influxdb。

发展到现在,collectd已经发展了非常多的插件,可以轻松把数据以任何想要的形式存下来。需要的话也可以自己写插件

配置

安装完成以后,应该会有一个/etc/collectd.conf文件。

需要我们指定的包括这几个配置项

  • BaseDir:你的程序运行在什么目录下
  • TypesDB:存储着收集到的数据的类型信息
  • Interval: 两次收集之间的时间间隔
  • LoadPlugin:要加载的插件。这个是需要重复调用的
  • 再就是每个插件的配置,比如说csv的目录,或者network的服务器地址

然后该怎么启动怎么启动就好。比如说

systemctl start collectd
# 或者
brew services start collectd

Web

collecd本身没有展示的能力,需要第三方来展示数据。

目前来说我用过的工具中,grafana是相对比较好用的,也可以接入其他的工具,比如说prometheus

Grafana

Grafana是prometheus生态的一环。collectd写入数据到任意一个支持的数据库以后,就可以直接画出图,或者在需要的时候发邮件告警。

plugins

常用的插件主要是两类:输入,输出。输入就是从哪里获取到这些数据,输出就是把数据都放在哪里

输入

apache - httpd服务

收集apache2/httpd服务中mod_status产生的状态信息,也支持lighthttpd中status module的输出

用法的话,只要在httpd中加上location

ExtendedStatus on
<Location /status>
    SetHandler server-status
</Location>

然后在collectd这边收集数据就好了

LoadPlugin "apache"
<Plugin "apache">
    <Instance>
        URL "http://127.0.0.1:status?auto"
    </Instance>
</Plugin>

Nginx

类似于apache插件,nginx插件主要是用来收集Nginx中ngx_http_stub_status_module模块输出的各种统计数据。

在Nginx一侧,配置

location = /status {
    stub_status;
}

在collectd这边收集数据就行了。

<Plugin "nginx">
  URL "https://localhost:8433"
</Plugin>

df - 文件系统

类似于Linux的df命令,监控文件系统的插件,配置的话,一般来说只要指定文件系统类型,或者挂载点,或者设备文件路径,就足够了。Device、MountPoint、FSType都可以使用多次。路径可以使用正则。

<Plugin "df">
    Device "/dev/sda"
    MountPoint "/"
    MountPoint "/^regexp/"
    FSType "ext4"
    IgnoreSelected false
</Plugin>

disk - 磁盘硬件

类似于df,但是主要是收集硬件数据。比如说实时的IOPS或者traffic。配置项主要是Disk。Disk选项可以使用多次,路径可以使用正则。

<Plugin "df">
    Disk "/dev/sda"
    IgnoreSelected false
</Plugin>

interface - 网络

主要用于网络一类的数据收集,比如说流量、数据包数量、出错率。Interface可以重复使用。

<Plugin "interface">
    Interface "/dev/sda"
    IgnoreSelected false
</Plugin>

iptables

通过某个chain上的数据,比如说通过iptables上nat表POSTROUTING表的数据量或者数据包量。

<Plugin "iptables">
    Chain "nat" "POSTROUTING"
    Chain "filter" "FORWARD" "comment"
    IgnoreSelected false
</Plugin>

Ping

ping可以用来检查到达某个其他机器的网络延迟

<Plugin "ping">
  Host "example.com"
</Plugin>

mcelog

mcelog本身是一个监控内存错误的工具,而collectd的mcelog插件可以记录内存中错误的数量和恢复的数量。

配置里面主要就是需要改一下Socket的路径

 <Plugin mcelog>
   <Memory>
     McelogClientSocket "/var/run/mcelog-client"
     PersistentNotification false
   </Memory>
 </Plugin>

Thermal

/sys或者/proc中读取温度传感器的数值。

MySQL/Redis

简单的读取一些基本的信息。MySQL需要连接有关的这些参数。

数据库 链接
MySQL https://collectd.org/wiki/index.php/Plugin:MySQL
Redis https://collectd.org/wiki/index.php/Plugin:Redis

DBI/PostgreSQL/Oracle

相比上面两个更复杂一些,可以在数据库里面执行指定的SQL语句,来得到一些信息。

数据库 链接
DBI https://collectd.org/wiki/index.php/Plugin:DBI
PostgreSQL https://collectd.org/wiki/index.php/Plugin:PostgreSQL
Oracle https://collectd.org/wiki/index.php/Plugin:Oracle

各语言SDK

用各种语言直接来编写collectd插件的插件,比如说Java插件会在collectd里面启动一个jvm。

具体的配置看文档吧

语言 链接
Java https://collectd.org/wiki/index.php/Plugin:Java
Lua https://collectd.org/wiki/index.php/Plugin:Lua
Python https://collectd.org/wiki/index.php/Plugin:Python
Perl https://collectd.org/wiki/index.php/Plugin:Perl

不需要配置的插件

这些插件只要LoadPlugin就好了,不需要更多的配置

  • Apple sensors 苹果电脑的温度传感器。
  • Battery 电池电量。
  • Load 系统负载。
  • LVM LVM2中LV和VG的大小和用量。
  • Memory 记录物理内存的信息,比如说free/page cache/buffer cache/used。
  • Swap 记录Swap分区的信息。
  • PF 记录BPF的一些统计信息。
  • Uptime
  • Users 记录登录用户的数量
  • Wireless 无线网卡的信号强度啊、信噪比啊什么的。

输出

RRDTools

collectd一般主要是结合rrdtools使用的,对磁盘比较友好。具体的可以看官方文档

缺点就是读取需要特定的工具来帮忙,或者依赖于它的库。

CSV

CSV是一个比较好读好懂而且不需要外部工具就可以读的格式,配置也比较简单

<Plugin "csv">
  DataDir "/var/lib/collectd/csv"
  StoreRates true
</Plugin>

Network:其他Collectd

collectd可以把数据传给其他的节点来处理,需要的模块就是Network。

其中collectd既可以扮演客户端一侧:

<Plugin "network">
  Server "ff18::efc0:4a42"
</Plugin>

也可以扮演服务器一侧:

# Server
<Plugin "network">
 Listen "ff18::efc0:4a42"
</Plugin>

想要区分不同节点的数据的话,一定要设置好hostname……

另外值得一提的是influxdb一类的很多时序数据库,都可以直接接受collectd的数据。

队列和数据库

collectd还支持直接写入数据到队列和数据库,比如说写入到AMQO、MQTT,或者写入到TSDB Kafka Redis 等等等等……