collectd | 监控系统
我们平时用电脑,感觉卡了,就会看是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。
具体的配置看文档吧
不需要配置的插件
这些插件只要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 等等等等……