AWS
prometheus

AWS上でPrometheus構築(1)

タイトル通りAWS EC2上でPrometheus構築時のメモ

Alertingの設定は(2)で書く


前提

とりあえずnode exporter(監視される側)とPrometheus server(監視する側)のみ

また、デフォルトポートはなんかスキャン対象とかなっててもイヤだねえ精神により起動ポートを変更する

監視サーバ/監視対象サーバは同一のVPCに所属し、yumのupdate等、基本的な設定とかそういうのは済んでる前提

また、prometheus本体/node_exporter共に構築時点の最新リリースverなので構築前にバージョン新しくなってないか確認しようね

prometheusのオプションはv1とv2でちと違うらしく、ダッシュの本数が1個から2個になってたり、storage.local.*がなくなってたりするようなので、もしこの2億番煎じくらいの記事を資料として使う場合はそのあたりも気を付けよう


監視される側

t2.micro(el7)

プライベートサブネットに浮かぶ

prometheusを載せる予定のインスタンスからの通信を遮断しないようにセキュリティグループを確認しておこう

作業ユーザはroot

こちらはさほど語ることもなし


node_exporterの設置

mkdir /opt/prometheus

cd /opt/prometheus
wget https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz
tar -zxf node_exporter-0.17.0.linux-amd64.tar.gz
mv node_exporter-0.17.0.linux-amd64 node_exporter
rm -f node_exporter-0.17.0.linux-amd64.tar.gz


node_exporter起動オプションファイルの作成と設置

mkdir -p /etc/prometheus/node_exporter

vi /etc/prometheus/node_exporter/env_settings


/etc/prometheus/node_exporter/env_settings

OPTIONS="--web.listen-address=:9500"



service登録

vi /usr/lib/systemd/system/node_exporter.service


/usr/lib/systemd/system/node_exporter.service

[Unit]

# そのまんま、いわゆる説明
Description=PrometheusNodeExporter
# ネットワークを「利用」するサービスなのでネットワーク起動後に立ち上がるようにする
After=network.target
# ユニット起動前に該当パスが存在するか確認してくれる
ConditionPathExists=/opt/prometheus/node_exporter

[Service]
# プロセス起動と同時にサービスがグリーンと判断される 起動に時間がかかるようなモノの場合はnotifyでやるんかな?
Type=simple
# 環境変数設定ファイルフルパス systemdはユーザの環境変数は見ないのでこれで設定する
EnvironmentFile=/etc/prometheus/node_exporter/env_settings
# 実行ファイルフルパスとEnvironmentFileに設定されてる起動オプションが詰まった変数
ExecStart=/opt/prometheus/node_exporter/node_exporter $OPTIONS
# プロセスが異常終了したとき自動で再起動を実施してくれるらしい 監視なんだし再起動させよう
# 万全を考えるなら/var/log/messagesを監視して起動時にエラーループしてないか見るのが良いか?
Restart=always

[Install]
# WantedByはmulti-user.targetの起動と同時に起こしてもらえるようになる設定
# ちなみにec2で `systemctl get-default` 叩くと graphical.targetって出るんで一瞬「えっ!?」となったけどgraphical.targetの中身を見ると納得
# それについてはこの記事の最後の参考記事に載せてるのでそちらで
WantedBy=multi-user.target


追加したら確認

systemctl list-unit-files --type=service | grep node_exporter

disableって出ればok


反映と起動

systemctl daemon-reload

systemctl enable node_exporter
systemctl start node_exporter

終わったらprometheusサーバにする予定のインスタンスから

curl http://[[監視対象インスタンスプライベートIP]]:9500/metrics

叩いて、なんかすごい量の文字列が返ってきたらok


監視する側

t2.micro(el7)

パブリックサブネットに浮かぶ

作業ユーザはroot

EC2roleにEC2ReadOnlyAccessを持つRoleを割り当てておく

webuiを利用するため、あらかじめセキュリティグループに起動ポート(今回はTCP:9800)のマイIP許可をしたものをアタッチ


prometheusの設置

mkdir /opt/prometheus

