collectd로 system resource 모니터링

May 4, 2017



서버 여러대의 system resource data를 모니터링 하기 위해
collectD를 설치해 보았습니다.

collectD?

system resource data를 수집하는 기능을 합니다. 수집된 데이터는 central host로 전송을 하는데, 다양한 형태로 전송 할 수 있습니다. 또한, 이미 정의되어있는 plugin들을 사용하여, 몇가지 설정만으로도 데이터를 수집하고 보낼 수 있습니다. 저는 centos7환경에서 collectd를 설치하고, influxdb로 데이터를 수집 하였습니다.

설치

설치는 쉽습니다. 다음과 같이 입력하면 설치가 완료됩니다.

npm install collectd

한가지 주의하실 점은 yum repository 참조 오류가 발생할 수도 있다는 것입니다. 그러면 가장 최신 버전을 설치해주어야 하기 때문에 다음과 같이 진행합니다.

yum install epel-release
npm install collectd

설정

설치한 후에 /etc/collectd.conf에서 설정을 변경합니다. collectd는 기본적으로 필요한 플러그인들을 제공하고 주석처리가 되어있습니다. 주석을 풀고 필요한 설정을 잡아주면 됩니다. 저는 다음과 같은 플러그인들이 필요하기 때문에 주석을 풀고 설정을 하겠습니다.

--- Loadplugin section ---

LoadPlugin cpu
LoadPlugin df
LoadPlugin disk
LoadPlugin interface
LoadPlugin load
LoadPlugin memory
LoadPlugin network

--- Plugin configuration ---
<Plugin cpu>
  ReportByCpu true
  ReportByState true
  ValuesPercentage true
</Plugin>

...

<Plugin network>
#       # client setup:
        Server "127.0.0.1" "25826"
#       <Server "127.0.0.1" "25826">
#               SecurityLevel Encrypt
#               Username "user"
#               Password "secret"
#               Interface "eth0"
#               ResolveInterval 14400
#       </Server>
#       TimeToLive 128
#
#       # server setup:
#       Listen "127.0.0.1" "25826"
#       <Listen "239.192.74.66" "25826">
#               SecurityLevel Sign
#               AuthFile "/etc/collectd/passwd"
#               Interface "eth0"
#       </Listen>
        MaxPacketSize 1452
#
#       # proxy setup (client and server as above):
#       Forward true
#
#       # statistics about the network plugin itself
#       ReportStats false
#
#       # "garbage collection"
#       CacheFlush 1800

위와 같이 주석을 풀고 자신에게 필요한 설정을 잡아주면 되는데, network같은 부분은 저는 테스트를 위해 우선 로컬의 influxdb에 데이터를 보내기 위해 로컬의 25826 포트로 client setup을 했습니다. 25826 포트는 influxdb에서 collectd에 대해 리스닝하고있는 포트입니다. 실제 사용하실때는 로컬IP가 아니라 모니터링 장비의 IP로 바꿔줘야 합니다.

influxDB?

influxDB는 시계열 데이터를 저장하는 DB입니다. 시간의 흐름에 따라 서버의 리소스와 같은 IT 인프라 모니터링, 다이어트나 건강체크와 같은 IoT 기기들의 데이터 수집 등 다양한 목적에 사용할 수 있습니다.

설치

설치는 간단합니다. 아래와 같이 진행합니다.

wget --no-check-certificate https://s3.amazonaws.com/influxdb/influxdb-0.10.0-1.x86_64.rpm
yum localinstall influxdb-0.10.0-1.x86_64.rpm

설정

이제 설치를 했으니, collectd에서 오는 데이터를 받을 수 있도록 /etc/influxdb/influxdb.conf 설정파일을 변경합니다. admin, meta, http와 같이 핵심적인 설정들은 이미 다 되어있습니다. 저희가 변경해야 할 부분은 collectd 부분입니다.

###
### [collectd]
###
### Controls the listener for collectd data.
###

[collectd]
  enabled = true
  bind-address = ":25826"
  database = "collectd"
  typesdb = "/usr/share/collectd/types.db"

  # These next lines control how batching works. You should have this enabled
  # otherwise you could get dropped metrics or poor performance. Batching
  # will buffer points in memory if you have many coming in.

  # batch-size = 1000 # will flush if this many points get buffered
  # batch-pending = 5 # number of batches that may be pending in memory
  # batch-timeout = "1s" # will flush at least this often even if we haven't hit buffer limit
  # read-buffer = 0 # UDP Read buffer size, 0 means OS default. UDP listener will fail if set above OS max.

