exlar's IT note

ITやスマートデバイスを中心とした趣味情報の寄せ集め

Telegraf を CoreOS にインストールしてメトリクスを取得する方法

次の記事で Ubuntu 14.04 に Telegraf をインストールしましたが、今回は CoreOS へインストールします。インストール時点でのバージョンは 1122.3.0 となります。

exlair.hatenablog.com

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サーバーのアクセス制限だったりしますので気をつけましょう。
(別サーバーだったりする場合は特に!)

Telegrafでサバーリソースを取得してInfluxDBに格納する

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に格納してみようではないかと思ったのが動機です。

f:id:exlair:20161024011044p:plain

前提

  • 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ではこのように実行されています。もっとたくさんの設定がありますが)

取得されたデータ

f:id:exlair:20161024011111p:plain

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から数値を取得できるはずです。

動画ファイルをPS3経由のテレビでお手軽再生したい (Universal Media Server)

Universal Media Server とは

Universal Media Server (UMS) は、パソコンやサーバーに格納している動画ファイルを、PS3経由でテレビ視聴するためのソフトウェアです。

タイトルはPS3としていますが、技術はDLNAという標準仕様ですのでPS4やその他DLNA対応機器で閲覧できるはずです。現在、自分の環境ではPS3しか手元にないのでこのようなタイトル設定をしています。おそらく多くの動画ファイルフォーマットに対応しているのですが、近年は iPhone で撮影した動画をはじめmp4ファイルばかり扱っていますので、他のコーデックでどう動くか確認不足です。

似たようなソフトウェアに PS3 Media Server (PMS) というものがあり、ここ数年間はこれを用いて自宅での動画視聴環境を整えていましたが、PMSの開発は随分前に終了してしまっています。とはいえ、"動画ファイル(mp4ファイル)を視聴する" というだけの目的であれば開発終了した PMS でも必要十分だったので特に不満なく使い続けてきました。

そうしているうちに UMS として名前を変え、別プロジェクトでオープンソース化されていました。今回、自宅サーバー老朽化に伴いソフトウェア構成を見直しているので、どうせならば最新化しようということで選定してみることにします。

Media Server の比較資料があります: Comparison of Media Servers

UMSの方が圧倒的に充実してはいるのですが、自身の利用目的は所詮 "mp4ファイルを視聴したい" のみなので、そうなると変化があまり感じられないのが本音。まだ構築直後で大量にある UMS の設定項目も十分把握できていないため、もう少し様子見したいと思います。

UMS実行環境の構築方法

ここでは、Linuxサーバー内にある動画ファイルをDLNA配信する目的で構築します。

なお、Windows や macOS に保存してある動画ファイルを配信したい場合、各OS向けのバイナリも提供されていますので 同様のことが可能です。GUIツールが付属するはずですので、より手軽ではないかと思います(試していません)。

起動までの手順は(こちらに記載の通り UniversalMediaServer/INSTALL.txt)、

  1. JVM および メディア関連のパッケージをインストールする
  2. UMSをダウンロードする
  3. tgzを展開する
  4. コンフィグを修正する
  5. 格納されている ./UMS.sh で起動する

これだけなのですが、個人的にはメディア系のソフトウェアを多用途サーバーにガッツリ混在させたくないことや、起動スクリプトの準備が面倒くさいといった理由から、Dockerコンテナで動かすことにしました。

作成したコンテナは GitHub に作成済みです。
exlair/docker-ums: Dockerfile to build a Universal Media Server (UMS) container image.

Docker-UMS 動作仕様のポイント

詳細はレポジトリのREADMEに記載の通りですので割愛します。起動しているホストのNICが必ずしも eth0 ではないので、うまく動作しない場合は疑ってみてください。

先の記事(*1)で Netatalk によるファイルサーバーを作成しましたが、ここで共有するディレクトリと、今回のUMSがDLNA配信する際に参照するファイル群のディレクトリを合わせておくと、テレビで観たい動画があれば Finder からコピーして手軽に大画面視聴できるかと思います。

DLNA配信に利用するメディアファイルのパス指定は、環境変数 X_UMS_FOLDERS にて設定することができます。

(*1) DockerでmacOSファイル共有サーバをお手軽構築 - exlar's note

Entrykit の採用による環境変数活用の促進

UMSの設定は環境により差が生じやすいので、docker run 時の環境変数でチューニングできるようにしたい思いがありました。よくあるコンテナ作成テクニックとして、コンテナ起動時の初期化スクリプトで sed して置換をがんばる秘伝のタレをよく見かけますが、これは面倒くさい…

そんななか、たまたま Entrykit (Entrypoint tools for elegant, programmable containers) というプログラムに出会いました。何ができるのかというと、このまとめ紹介記事がとてもわかり易いです。Entrykit のすすめ - Qiita

設定ファイルを任意に変数化でき、環境変数の有無に応じて上書き or デフォルト値の反映が柔軟に行えるようになります。これがあれば、シンプルな用途であれば秘伝のタレスクリプトを作らなくてもよくなりそうですね。

では、よい動画視聴ライフを。