cd /opt/prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.8.1/prometheus-2.8.1.linux-amd64.tar.gz
tar -zxf prometheus-2.8.1.linux-amd64.tar.gz
mv prometheus-2.8.1.linux-amd64 prometheusserver
rm -f prometheus-2.8.1.linux-amd64.tar.gz


prometheus設定ファイルの作成

cp /opt/prometheus/prometheusserver/prometheus.yml /opt/prometheus/prometheusserver/prometheus.yml.bk

vi /opt/prometheus/prometheusserver/prometheus.yml


/opt/prometheus/prometheusserver/prometheus.yml

global:

scrape_interval: 15s # 各exporterエンドポイントにアクセスするポーリング間隔
# ruleファイルに基づく評価を実施する間隔 scrapeと別軸になっているあたりDB見に行ってるんだろうなと推測される
# 設定が15sなら、発動時間の15秒前までのデータ見るとかなんだろうか
evaluation_interval: 15s

# alertmanager関連の設定 (2)でやる
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093

# 具体的な評価の仕方と評価結果によって何をするかを記述 alertingやる時にやるので後回し
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# 監視対象設定
# 初回だしシンプルにIPポート指定でいこうと思ったが俺もドヤ顔でサービスディスカバリィとか言いたかったのでec2_sd_configsを使うことに
# キーを記述しなきゃいけんような説明が多くて「え、うそやろこんなんでキー発行したくないで」と思い色々探したら
# prometheus serverが乗っかるインスタンスにEC2ReadOnlyが含まれるロールがアタッチされていればいけるっぽい
# relabelに関しては記事の最後にもっと参考になる記事のリンクを置くのでそちらで
scrape_configs:
- job_name: 'ec2-test'
ec2_sd_configs:
- region: '監視したいインスタンスがいるリージョン っていうかこれリージョンまたげるん…?'
port: 9500
relabel_configs:
- source_labels: [__meta_ec2_tag_Service]
regex: prom_test
action: keep
- source_labels: [__meta_ec2_tag_Name]
target_label: instance


書いたらシンタックスチェック

/opt/prometheus/prometheusserver/promtool check config /opt/prometheus/prometheusserver/prometheus.yml


prometheus起動オプションファイルの作成と設置

mkdir -p /etc/prometheus/prometheusserver

vi /etc/prometheus/prometheusserver/env_settings


/etc/prometheus/prometheusserver/env_settings

OPTIONS="--config.file=/opt/prometheus/prometheusserver/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --storage.tsdb.retention=2d --web.console.libraries=/opt/prometheus/prometheusserver/console_libraries --web.console.templates=/opt/prometheus/prometheusserver/consoles --web.listen-address=:9800"


テストだしデータは2dayで吹っ飛ぶように記述


service登録

vi /usr/lib/systemd/system/prometheus.service


/usr/lib/systemd/system/prometheus.service

[Unit]

Description=PrometheusServer
After=network.target
ConditionPathExists=/opt/prometheus/prometheusserver

[Service]
Type=simple
EnvironmentFile=/etc/prometheus/prometheusserver/env_settings
ExecStart=/opt/prometheus/prometheusserver/prometheus $OPTIONS
Restart=always

[Install]
WantedBy=multi-user.target


ほぼ一緒なので説明省略

確認

systemctl list-unit-files --type=service | grep prometheus


反映と起動

systemctl daemon-reload

systemctl enable prometheus
systemctl start prometheus

適当にブラウザで

http://[[監視インスタンスパブリックIP]]:9800/targets

画面が出て1個インスタンスが見えてればok

画面さえ出ない場合は

journalctl -u prometheus.service

とかで起動失敗してないか確認しよう


次にやること

Alertの設定と、あとfluentdを別件で利用するのでfluentdのプロセス監視設定入れる


参考

https://prometheus.io/docs/prometheus/latest/configuration/configuration/

https://qiita.com/stkhr/items/a847dd3c84146a194f02

https://qiita.com/ledmonster/items/5f2e1633d4124cb978fe

https://qiita.com/loftkun/items/4bd3bd3dcfd5864c1b6d