タイトル通り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
OPTIONS="--web.listen-address=:9500"
service登録
vi /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
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
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
[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