Prometheusのすすめ - exporter導入 node-exporter(apt-get) -

[Prometheusのすすめ- Service Discovery -](https://qiita.com/nekoneck/items/aefdbb9d2a1bb1f03513)の続き。
本記事では、Prometheusを知らない人が試しながら調べながらエラー対応も含め記載していってます。
ので情報として煩雑な感じになっているのでご了承ください。

---



前回でService Discoveryを使ってサーバは勝手に認識するようになったけど、
結局exporterを入れてないから、色々な値は取れない。


本来だったら管理すべきサーバは構築時点で必要なexporterは入れておきたい所。
既に構築してあるサーバにも導入していくのも踏まえて、とりあえずAnsibleで導入してみよう。


## といいつつもどんなexporterを入れればいいの？
[公式ドキュメント exporter一覧](https://prometheus.io/docs/instrumenting/exporters/)


調べると種類が一杯あるじゃーん。。。

よし、整理しよう。

出来るかどうか分からないけど、
監視しておきたい項目を書いていこう。

* リソース監視
 * CPUリソース
 * メモリリソース
 * ディスクリソース
 * ロードアベレージ
* プロセス監視
 * nginx
 * MySQL
 * php-fpm
 * uwsgi  
 ※ というか必要なプロセス
* 各MW系のステータス
* ログ監視

## リソース系
node_exporterはHW＆OS監視系の項目(コレクタ)を収集できるexporterらしい。
[prometheusのnode_exporterの監視項目と設定例](https://qiita.com/kanga/items/21acb042237f8a27f437)を見ると、分かりやすい。へー。コレクタの有効/無効とかあるのか。
exporter側の起動オプションで変える感じか。

上に挙げた項目だと以下を有効にする感じかな。
それ以外にも障害時に役たちそうな物を有効化しておこう。

* meminfo
* stat
* loadavg
* filesystem
* uname
* diskstat
* netdev

有効にするコレクタが多いと負荷が多くなりそうなので、それ以外は無効で。

という訳で、Ansible的にはこうかな。（最初の記事でも書いたけど、node_exporterはaptで）
### コレクタの有効化とAnsible
```
# vi node-exporter.yml
- hosts: samplehost
  user: sampleuser
  sudo: yes
  tasks:
  - name: apt-get install node-exporter
    apt: pkg=prometheus-node-exporter update_cache=yes cache_valid_time=3600

```
ここまで書いて後はUbuntu16.04だしsystemdの編集をAnsibleに書かないとなー。と思ってたら、/etc/init.d/配下に起動スクリプト発見。
aptで入れるとinit.d経由なのね。
init.dの時の起動スクリプトはどう書けばいいんだ・・・
コマンドヘルプ見てみるか。

```plaintext:prometheus-node-exporter
Usage of prometheus-node-exporter:
  -auth.pass string
        Password for basic auth.
  -auth.user string
        Username for basic auth.
  -collector.diskstats.ignored-devices string
        Regexp of devices to ignore for diskstats. (default "^(ram|loop|fd|(h|s|v|xv)d[a-z])\\d+$")
  -collector.filesystem.ignored-mount-points string
        Regexp of mount points to ignore for filesystem collector. (default "^/(sys|proc|dev)($|/)")
  -collector.ipvs.procfs string
        procfs mountpoint. (default "/proc")
  -collector.megacli.command string
        Command to run megacli. (default "megacli")
  -collector.netdev.ignored-devices string
        Regexp of net devices to ignore for netdev collector. (default "^$")
  -collector.ntp.server string
        NTP server to use for ntp collector.
  -collector.textfile.directory string
        Directory to read text files with metrics from.
  -collectors.enabled string
        Comma-separated list of collectors to use. (default "diskstats,filesystem,loadavg,meminfo,stat,textfile,time,netdev,netstat")
  -collectors.print
        If true, print available collectors and exit.
  -debug.memprofile-file string
        Write memory profile to this file upon receipt of SIGUSR1.
  -log.level value
        Only log messages with the given severity or above. Valid levels: [debug, info, warn, error, fatal, panic]. (default info)
  -web.listen-address string
        Address on which to expose metrics and web interface. (default ":9100")
  -web.telemetry-path string
        Path under which to expose metrics. (default "/metrics")
```

BASIC認証あるやん。。。
となると、Prometheusでその情報を何処かに入れる事が出来るって事か。

ひとまず有効にするコレクタのオプションは以下かな？

-collectors.enabled=meminfo,stat,loadavg,filesystem,uname,diskstat,netdev

起動スクリプトのARGSの所に書いてみる。

```bash:/etc/init.d/prometheus-node-exoprter
#!/bin/sh
# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing.
if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then
    set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script
fi
### BEGIN INIT INFO
# Provides:          prometheus-node-exporter
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Prometheus exporter for machine metrics
# Description:       Prometheus exporter for machine metrics, written in Go
#                    with pluggable metric collectors.
### END INIT INFO

# Author: Martin Ferrari <tincho@debian.org>

DESC="Prometheus exporter for machine metrics"
DAEMON=/usr/bin/prometheus-node-exporter
NAME=prometheus-node-exporter
USER=prometheus
PIDFILE=/var/run/prometheus/prometheus-node-exporter.pid
LOGFILE=/var/log/prometheus/prometheus-node-exporter.log

HELPER=/usr/bin/daemon
HELPER_ARGS="--name=$NAME --output=$LOGFILE --pidfile=$PIDFILE --user=$USER"

ARGS="-collectors.enabled=meminfo,stat,loadavg,filesystem,uname,diskstat,netdev"
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

do_start_prepare()
{
    mkdir -p `dirname $PIDFILE` || true
    chown -R $USER: `dirname $LOGFILE`
    chown -R $USER: `dirname $PIDFILE`
}

do_start_cmd()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    $HELPER $HELPER_ARGS --running && return 1
    $HELPER $HELPER_ARGS -- $DAEMON $ARGS || return 2
    return 0
}

do_stop_cmd()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
    $HELPER $HELPER_ARGS --running || return 1
    $HELPER $HELPER_ARGS --stop || return 2
    # wait for the process to really terminate
    for n in 1 2 3 4 5; do
        sleep 1
        $HELPER $HELPER_ARGS --running || break
    done
    $HELPER $HELPER_ARGS --running || return 0
    return 2
}
```


```plaintext:編集前のps-ef
# ps -ef | grep prometheus
prometh+  1826     1  0 Jun27 ?        00:00:00 /usr/bin/daemon --name=prometheus-node-exporter --output=/var/log/prometheus/prometheus-node-exporter.log --pidfile=/var/run/prometheus/prometheus-node-exporter.pid --user=prometheus -- /usr/bin/prometheus-node-exporter -collector.diskstats.ignored-devices="^(ram|loop|fd)\\d+$
prometh+  1827  1826  0 Jun27 ?        00:01:12 /usr/bin/prometheus-node-exporter -collector.diskstats.ignored-devices="^(ram|loop|fd)\\d+$
root      6240  6126  0 17:51 pts/2    00:00:00 grep --color=auto prometheus
```
```plaintext:編集後のps-ef
# ps -ef | grep prometheus
matsuza+  6309  6302  0 18:08 pts/1    00:00:00 ssh -i /home/matsuzaki/.ssh/ap-bastion01-matsuzaki da-dev@ap-prometheus01 -p 2201
prometh+  6502     1  0 18:17 ?        00:00:00 /usr/bin/daemon --name=prometheus-node-exporter --output=/var/log/prometheus/prometheus-node-exporter.log --pidfile=/var/run/prometheus/prometheus-node-exporter.pid --user=prometheus -- /usr/bin/prometheus-node-exporter -collector.diskstats.ignored-devices="^(ram|loop|fd)\\d+$
prometh+  6503  6502  0 18:17 ?        00:00:00 /usr/bin/prometheus-node-exporter -collector.diskstats.ignored-devices="^(ram|loop|fd)\\d+$
root      6509  6126  0 18:17 pts/2    00:00:00 grep --color=auto prometheus
```
んー。変わってない。

`http://localhost:9100/metrics` で見ても他のコレクタが有効になってる気がする。。。

起動スクリプトに起動する前にARGSをechoするようにしてみよ。

```
# /etc/init.d/prometheus-node-exporter stop
 * Stopping Prometheus exporter for machine metrics prometheus-node-exporter                                  [ OK ]r

# /etc/init.d/prometheus-node-exporter start
 * Starting Prometheus exporter for machine metrics prometheus-node-exporter                                         
-collector.diskstats.ignored-devices="^(ram|loop|fd)\d+$
                                                                                                              [ OK ]
```
あー。どうやら、/etc/default/prometheus-node-exporterに書けば良いみたい。
### init.dでの起動オプションは/etc/default/prometheus-node-exporterに書こう

```plaintext:/etc/default/prometheus-node-exporter

# Set the command-line arguments to pass to the server.
ARGS='-collector.diskstats.ignored-devices="^(ram|loop|fd)\\d+$ --collectors.enabled=meminfo,stat,loadavg,filesystem,uname,diskstat,netdev'

# Prometheus-node-exporter supports the following options:
#  -auth.pass="": Password for basic auth.
#  -auth.user="": Username for basic auth.
#  -collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[a-z])\\d+$": Regexp of devices to ignore for diskstats.
#  -collector.filesystem.ignored-mount-points="^/(sys|proc|dev)($|/)": Regexp of mount points to ignore for filesystem collector.
#  -collector.ipvs.procfs="/proc": procfs mountpoint.
#  -collector.megacli.command="megacli": Command to run megacli.
#  -collector.ntp.server="": NTP server to use for ntp collector.
#  -collector.textfile.directory="": Directory to read text files with metrics from.
#  -collectors.enabled="diskstats,filesystem,loadavg,meminfo,stat,textfile,time,netdev,netstat": Comma-separated list of collectors to use.
#  -collectors.print=false: If true, print available collectors and exit.
#  -debug.memprofile-file="": Write memory profile to this file upon receipt of SIGUSR1.
#  -log.level=info: Only log messages with the given severity or above. Valid levels: [debug, info, warn, error, fatal, panic].
#  -web.listen-address=":9100": Address on which to expose metrics and web interface.
#  -web.telemetry-path="/metrics": Path under which to expose metrics.
```

よし、もう一度。

```
# /etc/init.d/prometheus-node-exporter stop
 * Stopping Prometheus exporter for machine metrics prometheus-node-exporter                                  [ OK ]
# /etc/init.d/prometheus-node-exporter start
 * Starting Prometheus exporter for machine metrics prometheus-node-exporter                                         
-collector.diskstats.ignored-devices="^(ram|loop|fd)\d+$ -collectors.enabled=meminfo,stat,loadavg,filesystem,uname,diskstat,netdev
                                                                                                              [ OK ]
# ps -ef | grep prometheus
root      6747  6126  0 18:35 pts/2    00:00:00 grep --color=auto prometheus
```
OKなのに起動してないとは。。。ログ見よー。

```
# tail /var/log/prometheus/prometheus-node-exporter.log
time="2018-06-28T18:23:04+09:00" level=info msg=" - loadavg" file="node_exporter.go" line=144
time="2018-06-28T18:23:04+09:00" level=info msg=" - textfile" file="node_exporter.go" line=144
time="2018-06-28T18:23:04+09:00" level=info msg=" - netdev" file="node_exporter.go" line=144
time="2018-06-28T18:23:04+09:00" level=info msg=" - diskstats" file="node_exporter.go" line=144
time="2018-06-28T18:23:04+09:00" level=info msg=" - meminfo" file="node_exporter.go" line=144
time="2018-06-28T18:23:04+09:00" level=info msg=" - stat" file="node_exporter.go" line=144
time="2018-06-28T18:23:04+09:00" level=info msg=" - time" file="node_exporter.go" line=144
time="2018-06-28T18:23:04+09:00" level=info msg=" - netstat" file="node_exporter.go" line=144
time="2018-06-28T18:23:04+09:00" level=info msg="Starting node_exporter v0.0.0.dev at :9100" file="node_exporter.go" line=176
time="2018-06-28T18:35:13+09:00" level=fatal msg="Couldn't load collectors: collector 'uname' not available" file="node_exporter.go" line=139
```
unameのコレクタが無いとな？　バージョンのせいかな？
node-exporterのコマンドヘルプを眺めてるとcolletors.printなるオプションがあったので表示してみる

```
# prometheus-node-exporter -collectors.print
Available collectors:
 - bonding
 - diskstats
 - filesystem
 - gmond
 - interrupts
 - ipvs
 - lastlogin
 - loadavg
 - megacli
 - meminfo
 - netdev
 - netstat
 - ntp
 - runit
 - stat
 - tcpstat
 - textfile
 - time
```

うん。ないね。

# 結論

apt-getは辞めます。

次はバイナリで入れるのを試します。


##参考
[Prometheusでのさまざまな監視データ取得法](https://knowledge.sakura.ad.jp/12057/)