Prometheus・Loki と Quadlet による監視基盤
Mac mini にメトリクスとログを集約し、3 台のホストと RouterOS を監視します。インフラ構築・運用監視で使う Prometheus、Loki、Quadlet の設定と移行状況をまとめました。
監視を集約した構成
ローカル開発基盤の監視を Storage Server(Mac mini, Ubuntu 24.04)に集めました。24/7 稼働させ、Compute Server や Desktop PC が停止してもメトリクスとログを収集します。
サービス管理は compose + systemd から Quadlet に移しました。.container から systemd unit を生成し、アクセス対象に応じて rootful と rootless を分けています。
| 収集対象 | 経路 | 保存先 |
|---|---|---|
| ホストメトリクス(3台) | node_exporter → Prometheus | Storage Server |
| ディスク健全性(2台) | smartctl_exporter → Prometheus | Storage Server |
| RouterOS メトリクス | MKTXP (API) → Prometheus | Storage Server |
| MinIO メトリクス | /minio/v2/metrics/cluster → Prometheus | Storage Server |
| RouterOS / Netgear syslog | UDP 1514 (rfc3164) → Promtail → Loki | Storage Server |
| Linux ログ | journal / ファイル → Promtail → Loki | Storage Server |
| 可視化 | Grafana (Desktop PC) → Prometheus + Loki | Desktop PC |
ハードウェアとストレージ
| 項目 | 内容 |
|---|---|
| 筐体 | Mac mini late 2018 (x86) |
| CPU | Core i3 |
| RAM | DDR4 SO-DIMM 8GB |
| Storage | SSD 2TB (OS, LVM), ext M.2 SSD 4TB (LUKS → /mnt/data) |
| NIC | 1GbE + ext 10GbE (RTL8159, 10.10.10.3) |
nvme0n1 (1.8T) → LVM → / (100G)
nvme1n1 (3.6T) → LUKS → /mnt/data (archive, backups, object storage)
OS は Ubuntu 24.04.3 LTS です。NTP と DNS はルーターを参照し、タイムゾーンは UTC に揃えました。
Quadlet サービス構成
初期構成では、prometheus、loki、promtail の専用ユーザーと podman-compose@.service で rootless 運用していました。その後、Quadlet に移し、必要な権限ごとに分けました。
/opt/containers/systemd/
├── rootful/
│ ├── node-exporter.container
│ ├── promtail.container
│ └── smartctl-exporter.container
└── rootless/
├── loki.container
├── minio.container
├── mktxp.container
└── prometheus.container
rootful / rootless の分離基準
| スコープ | 配置先 | 理由 |
|---|---|---|
| rootful | node-exporter, promtail, smartctl | ホストの /、/var/log/journal、SMART デバイスへのアクセスが必要 |
| rootless | prometheus, loki, mktxp, minio | ネットワーク経由のデータ収集・保存のみ。ホストデバイスへの直接アクセス不要 |
node_exporter は Network=host と Volume=/:/host:ro,rslave を使うため rootful にしました。promtail も /var/log/journal の参照と UDP 1514 の受信が必要です。smartctl_exporter はディスクに直接アクセスします。
Quadlet の動作検証と UID マッピングの詳細は Rootless Podman + Quadlet によるコンテナ運用基盤の構築 を参照。
Prometheus 設定
全 7 job で 3 台のホストと RouterOS、MinIO をカバーしている。
global:
scrape_interval: 30s
evaluation_interval: 30s
scrape_configs:
- job_name: prometheus
static_configs:
- targets:
- storage.home.arpa:9090
- job_name: node-exporter
static_configs:
- targets:
- storage.home.arpa:9100
- desktop.home.arpa:9100
- compute.home.arpa:9100
- job_name: loki
static_configs:
- targets:
- storage.home.arpa:3100
- job_name: promtail
static_configs:
- targets:
- storage.home.arpa:9080
- job_name: smartctl
scrape_interval: 5m
static_configs:
- targets:
- storage.home.arpa:9633
- compute.home.arpa:9633
- job_name: mikrotik
static_configs:
- targets:
- storage.home.arpa:49090
- job_name: minio
metrics_path: /minio/v2/metrics/cluster
static_configs:
- targets:
- storage.home.arpa:9000
ポート一覧
| ポート | サービス | ホスト |
|---|---|---|
| 9090 | Prometheus | storage |
| 9100 | node_exporter | storage, desktop, compute |
| 3100 | Loki | storage |
| 9080 | Promtail | storage |
| 9633 | smartctl_exporter | storage, compute |
| 49090 | MKTXP (RouterOS) | storage |
| 9000 | MinIO | storage |
node_exporter の3台展開
Storage Server と Compute Server は rootful Quadlet で node_exporter を動かします。Mac は Homebrew で導入し、0.0.0.0 で待ち受けます。
# Mac (Homebrew)
brew install node_exporter
sudo brew services start node_exporter
# 外部 scrape 用に listen アドレスを変更
sudo sed -i '' 's/--web.listen-address=127\.0\.0\.1:9100/--web.listen-address=0.0.0.0:9100/' \
/Library/LaunchDaemons/homebrew.mxcl.node_exporter.plist
Promtail 設定(ログ収集)
Promtail は rootful Quadlet で Linux ログとネットワーク機器の syslog を集め、Loki に送ります。
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /promtail/positions.yaml
clients:
- url: http://storage.home.arpa:3100/loki/api/v1/push
scrape_configs:
# --- Linux ファイルログ ---
- job_name: security-files
static_configs:
- labels:
job: security
host: storage.home.arpa
__path__: /var/log/alternatives.log*
- labels:
job: security
host: storage.home.arpa
__path__: /var/log/apport.log*
- job_name: apt-files
static_configs:
- labels:
job: apt
host: storage.home.arpa
__path__: /var/log/apt/history.log
- labels:
job: apt
host: storage.home.arpa
__path__: /var/log/apt/term.log
- labels:
job: apt
host: storage.home.arpa
__path__: /var/log/dpkg.log
# --- systemd journal ---
- job_name: kernel-journal
journal:
path: /var/log/journal
max_age: 168h
labels:
job: kernel
host: storage.home.arpa
relabel_configs:
- source_labels: ["__journal__hostname"]
target_label: host
- source_labels: ["__journal__syslog_identifier"]
target_label: ident
- source_labels: ["__journal_priority"]
target_label: priority
- job_name: systemd-units
journal:
path: /var/log/journal
max_age: 168h
labels:
job: systemd
host: storage.home.arpa
relabel_configs:
- source_labels: ["__journal__systemd_unit"]
target_label: unit
- source_labels: ["__journal__hostname"]
target_label: host
- source_labels: ["__journal__uid"]
target_label: uid
# --- ネットワーク機器 syslog (RouterOS / Netgear WiFi) ---
- job_name: network-syslog
syslog:
listen_address: 0.0.0.0:1514
listen_protocol: udp
syslog_format: rfc3164
use_incoming_timestamp: false
label_structured_data: true
relabel_configs:
- source_labels: ["__syslog_message_hostname"]
target_label: host
- source_labels: ["__syslog_message_app_name"]
target_label: app
- source_labels: ["__syslog_severity"]
target_label: severity
- source_labels: ["__syslog_facility"]
target_label: facility
ネットワーク機器からの syslog 受信
RouterOSとNetgear WiFi APから、UDP 1514でrfc3164形式のsyslogを受信します。
RouterOS 側の設定:
/system logging action add name=promtail target=remote remote=10.10.10.3 remote-port=1514 bsd-syslog=yes
/system logging add topics=firewall action=promtail
/system logging add topics=system,info action=promtail
Firewall ログ一括有効化:
/ip firewall filter set [find builtin=no && dynamic=no] log=yes log-prefix="FW: "
MKTXP: RouterOS API メトリクス
RouterOS のメトリクスには、API を使う MKTXP Exporter を選びました。到達性を確認しやすく、SNMP Exporter のネットワークモードの問題を避けられました。
[edge.home.arpa]
hostname = edge.home.arpa
username = metrics
password = (API user password)
port = 8728
use_ssl = False
verify_ssl = False
timeout = 5
allow_duplicates = False
http://storage.home.arpa:49090/metrics で CPU、メモリ、温度、インターフェース統計、DHCP 情報を公開します。Grafana の「Mikrotik MKTXP Exporter」で表示しています。
Grafana 連携(Desktop PC 側)
Desktop PC(Mac Studio)の Grafana が Storage Server を参照します。インフラ構築では、収集・保存と可視化を別のホストに分けた構成です。
データソース
- Prometheus →
http://storage.home.arpa:9090 - Loki →
http://storage.home.arpa:3100
RouterOS ログの Table パネル
| 項目 | 設定 |
|---|---|
| Data source | Loki |
| Query | {job="network-syslog"} |
| Transformations | Extract fields → Organize fields |
| 残す列 | Time, host, app, severity, line |
LogQL クエリ例:
{job="network-syslog"} | line_format "{{.time}} | {{.host}} | {{.severity}} | {{.line}}"
同じ Grafana で、RouterOS の負荷スパイクと同時刻の firewall ログを確認できます。
Vector への移行(進行中)
Promtail は 2026-03 に EOL となり、Vector(Datadog Telemetry)へ移行中です。Rust 製の Vector はログ収集に加え、メトリクス変換とルーティングも扱えます。
Go + NATS + Dagster AI 基盤では、Vector が TELEMETRY ストリーム (telemetry.>) を購読し、Prometheus / Loki に送る設計です。Promtail の役割を Vector に移す予定です。
注意事項
- CRS304 の L3 / フィルタで監視ポート(9100, 9633 等)がブロックされていないか確認する
- Mac の node_exporter はデフォルトで localhost bind。外部 scrape するなら plist 修正が必要
- 監視ポートは内部セグメントのみに制限する
- smartctl_exporter は 5 分間隔で十分。過剰な scrape はディスクへの負荷になる
- Promtail の journal 収集には
/var/log/journalへのアクセスが必要で、rootful Quadlet が前提
