LoginSignup
0
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-28

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


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

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

といいつつもどんなexporterを入れればいいの?

公式ドキュメント exporter一覧

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

よし、整理しよう。

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

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

リソース系

node_exporterはHW&OS監視系の項目(コレクタ)を収集できるexporterらしい。
prometheusのnode_exporterの監視項目と設定例を見ると、分かりやすい。へー。コレクタの有効/無効とかあるのか。
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の時の起動スクリプトはどう書けばいいんだ・・・
コマンドヘルプ見てみるか。

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の所に書いてみる。

/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
}
編集前の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
編集後の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に書こう

/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でのさまざまな監視データ取得法

0
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
5