時系列データベースInfluxDB と Telegraf でサバーリソースを取得する
Telegraf は、InfluxDBと相性のよいメトリクスの収集ツールです。
Telegraf is an agent written in Go for collecting metrics from the system it’s running on, or from other services, and writing them into InfluxDB
GitHub - influxdata/telegraf: The plugin-driven server agent for collecting & reporting metrics.
これまではZabbixとGrafana、(および、一部InfluxDB)を利用してサーバーリソース等のメトリクス表示をしていました。Zabbix Agent から取得したデータでもきちんとGrafanaにて表示できるので不自由はないのですが、ZabbixのDatabase (MySQL) から長期間・複数の情報を取得しようとすると、RDBMSの特性かどうしてもレスポンスが悪くなってしまっていました。
それならば、サーバーリソース系の情報もInfluxDBに格納してみようではないかと思ったのが動機です。
前提
- InfluxDB を利用できる環境が整っていること 環境がない場合、Dockerを利用するのが手軽です。Docker Hub - influxdb official repoxitory
- Database は
create database telegraf
として作れているものとします - 本記事では Ubuntu 14.04 としています。16.04やRedHat系の場合、rcスクリプトが同じように操作できるかはわかりません(systemdでの操作になるので、できないと思います)
Telegraf エージェントのインストール
curl -LO <https://dl.influxdata.com/telegraf/releases/telegraf_1.0.1_amd64.deb>
sudo dpkg -i telegraf_1.0.1_amd64.deb
(Reading database ... 143760 files and directories currently installed.)
Preparing to unpack telegraf_1.0.1_amd64.deb ...
Unpacking telegraf (1.0.1-1) ...
Setting up telegraf (1.0.1-1) ...
Adding system startup for /etc/init.d/telegraf ...
/etc/rc0.d/K20telegraf -> ../init.d/telegraf
/etc/rc1.d/K20telegraf -> ../init.d/telegraf
/etc/rc6.d/K20telegraf -> ../init.d/telegraf
/etc/rc2.d/S20telegraf -> ../init.d/telegraf
/etc/rc3.d/S20telegraf -> ../init.d/telegraf
/etc/rc4.d/S20telegraf -> ../init.d/telegraf
/etc/rc5.d/S20telegraf -> ../init.d/telegraf
telegraf process is not running [ FAILED ]
Starting the process telegraf [ OK ]
telegraf process was started [ OK ]
FAILED となっている部分が若干気になりますが、起動はしているようなので問題無さそうです。
ps -ef | grep tele
telegraf ..中略.. /usr/bin/telegraf -pidfile /var/run/telegraf/telegraf.pid -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d
標準の設定(2016/10/23時点)は以下コンフィグ /etc/telegraf/telegraf.conf
の状態で起動されました。
[global_tags]
[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
debug = false
quiet = false
hostname = ""
omit_hostname = false
[[outputs.influxdb]]
urls = ["<http://localhost:8086>"] # required
database = "telegraf" # required
retention_policy = ""
write_consistency = "any"
timeout = "5s"
[[inputs.cpu]]
percpu = true
totalcpu = true
fielddrop = ["time_*"]
[[inputs.disk]]
ignore_fs = ["tmpfs", "devtmpfs"]
[[inputs.diskio]]
[[inputs.kernel]]
[[inputs.mem]]
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]
一旦終了しておきます。
sudo /etc/init.d/telegraf stop
--> telegraf process was stopped [ OK ]
コンフィグ例
コンフィグにあたってはいくつかのサイトを参考にしたところ、バージョンによる理由か(?)記載方法が古かったりして情報が錯綜していたので、素直に本家プロジェクトサイトのコンフィグ例を参照するのがよさそうです。
telegraf/CONFIGURATION.md at master · influxdata/telegraf · GitHub
まず今回は、上記標準コンフィグのうち InfluxDB のURLのみ書き換えてそのまま利用しました。
[[outputs.influxdb]]
urls = ["<http://yuor-url>:your-port"] # ここ。ローカル起動なら localhost で良いはず
database = "telegraf" # required
起動テストが可能です。間違っていなければ、現在の値っぽい情報が表示されます。
telegraf -config /etc/telegraf/telegraf.conf -test
Telegraf の起動
RCスクリプトを利用して起動します。
sudo /etc/init.d/telegraf start
sudo /etc/init.d/telegraf status
なお、
sudo telegraf -config telegraf.conf
このようにも起動可能です。
(RCスクリプトのstart
ではこのように実行されています。もっとたくさんの設定がありますが)
取得されたデータ
cpu,cpu=cpu-total,host=xxxhostxxx
cpu,cpu=cpu0,host=xxxhostxxx
cpu,cpu=cpu1,host=xxxhostxxx
disk,fstype=ext2,host=xxxhostxxx,path=/boot
disk,fstype=ext4,host=xxxhostxxx,path=/
diskio,host=xxxhostxxx,name=dm-0
diskio,host=xxxhostxxx,name=dm-1
diskio,host=xxxhostxxx,name=vda
diskio,host=xxxhostxxx,name=vda1
diskio,host=xxxhostxxx,name=vda2
diskio,host=xxxhostxxx,name=vda5
kernel,host=xxxhostxxx
mem,host=xxxhostxxx
processes,host=xxxhostxxx
swap,host=xxxhostxxx
system,host=xxxhostxxx
host
の文字列は置き換えてあります。
例えば、cpu-total
からは以下の数値を取得可能です。
cpu host
usage_guest usage_guest_nice
usage_idle usage_iowait usage_irq
usage_nice usage_softirq usage_steal
usage_system usage_user
詳細は telegraf/CPU_README.md at master · influxdata/telegraf · GitHub より。
同様に、 Supported Input Plugins · influxdata/telegraf · GitHub セクションに記載されているリンクから各種詳細を取得することができるようです。
ここまでくれば、あとは普段の使い方でGrafanaから数値を取得できるはずです。
CoreOS へのセットアップ方法
別の手段として、CoreOS へインストールします。インストール時点でのバージョンは 1122.3.0 となります。
Telegraf バイナリの取得
GitHub - influxdata/telegraf: The plugin-driven server agent for collecting & reporting metrics.
Linux tarballs: のセクションから入手してください。
https://dl.influxdata.com/telegraf/releases/telegraf-1.0.1_linux_amd64.tar.gz (2016/10/24時点のバージョン)
インストール時は、最新バージョンをご確認ください。tarball を展開すると以下の構成になっています。
etc/logrotate.d/telegraf # log rotate config
etc/telegraf/telegraf.conf # config
var/log/telegraf/ # 空ディレクトリ
usr/bin/telegraf # 実行バイナリ本体
usr/lib/telegraf/scripts/
init.sh # initスクリプト
telegraf.service # systemd の設定ファイル
そのまま /
に上書きしようとすると怒られます。
sudo mv usr/bin/telegraf /usr/bin/
mv: inter-device move failed: 'usr/bin/telegraf' to '/usr/bin/telegraf'; unable to remove target: Read-only file system
CoreOSではユーザーが書き込みできる領域が限られているためです。CoreOSでは標準で$PATH
に/opt/bin
が含まれていますので、ここに配置します。
ここで欲しいファイルは2つなので、手動で設定してしまうことにします。
sudo mv usr/bin/telegraf /opt/bin/
sudo mv usr/lib/telegraf/scripts/telegraf.service /etc/systemd/system/
sudo mkdir -p /var/log/telegraf
sudo mkdir /etc/telegraf
sudo mkdir /etc/telegraf/telegraf.d
sudo vi /etc/telegraf/telegraf.conf
service ファイルの修正
telegraf の配置パスを変更したので一部修正します。
本記事ではユーザーを作成していませんので、ここは必要に応じて適宜見直しください。
--- telegraf.service 2016-10-24 02:27:01.000000000 +0900
+++ /etc/systemd/system/telegraf.service 2016-10-24 02:32:10.000000000 +0900
@@ -5,10 +5,10 @@
[Service]
EnvironmentFile=-/etc/default/telegraf
-User=telegraf
+User=root
Environment='STDOUT=/var/log/telegraf/telegraf.log'
Environment='STDERR=/var/log/telegraf/telegraf.log'
-ExecStart=/bin/sh -c "exec /usr/bin/telegraf -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d ${TELEGRAF_OPTS} >>${STDOUT} 2>>${STDERR}"
+ExecStart=/bin/sh -c "exec /opt/bin/telegraf -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d ${TELEGRAF_OPTS} >>${STDOUT} 2>>${STDERR}"
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
KillMode=control-group
systemd で Telegrafサービスを有効にします。
$ sudo systemctl enable telegraf
$ systemctl list-unit-files telegraf.service
UNIT FILE STATE
telegraf.service enabled
最後に、enabled になっていることを確認したら sudo systemctl start telegraf
で完成です。もし起動しない場合、sudo journalctl -u telegraf -f
で起動ログを確認しながら動作確認を試みるとヒントが見つかるはずです。
意外と、InfluxDB側のHTTPサーバーのアクセス制限だったりしますので気をつけましょう。 (別サーバーだったりする場合は特に!)