👁️

自宅サーバー監視用にGrafana/Prometheus/Loki/Alloyを立てた

に公開

自宅サーバー監視用にGrafana/Prometheus/Loki/Alloyを立てたので手順などメモっておく。

前提

趣味の自宅サーバー監視用のため、オンプレが前提で認証周りもテキトーか設定してません。
また、手軽さを考えてdocker-composeを使用しています。
設定値も最低限です。

必要なツールなど

Ubuntu 22.04.4 LTSでやっています。

  • Docker/docker compose

作ったものまとめ

こちらのリポジトリに設定ファイル等置いてます。
https://github.com/pei223/onpre-monitoring-configuration

こんな構成になる予定。

(必要なら) 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/set-up/install/linux/#install-grafana-alloy-on-linux

設定・起動

基本的には以下を参考に設定。

設定ファイルはこんな感じ。

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からのみアクセス可能。
https://grafana.com/docs/alloy/latest/configure/linux/#expose-the-ui-to-other-machines

他からアクセスできるように/lib/systemd/system/alloy.serviceExecStart --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を設定する。


試しにこんな感じで作ってみた。

  • 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