自宅サーバー監視用にGrafana/Prometheus/Loki/Alloyを立てた
自宅サーバー監視用にGrafana/Prometheus/Loki/Alloyを立てたので手順などメモっておく。
前提
趣味の自宅サーバー監視用のため、オンプレが前提で認証周りもテキトーか設定してません。
また、手軽さを考えてdocker-composeを使用しています。
設定値も最低限です。
必要なツールなど
Ubuntu 22.04.4 LTSでやっています。
- Docker/docker compose
作ったものまとめ
こちらのリポジトリに設定ファイル等置いてます。
こんな構成になる予定。
(必要なら) firewallの穴あけ
Grafana/Prometheus/Lokiをローカルネット内のみ穴あけする設定をしたが、必要な人のみ。
Alloyを稼働させるノードとGrafanaを使うノードは最低限穴あけする。
# Grafana
sudo ufw allow from <許可したいアドレス> to any port 3000
# Loki
sudo ufw allow from <許可したいアドレス> to any port 3100
# Prometheus
sudo ufw allow from <許可したいアドレス> to any port 9090
# Alloy UI
sudo ufw allow from <許可したいアドレス> to any port 12345
Grafana/Prometheus/Lokiの設定
docker networkの作成
ネットワーク内のコンテナ間で通信できるようにするために作成する。
今回はあとから別のdocker-compose.ymlで使用するかもだったので、docker networkを作成してそちらを使用するようにした。
docker network create monitoring-network
Grafana/Prometheus/Lokiの起動
データを永続化、失敗時再起動する状態で諸々起動する。
設定ファイルは以下の通り。Adminの認証情報は適宜修正してください。
docker-compose.ymlとして保存する。
version: "3.3"
networks:
monitoring-network:
external: true
services:
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
volumes:
# https://grafana.com/docs/loki/latest/setup/install/docker/
# https://hub.docker.com/r/grafana/loki
- './loki-data:/loki'
- './loki-config.yaml:/mnt/config/loki-config.yaml'
networks:
- monitoring-network
prometheus:
image: prom/prometheus:latest
command:
- "--web.enable-remote-write-receiver"
- "--config.file=/etc/prometheus/prometheus.yml"
ports:
- "9090:9090"
volumes:
# https://prometheus.io/docs/prometheus/latest/installation/#save-your-prometheus-data
- './prometheus.yml:/etc/prometheus/prometheus.yml'
- './prometheus-data:/prometheus'
restart: always
networks:
- monitoring-network
grafana:
image: grafana/grafana:latest
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- './grafana-data:/var/lib/grafana'
ports:
- "3000:3000"
restart: always
networks:
- monitoring-network
一通り起動する。
docker compose up
ちゃんと起動してるか確認。
docker ps
http://<Grafanaを立てたIP>:3000/
にアクセスできるかも確認。
Alloyの設定
インストール
こちらの手順でインストール。
設定・起動
基本的には以下を参考に設定。
- https://grafana.com/docs/alloy/latest/tutorials/send-logs-to-loki/
- https://grafana.com/docs/alloy/latest/collect/prometheus-metrics/
設定ファイルはこんな感じ。
Linuxホストのメトリクスを収集し、Prometheusにpushする。
Linuxホストのログを収集し、Lokiにpushする。
<prometheus addr>/<loki addr>
は立ててるIPアドレスに差し替えてください。
このファイルをconfig.alloyとして保存。
# Linuxホストのメトリクス収集・push
prometheus.exporter.unix "local_system" {
}
prometheus.scrape "scrape_metrics" {
targets = prometheus.exporter.unix.local_system.targets
forward_to = [prometheus.remote_write.metrics_service.receiver]
scrape_interval = "10s"
}
prometheus.remote_write "metrics_service" {
endpoint {
url = "http://<prometheus addr>:9090/api/v1/write"
}
external_labels = { "node" = "<your node name>" }
}
local.file_match "local_files" {
path_targets = [
{"__path__" = "/var/log/*.log"},
]
sync_period = "5s"
}
loki.source.file "log_scrape" {
targets = local.file_match.local_files.targets
forward_to = [loki.write.grafana_loki.receiver]
tail_from_end = true
}
loki.write "grafana_loki" {
endpoint {
url = "http://<loki addr>:3100/loki/api/v1/push"
}
}
設定ファイルを更新して、alloyを再起動。
sudo cp config.alloy /etc/alloy/config.alloy
sudo systemctl restart alloy
AlloyのUIに外部からアクセスできるようにする
デフォルトだとlocal networkからのみアクセス可能。
他からアクセスできるように/lib/systemd/system/alloy.service
のExecStart
に --server.http.listen-addr=<起動しているノードのIP>:12345
を追加する。
[Unit]
Description= Vendor-agnostic OpenTelemetry Collector distribution with programmable pipelines
Documentation=https://grafana.com/docs/alloy
Wants=network-online.target
After=network-online.target
[Service]
Restart=always
User=alloy
Environment=HOSTNAME=%H
Environment=ALLOY_DEPLOY_MODE=deb
EnvironmentFile=/etc/default/alloy
WorkingDirectory=/var/lib/alloy
ExecStart=/usr/bin/alloy run $CUSTOM_ARGS --server.http.listen-addr=<起動しているノードのIP>:12345 --storage.path=/var/lib/alloy/data $CONFIG_FILE
ExecReload=/usr/bin/env kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
Grafanaの設定
ここまでやればあとはhttp://<Grafanaを立てたIP>:3000/
にアクセスしてGrafana UI上でData sourcesを設定したら、メトリクス・ログが見れるようになる。
GrafanaとLoki/Promethesは同じdocker networkなので以下のURLを設定する。
- Loki: http://loki:3100
- Prometheus: http://prometheus:9090
試しにこんな感じで作ってみた。
- CPU usage
- A(CPU使用時間全体): sum by(cpu, node) (node_cpu_seconds_total{node="<node name>"})
- B(idle状態以外のCPU使用時間全体): sum by(cpu, node) (node_cpu_seconds_total{node="<node name>", mode!="idle"})
- 100*B/A
- Memory usage
- A(使用可能memory): node_memory_MemAvailable_bytes{node="<node name>"}
- B(全体memory): node_memory_MemTotal_bytes{node="<node name>"}
- 100*(B-A)/B
Discussion