앞에서 collectd의 데이터를 로컬호스트의 25826포트로 보냈었죠? 위의 부분이 influxdb에서 collectd의 데이터를 받기 위한 설정입니다.

실행

이제 다음과 같이 influxdb와 collectd를 실행시켜 봅시다.

service influxdb start
systemctl start collectd

확인

그리고 제대로 돌아가는지 collectd를 확인해 봅시다.

[root@localhost influxdb] systemctl status collectd
● collectd.service - Collectd statistics daemon
   Loaded: loaded (/usr/lib/systemd/system/collectd.service; disabled; vendor preset: disabled)
   Active: active (running) since 목 2017-05-04 12:20:23 KST; 14s ago
     Docs: man:collectd(1)
           man:collectd.conf(5)
 Main PID: 2262 (collectd)
   CGroup: /system.slice/collectd.service
           mq2262 /usr/sbin/collectd

 5월 04 12:20:23 localhost.localdomain collectd[2262]: plugin_load: plugin "disk" successfully loaded.
 5월 04 12:20:23 localhost.localdomain collectd[2262]: plugin_load: plugin "interface" successfully loaded.
 5월 04 12:20:23 localhost.localdomain collectd[2262]: plugin_load: plugin "load" successfully loaded.
 5월 04 12:20:23 localhost.localdomain collectd[2262]: plugin_load: plugin "memory" successfully loaded.
 5월 04 12:20:23 localhost.localdomain collectd[2262]: plugin_load: plugin "network" successfully loaded.
 5월 04 12:20:23 localhost.localdomain collectd[2262]: disk plugin: The "UseBSDName" option is only support...ed.
 5월 04 12:20:23 localhost.localdomain collectd[2262]: Plugin `interface' did not register for value `Uniqu...e'.
 5월 04 12:20:23 localhost.localdomain collectd[2262]: Systemd detected, trying to signal readyness.
 5월 04 12:20:23 localhost.localdomain collectd[2262]: Initialization complete, entering read-loop.
 5월 04 12:20:23 localhost.localdomain systemd[1]: Started Collectd statistics daemon.
Hint: Some lines were ellipsized, use -l to show in full.

그 다음 influxdb에 데이터가 유입되는지 확인해 봅시다.

[root@localhost influxdb] influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 0.10.0
InfluxDB shell 0.10.0
> show databases
name: databases
---------------
name
collectd
_internal

> use collectd
Using database collectd
> select * from cpu_value
1493866010372653000     localhost       1               percent steal           0
1493866010372654000     localhost       1               percent idle            100
1493866020349417000     localhost       0               percent user            0
1493866020349420000     localhost       0               percent system          0.10030090270812438
1493866020349422000     localhost       0               percent wait            0
1493866020349423000     localhost       0               percent nice            0
1493866020349425000     localhost       0               percent interrupt       0
1493866020349426000     localhost       0               percent softirq         0
1493866020349427000     localhost       0               percent idle            99.89969909729186

collectD에서 influxDB로 데이터가 제대로 잘 들어오고 있습니다.

Grafana

이제 이 influxDB를 grafana와 연결해서 시각적으로 데이터를 볼 수 있게 합니다.
grafana의 설치와 InfluxDb와의 연결은 간단합니다. grafana의 공식 documentation에 잘나와 있습니다. Using InfluxDB in Grafana

grafana를 설치하셨다면 우선 data source 탭으로 들어갑니다. 여기서 아래와 같이 type을 influxdb로 선택한 후, influxdb에서 세팅한 데이터를 주고 받기 위한 http 세팅을 입력하고 저장합니다.

_config.yml

그러면 이제 대쉬보드로 가서 new dashboard를 선택합니다. 그 다음 graph를 선택하고 panel data source에 아까 세팅한 data source의 이름(저의 경우는 collectD)을 선택합니다. 그리고 저장을하고 대쉬보드로 가보면 아래와 같이 새로운 graph가 생긴것을 볼 수 있습니다.

_config.yml

예제에서는 별다른 쿼리문을 만들지 않고 바로 cpu_value만 보여주게 만들었지만, 대쉬보드를 만들때 쿼리문을 추가해서 자유롭게 원하는 데이터를 뽑아서 만들 수 있습니다.