2017年11月20日

collectd

collectd 是 system statistics collection daemon,會定時由多個資料來源收集 metrics 資料,完全由 C 語言編寫,故性能高且移植性好,它也能運作在沒有腳本語言支持或者 cron daemon 的 OS 上,例如嵌入式系統,架構上除了核心程式,其他的部分,包含資料 input/output,發送通知,Logging 等等,都是以 plugin 方式處理。

collectd 通常是用來收集硬體的相關資訊,例如 CPU loading,記憶體及網路使用狀況等等,然後透過 Plugin 寫入 graphite。

安裝

collectd 是在 EPEL repository 中,可直接用 yum 安裝。

yum install -y epel-release
yum install -y collectd

systemctl enable collectd
systemctl start collectd

設定

collectd 主要設定檔在 /etc/collectd.conf,最後一行是直接 Include "/etc/collectd.d" include 一個目錄裡面的所有設定檔。所有支援的 plugin 是以 so 形式放在 /usr/lib64/collectd 這個目錄中。

以下是要修改的 collecd.conf 設定檔內容

vi /etc/collectd.conf

# 指定主機名稱,也可以寫成IP
Hostname    "testserver"
# 是否允許以 DNS 查詢主機名稱,如果 DNS 可能有錯誤,建議不要開啟
FQDNLookup   false

# 各種文件、目錄的設置
#BaseDir     "/var/lib/collectd"
#PIDFile     "/var/run/collectd.pid"
#PluginDir   "/usr/lib64/collectd"
#TypesDB     "/usr/share/collectd/types.db"

# 設置為true時,可以根據 <Plugin XXX> 自動載入 plugin,而不需要 LoadPlugin
#AutoLoadPlugin false

# 是否同時上傳 collectd 自己的狀態#CollectInternalStats false

# global 的資料收集時間間隔,單位是秒,可以在 plugin 設定中進行覆寫
Interval                 1
MaxReadInterval        180

# 單位不是秒,而是次數,實際的時間是timeout*interval
Timeout                  2

# 用於配置讀寫線程數
#WriteThreads             5
#ReadThreads              5

# 配置緩存的上下限
WriteQueueLimitLow    8000
WriteQueueLimitHigh  12000

# 建立一個Unix Socket用在命令發送,狀態查看等
LoadPlugin unixsock
<Plugin unixsock>
    SocketFile "/var/run/collectd-unixsock"
    SocketGroup "collectd"
    SocketPerms "0660"
    DeleteSocket true  # 啟動時如果存在 sock,是否嘗試刪除
</Plugin>

# 設置日誌文件,儲存到文件中,可以通過logrotate管理
LoadPlugin logfile
<Plugin logfile>
    LogLevel info
    # File STDOUT
    File "/var/log/collectd/collectd.log"  # 也可以設定為 STDOUT
    Timestamp true
    PrintSeverity false
</Plugin>

# 收集 CPU 資訊
LoadPlugin cpu

# 收集系統 Loading 資訊
LoadPlugin load

# 收集記憶體資訊
LoadPlugin memory

# 收集網路 interface 資料
LoadPlugin interface

<Plugin interface>
    Interface "eth0"
    IgnoreSelected false
    ReportInactive true
    UniqueName false
</Plugin>

# 將資料寫入 graphite
# https://collectd.org/wiki/index.php/Plugin:Write_Graphite
LoadPlugin write_graphite

<Plugin write_graphite>
 <Node "graphing">
   Host "localhost"
   Port "2003"
   Protocol "tcp"
   ReconnectInterval 0
   LogSendErrors true
   Prefix "collectd."
#   Postfix "collectd"
   StoreRates true
   AlwaysAppendDS false
   EscapeCharacter "_"
   SeparateInstances false
   PreserveSeparator false
   DropDuplicateFields false
 </Node>
</Plugin>

# disk 資訊
# https://collectd.org/wiki/index.php/Plugin:DF
LoadPlugin df
<Plugin df>
    # Device "/dev/hda1"
    # Device "192.168.0.2:/mnt/nfs"
    MountPoint "/"
    MountPoint "/home"
    # FSType "ext3"
    # IgnoreSelected false
    # ReportByDevice false
    # ReportInodes false
    # ValuesAbsolute true
    # ValuesPercentage false
</Plugin>

要建立 log 的目錄

mkdir /var/log/collectd

因應 collectd 資料,要修改 graphite 的 Carbon 設定,要注意 collectd 的 pattern 要放在 .* 的前面

vi /opt/graphite/conf/storage-schemas.conf

[carbon]
pattern = ^carbon\.
retentions = 60:90d

[collectd]
pattern = ^collectd.*
retentions = 10s:1d,30s:7d,1m:30d,15m:5y

[default_1min_for_1day]
pattern = .*
retentions = 60s:1d

啟動

重新啟動 collectd, graphite

systemctl restart collectd
systemctl restart carbon
systemctl restart graphite

結果

graphite 收到的 collectd metrics 資料為

collectd.testserver.cpu-0.cpu-XXX

collectd.testserver.df-root.df_complex-free
collectd.testserver.df-root.df_complex-reserved
collectd.testserver.df-root.df_complex-used

collectd.testserver.interface-eth0.if_dropped.rx
collectd.testserver.interface-eth0.if_dropped.tx
collectd.testserver.interface-eth0.if_errors.rx
collectd.testserver.interface-eth0.if_errors.tx
collectd.testserver.interface-eth0.if_octets.rx
collectd.testserver.interface-eth0.if_octets.tx
collectd.testserver.interface-eth0.if_packets.rx
collectd.testserver.interface-eth0.if_packets.tx

collectd.testserver.load.load.longterm
collectd.testserver.load.load.midterm
collectd.testserver.load.load.shortterm

collectd.testserver.memory.memory-buffered
collectd.testserver.memory.memory-cached
collectd.testserver.memory.memory-free
collectd.testserver.memory.memory-slab_recl
collectd.testserver.memory.memory-slab_unrecl
collectd.testserver.memory.memory-used

References

聊聊 Statsd 和 Collectd 那點事!

Collectd 簡介

使用 collectd 進行服務監控

StatsD vs collectd vs fluentd and Other Daemons You Should Know 2016/8

How do StatsD and CollectD relate?

collectd 系統資訊收集服務