LoginSignup
0
1

More than 1 year has passed since last update.

Prometheusを試してみる

Posted at

そういえば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のやつ)を追加する。

/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を再起動。

$ sudo systemctl restart prometheus

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

image.png

見えているようだ。

アラートを飛ばしてみる

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

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

/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)と、アラートルールを有効にする。

/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を再起動する。

$ sudo systemctl restart prometheus

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

image.png

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

image.png

実際のアラートを飛ばす前に、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が発火されている。
image.png

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

image.png

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

その他

ここまでやった時点のtopコマンドの画面は以下。
メモリとか全然余裕だ。昨日遊んだGrafana Lokiとの同居も行けるだろう。素晴らしい。
image.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1