Prometheusのすすめ- Service Discovery -の続き。
本記事では、Prometheusを知らない人が試しながら調べながらエラー対応も含め記載していってます。
ので情報として煩雑な感じになっているのでご了承ください。
前回でService Discoveryを使ってサーバは勝手に認識するようになったけど、
結局exporterを入れてないから、色々な値は取れない。
本来だったら管理すべきサーバは構築時点で必要なexporterは入れておきたい所。
既に構築してあるサーバにも導入していくのも踏まえて、とりあえずAnsibleで導入してみよう。
といいつつもどんな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の時の起動スクリプトはどう書けばいいんだ・・・
コマンドヘルプ見てみるか。
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の所に書いてみる。
#!/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 | 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 | 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に書こう
# 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は辞めます。
次はバイナリで入れるのを試します。