そういえばPrometheusというとKubernetes/OpenShift経由のクソややこしい構成でしか使ったことがないなと思い、GWのこの暇な時間に最小構成で試してみようと思い立った。そのメモ。
環境
AWS Lightsailの$3.5の最小マシンで。OSはAmazon Linux 2で行ってみようか。
Prometheusのインストール
とりあえずFirst stepsを眺めつつ、tgzで提供されているのでそれを使う。
$ wget https://github.com/prometheus/prometheus/releases/download/v2.35.0/prometheus-2.35.0.linux-amd64.tar.gz
$ tar xvfz prometheus-*.tar.gz
$ cd prometheus-*
んで、とりあえずデフォルトの設定ファイルでprometheusを起動。
$ ./prometheus --config.file=prometheus.yml
Goのメッセージがつらつらと流れて、「"Server is ready to receive web requests."」と出る。
9090/tcpポートでWeb UIにアクセスできるので、AWS LightSailのファイアウォールを開けてアクセス。無認証なのでちょっと怖いが。
で、First stepの手順に従いちょろちょろQuery流したりGraphを表示してみる。まあ、面白いことは特にない。
Ctrl+Cで一旦Prometheusを止め、systemdで起動するように修正。
$ cd ~
$ sudo mkdir /prometheus
$ sudo cp -R prometheus-2.35.0.linux-amd64/* /prometheus/
$ cat > prometheus.service << EOF
[Unit]
Description=prometheus
After=network.target
[Service]
Type=simple
ExecStart=/prometheus/prometheus --config.file=/prometheus/prometheus.yml
Restart=always
[Install]
WantedBy=multi-user.target
EOF
$ sudo cp prometheus.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl start prometheus
$ sudo systemctl enable prometheus
ローカルサーバーのメトリクスを集める
手始めに、ローカルサーバーのCPUとかメモリ使用率を集めるか。
node_exporterを導入する。面倒だし最初からsystemdで起動。
https://prometheus.io/docs/guides/node-exporter/
$ wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
$ tar xvfz node_exporter-*.*-amd64.tar.gz
$ sudo cp node_exporter-*.*-amd64/node_exporter /prometheus/
$ cat > node_exporter.service << EOF
[Unit]
Description=node_exporter
After=network.target
[Service]
Type=simple
ExecStart=/prometheus/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
EOF
$ sudo cp node_exporter.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl start node_exporter
$ sudo systemctl enable node_exporter
node_exporter起動後、Prometheusがnode_exporterを読みに行くよう設定する。
Prometheusの設定ファイルを以下のように修正。static_configsにlocalhostのnode_exporter(9100のやつ)を追加する。
(一部抜粋)
...
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- targets: ['localhost:9100']
変更したらPrometheusを再起動。
$ sudo systemctl restart prometheus
Prometheus再起動後、PrometheusのUIからnode_exporterのメトリクスが参照できるかを確認する。
「node_filesystem_avail_bytes」とかでクエリを掛けてみる。
見えているようだ。
アラートを飛ばしてみる
ついでにディスク使用率とかでアラートを飛ばしてみよう。
ここら辺から少し敷居が高い。
Alert Managerを導入する。
https://prometheus.io/docs/alerting/latest/configuration/
$ wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
$ tar xvzf alertmanager-0.24.0.linux-amd64.tar.gz
$ sudo cp alertmanager-*-amd64/alertmanager /prometheus/
$ sudo cp alertmanager-*-amd64/alertmanager.yml /prometheus/
$ cat > alertmanager.service << EOF
[Unit]
Description=alertmanager
After=network.target
[Service]
Type=simple
ExecStart=/prometheus/alertmanager --config.file=/prometheus/alertmanager.yml
Restart=always
[Install]
WantedBy=multi-user.target
EOF
$ sudo cp alertmanager.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl start alertmanager
$ sudo systemctl enable alertmanager
Prometheusにアラートルールを設定する。
まずは、以下のルールファイルを作る。
groups:
- name: alertrules-fs
rules:
- alert: HighDiskUsage-root
expr: node_filesystem_free_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} < 0.2
for: 1m
labels:
severity: critical
annotations:
summary: High Disk Usage ("/")
PrometheusでAlertManager(ターゲットがlocalhost:9093)と、アラートルールを有効にする。
(一部抜粋)
...
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "alertrules-fs.yml"
...
ファイルを修正したら、prometheusを再起動する。
$ sudo systemctl restart prometheus
Prometheus再起動後、UIにアクセスするとAlertが追加されたのが確認できる。
AlertMangerが追加されたのは「Status」>「Runtime & Build Information」から確認できる。
実際のアラートを飛ばす前に、AlertManagerのデフォルト設定ではlocalhost:5001にWebHookを飛ばすようになっているため、そのPOSTを受け取る受け取るアプリを作っておく。
まあ、pythonのhttp.serverでいいか。
$ cat > webhook << EOF
#! /usr/bin/python3
import http.server
class h(http.server.BaseHTTPRequestHandler):
def do_POST(self):
l = int(self.headers['content-length'])
print('body = {}'.format(self.rfile.read(l).decode('utf-8')))
self.send_response(200)
self.send_header("Content-type", "text/plain; charset=UTF-8")
self.send_header("Content-Length", "0")
self.end_headers()
a = ('localhost', 5001)
s = http.server.HTTPServer(a, h)
s.serve_forever()
EOF
$ chmod 700 webhook
$ sudo cp webhook /prometheus/
$ cat > webhook.service << EOF
[Unit]
Description=webhook
After=network.target
[Service]
Type=simple
ExecStart=/prometheus/webhook
Restart=always
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target
EOF
$ sudo cp webhook.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl start webhook
$ sudo systemctl enable webhook
んでは、AlertをActiveにしてみよう。dfコマンドで確認するに、EC2の仮想マシンの"/"FSの総容量が20Gくらいで、OSとかPrometheusのバイナリとかで2GBくらい使っているので、16GBのファイルを作成する。
$ fallocate -l 16G dummy
コマンド実行後、dfコマンドで再度確認すると"/"の残り容量が91%。
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 237048 0 237048 0% /dev
tmpfs 244868 0 244868 0% /dev/shm
tmpfs 244868 448 244420 1% /run
tmpfs 244868 0 244868 0% /sys/fs/cgroup
/dev/xvda1 20959212 18975528 1983684 91% /
tmpfs 48976 0 48976 0% /run/user/1000
1分ほど後、PrometheusのAlertを確認すると、確かにAlertが発火されている。
Webhookの受け取りはjournaldというか、/var/log/messagesで確認できる。
うんまあ、良いんじゃないか。
その他
ここまでやった時点のtopコマンドの画面は以下。
メモリとか全然余裕だ。昨日遊んだGrafana Lokiとの同居も行けるだろう。素晴らしい。