InfluxDB専用のメトリックスコレクタTelegrafを使ってみた


本エントリではInfluxDB, Grafana, Telegrafを組合せてサーバリソースやデータベースリソースを格納する方法について記載します。

またTelegrafでのプラグインの書き方については記載しません。

# Telegrafとは

Telegrafとは[2015/06/19に発表](https://influxdb.com/blog/2015/06/19/Announcing-Telegraf-a-metrics-collector-for-InfluxDB.html)されたInfluxDB専用のGo言語で書かれたメトリクスコレクタ(エージェント)で、fluentdなどの中間層をはさまず、InfluxDBに最適化されたデータ格納をしてくれるエージェントです。

プラグインアーキテクチャを採用しており、取得するメトリクスを追加したりカスタマイズすることが可能です。

詳細は下記をご覧ください。

* ソースコード
 * https://github.com/influxdb/telegraf
* InfluxDB Blogの記事
 * https://influxdb.com/blog/2015/06/19/Announcing-Telegraf-a-metrics-collector-for-InfluxDB.html
 * http://yakst.com/ja/posts/2653

# インストール

Mac OSですとbrew、Debian系、RedHat系のOSに対しては、パッケージ(rpm, deb)が提供されており、簡単にセットアップすることができます。

# コンフィグ

どこにデータを送るか、どんな間隔で何を取得するか、などをコンフィグファイルに記載し、Telegrafはそのコンフィグファイルを指定して起動します。

/opt/telegrafディレクトリで下記コマンドを発行するとコンフィグのサンプルを標準出力に出力することができ、それをベースに編集できます。

```bash
$ ./telegraf -sample-config
```

## 接続先の設定

コンフィグファイルの[Influxdb]セクションを編集します。

url, database, username, passwordが通常必須項目となるでしょう。
サンプルファイルによると追加の設定として、POST時のユーザーエージェントの設定が可能であり、ログ識別に活用できるようです。

```bash
# Configuration for influxdb server to send metrics to
[influxdb]
# The full HTTP endpoint URL for your InfluxDB instance
url = "http://localhost:8086" # required.

# The target database for metrics. This database must already exist
database = "telegraf" # required.

# username = "telegraf"
# password = "metricsmetricsmetricsmetrics"

# Set the user agent for the POSTs (can be useful for log differentiation)
# user_agent = "telegraf"
# tags = { "dc": "us-east-1" }
```

**2015/09/22追記:**

InfluxDB以外の出力先にも対応するように変更されており、これに伴いセクション名が

```
[outputs]
[outputs.influxdb]
```

と変更されている。

[Telegraf updates(0.1.8)](http://qiita.com/takaidohigasi/items/335d8b4a13242e08a4d5)に最近の変更についてまとめたので合わせて参照いただきたい。

## エージェント全体の設定

コンフィグファイルの[agent]セクションを設定します

```bash
# Configuration for telegraf itself
# [agent]
# interval = "10s"
# debug = false
# hostname = "prod3241"
```

* interval: メトリクス収集間隔のデフォルト値と思われます。
* hostname: 記載しない場合、そのホスト名が入るようです。本パラメータの値がhostタグの値として設定されInfluxDBに送付されます。
* debug: Telegrafを起動する時にdebugオプションをつけた動作と同様の効果があると思われます。trueに設定すると、標準出力に取得したメトリクスなどが出力されます。

また、host以外のタグを追加で付与する設定を[influxdb.tags]で行うことができます

```bash
[influxdb.tags]
dc = "us-east-1"
```

## 取得メトリクスの設定

本記事記載時点では、下記のメトリックが取得可能です([README.md](https://github.com/influxdb/telegraf/blob/master/README.md)より)

* System (memory, CPU, network, etc.)
* Docker
* MySQL
* Prometheus (client libraries and exporters)
* PostgreSQL
* Redis
* RethinkDB
* Kafka

### 利用プラグインの指定

コンフィグファイルには収集するプラグイン名のセクションを記載すると、そのメトリクスが取得されます。

例えば下記の例では、MySQLのメトリクスは収集されますが、PostgreSQLに関しては収集されません。

https://github.com/takaidohigasi/telegraf-sample/blob/master/roles/telegraf/templates/telegraf.toml.j2

### 各プラグインの設定

各プラグインには、

* pass: 送付するメトリクス
* drop: 送付しないメトリクス
* interval: 取得間隔

が指定できます。pass/dropはprefixで指定します。優先順位については未調査です。
プラグインによっては情報を取得するため追加のパラメータが必要となることがあります。

例) localhost上のMySQLメトリクス(mysql_innodb, mysql_handler, mysql_commands始まり以外)を収集する場合

```
[mysql]
servers = ["localhost"] # 接続先および認証情報
drop = ["mysql_innodb", "mysql_handler", "mysql_commands"]
```

**2015/09/22追記:**

* tagpass
* tagdrop

タグが追記されている。[Telegraf updates(0.1.8)](http://qiita.com/takaidohigasi/items/335d8b4a13242e08a4d5)に最近の変更についてまとめたので合わせて参照いただきたい。


# 動作確認

コンフィグを作成し終わったらテストモードで動作を確認します。

## 取得メトリクスの確認

接続先以外のエージェント側の設定が想定通りかどうかを確認できます

```bash
[vagrant@client-node telegraf]$ ./telegraf -config telegraf.toml -test
* Plugin: cpu
> [cpu="cpu0"] cpu_user value=46.52
> [cpu="cpu0"] cpu_system value=32.88
> [cpu="cpu0"] cpu_idle value=13044.02
> [cpu="cpu0"] cpu_nice value=5.47
> [cpu="cpu0"] cpu_iowait value=12.39
(略)
> [cpu="cpu0"] cpu_stolen value=0
* Plugin: mem
> [] mem_total value=1020344000
> [] mem_available value=915324000
> [] mem_used value=452728000
(略)
> [] mem_shared value=0
* Plugin: mysql
> [] mysql_bytes_received value=137439
> [] mysql_bytes_sent value=7734884
> [] mysql_queries value=3121
> [] mysql_slow_queries value=0
> [] mysql_threads_cached value=0
> [] mysql_threads_connected value=1
> [] mysql_threads_created value=1043
> [] mysql_threads_running value=1
```

[]はデータに付与されるノードで共通のもの(通常はhostタグ)以外のタグを示しています。タグ付けをうまくやってくれる点、series(InfluxDB上でのテーブル相当)が細かく分かれており、参照する際の性能向上に寄与する格納方式となっていることなどが推察されます。

例えばマルチコアの環境でCPUのメトリクスを収集する場合も、データの扱いが面倒となることがありません。

MySQLプラグインの出力結果は`drop = ["mysql_innodb", "mysql_handler", "mysql_commands"]`のものです。


# エージェントの起動

```bash
[vagrant@client-node telegraf]$ ./telegraf -config telegraf.toml
2015/07/19 11:56:51 InfluxDB Agent running
2015/07/19 11:56:51 Loaded plugins: cpu disk io mem mysql
2015/07/19 11:56:51 Debug: enabled
2015/07/19 11:56:51 Agent Config: Interval:10s, Debug:true, Hostname:"client-node"
2015/07/19 11:56:51 Sending metrics to: http://192.168.33.3:8086
2015/07/19 11:56:51 Tags enabled: host=client-node
```

この時点で接続の設定がうまくいっていない場合エラーが発生します。(下記はInfluxDBを停止しておいた場合)

```
2015/07/19 11:59:50 Error in plugins: Post http://192.168.33.3:8086/write?consistency=&db=influxdb&precision=&rp=: dial tcp 192.168.33.3:8086: connection refused
```

なお、エージェントプロセスはdaemon化されないようですので、daemon化は自前で行う必要があるようです。

参考となりますが、コンフィグの指定以外にもテストモードなどが指定できるようです。

```bash
$ ./telegraf -help
Usage of ./telegraf:
  -config="": configuration file to load
  -debug=false: show metrics as they're generated to stdout
  -httptest.serve="": if non-empty, httptest.NewServer serves on this address and blocks
  -pidfile="": file to write our pid to
  -sample-config=false: print out full sample configuration
  -test=false: gather metrics, print them out, and exit
  -version=false: display the version
```

**2015/07/19 追記**

 CentOSでは/etc/init.dのスクリプトが登録されておりserviceコマンドで起動停止ができます。
 /etc/opt/telegraf/telegraf.confが-configオプションに渡された状態で起動されます

```bash
$ service telegraf start
```

# Sample

InfluxDB 0.9.x, Grafana 2.0.x, TelegrafでCentOS上でメトリクスを収集するサンプルのPlaybookを作成しました。

本記事はエジェント側に焦点をあてて記載しましたがInfluxDB, Grafana側の設定や動作確認に関しては下記を参考にしてください。

https://github.com/takaidohigasi/telegraf-sample

**Grafanaの画面サンプル**

![grafana.png](https://qiita-image-store.s3.amazonaws.com/0/7625/737825a3-d63e-8663-7c14-1a26badf8d5e.png "grafana.png")