Files
ThreadNetWiki/betrieb/monitoring.md
T

4.3 KiB

title, description, published, date, tags, editor, dateCreated
title description published date tags editor dateCreated
Monitoring Alloy → Prometheus/Loki true 2026-08-13T18:04:42.896Z markdown 2026-08-13T18:04:42.895Z

Status: live · Stand: 2026-08-02 Remote Storage: 10.0.0.3:9090 (Prometheus), 10.0.0.3:3100 (Loki) — privates Netz, nicht die öffentliche IP

Überblick

Alloy (Grafana Agent) sammelt Metriken & Logs vom K3S-Cluster und schickt sie per Remote-Write zu Prometheus/Loki auf CFGMON (Grafana: selendis.axion1337.de). Der Monitoring-Stack auf CFGMON selbst liegt im Repo threadnet-operating unter monitoring/ — dort leben auch Alertmanager, die Alarmregeln und die CVE-Pipeline.

Komponenten

Komponente Ort Rolle
Alloy Cluster Metrics & Logs Collector, Remote-Write
kube-state-metrics Cluster Kubernetes Object Status
node-exporter (systemd) Host 10.0.0.2 Host-Metriken — kein DaemonSet, siehe unten
Prometheus CFGMON Metrics Ingestion + Alarmauswertung
Loki CFGMON Logs Ingestion
Alertmanager + matrix-alerts CFGMON Alarmzustellung nach Matrix

⚠️ Der node-exporter als DaemonSet wurde am 2026-08-01 entfernt (gitops#45, Commit 93ee6a3). Er lief mit hostNetwork und kollidierte auf Port 9100 mit dem etablierten systemd-Dienst prometheus-node-exporter — Ergebnis war ein CrashLoopBackOff mit über 4.800 Neustarts, der monatelang unbemerkt blieb. Host-Metriken kommen unverändert vom systemd-Exporter, den CFGMON direkt über 10.0.0.2:9100 scrapt. Frühere Fassungen dieser Seite führten den DaemonSet als Komponente — das ist überholt.

Dateien (in apps/monitoring/)

  • namespace.yaml
  • helm-repos.yaml (prometheus-community, grafana)
  • kube-state-metrics.yaml
  • alloy-config.yaml (River config: Scrape-Targets + Remote-Write)
  • alloy.yaml (HelmRelease)

Scrape Targets

Alloy scrapt:

  • Flux Controllers (flux-system ns, Port 8080)
  • kube-state-metrics (monitoring:8080)
  • Synapse (matrix.axion1337.chat:9001) — ⚠️ Port 9001, nicht 9000: der falsche Port lief 98 Tage ins Leere und fiel erst mit dem Alerting auf (Fix b73d887)

Host-Metriken laufen nicht über Alloy, sondern werden von CFGMON direkt geholt (10.0.0.2:9100, Job k3s_host_node).

Alles Weitere per Remote-Write nach 10.0.0.3:9090 bzw. :3100.

Alerting (seit 2026-08-01, gitops#32)

Alertmanager auf CFGMON wertet die Regeln aus monitoring/prometheus/alerts.yml aus und stellt über einen kleinen Webhook-Empfänger (matrix-alerts.py) in Matrix zu:

Raum Zweck Bot
!qavWkXbhLPfGvqtifj Betriebsalarme (TargetDown, OOM, Disk, Restarts) @alerts
!YRJvcEbVXtRlUIkNld Security: CVE-Meldungen, Upstream-Releases derselbe Bot

Ein Alarm = eine Nachricht; bei resolved wird dieselbe Nachricht per m.replace durchgestrichen und mit markiert, statt eine zweite zu senden. Routing über das Label room in der Alarmregel.

CVE-Pipeline (gitops#47/#51)

Auf CFGMON läuft ein 24-Stunden-Scanloop mit Trivy über die deployten Images (monitoring/cve/images.txt), ein Exporter stellt die Funde als Metriken bereit (trivy_vuln_info{cve,severity,target,host,fixed_version}, trivy_vuln_first_seen_timestamp). Die Alarme sind bewusst pro Ziel aggregiert (count by (target, target_type, host)), nicht pro CVE — die erste Fassung erzeugte 126 Einzelnachrichten und musste stummgeschaltet werden (ADR-0003). Details stehen im Grafana-Dashboard, die Matrix-Nachricht verlinkt nur dorthin.

Troubleshooting

# Alloy-Logs im Cluster
kubectl logs -n monitoring -l app.kubernetes.io/name=alloy

# Remote-Write angekommen?
curl 'http://10.0.0.3:9090/api/v1/query?query=up'

# Loki-Test
curl -s 'http://10.0.0.3:3100/loki/api/v1/query_range?query=%7B%7D' | jq .

# Auf CFGMON: Alarme und Silences
docker compose exec alertmanager amtool alert --alertmanager.url=http://localhost:9093
docker compose exec alertmanager amtool silence --alertmanager.url=http://localhost:9093

Verwandt: Host-Wartungsbenachrichtigungen · Backlog und Betriebsentscheidungen im management-Repo