Prometheusを試してみる

そういえばPrometheusというとKubernetes/OpenShift経由のクソややこしい構成でしか使ったことがないなと思い、GWのこの暇な時間に最小構成で試してみようと思い立った。そのメモ。

# 環境
AWS Lightsailの$3.5の最小マシンで。OSはAmazon Linux 2で行ってみようか。

# Prometheusのインストール
とりあえずFirst stepsを眺めつつ、tgzで提供されているのでそれを使う。

```bash
$ 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を起動。

```bash
$ ./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で起動するように修正。

```bash
$ 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/

```bash
$ 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のやつ)を追加する。

```yaml:/prometheus/prometheus.yml
（一部抜粋）
...
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を再起動。

```bash
$ sudo systemctl restart prometheus
```

Prometheus再起動後、PrometheusのUIからnode_exporterのメトリクスが参照できるかを確認する。
「node_filesystem_avail_bytes」とかでクエリを掛けてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/a345b83d-f7ea-f53f-902f-808d31a36737.png)

見えているようだ。

# アラートを飛ばしてみる
ついでにディスク使用率とかでアラートを飛ばしてみよう。
ここら辺から少し敷居が高い。

Alert Managerを導入する。
https://prometheus.io/docs/alerting/latest/configuration/

```bash
$ 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にアラートルールを設定する。
まずは、以下のルールファイルを作る。

```yaml:/prometheus/alertrules-fs.yml
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）と、アラートルールを有効にする。

```yaml:/prometheus/prometheus.yml
（一部抜粋）
...
# 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を再起動する。

```bash
$ sudo systemctl restart prometheus
```

Prometheus再起動後、UIにアクセスするとAlertが追加されたのが確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/ecf4810a-8215-8cd1-b140-2ca08da4cfd1.png)

AlertMangerが追加されたのは「Status」>「Runtime & Build Information」から確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/6ccc6734-49b7-62af-f396-0db1053430bb.png)

実際のアラートを飛ばす前に、AlertManagerのデフォルト設定ではlocalhost:5001にWebHookを飛ばすようになっているため、そのPOSTを受け取る受け取るアプリを作っておく。
まあ、pythonのhttp.serverでいいか。

```bash
$ 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のファイルを作成する。

```bash
$ 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
```

１分ほど後、PrometheusのAlertを確認すると、確かにAlertが発火されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/2b16e01b-5f59-57d2-c442-193fbb19b510.png)

Webhookの受け取りはjournaldというか、/var/log/messagesで確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/b59b089a-1ca1-3b5f-579b-7d2afc1d9802.png)

うんまあ、良いんじゃないか。


# その他
ここまでやった時点のtopコマンドの画面は以下。
メモリとか全然余裕だ。[昨日遊んだGrafana Loki](https://qiita.com/rk05231977/items/adba496b8523addd0d27)との同居も行けるだろう。素晴らしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/c2fc15b0-932b-2a51-9870-a4e8671795b0.png)