Observability

Zielgruppe: DevOps. Seit Phase 7 mit echten Daten - vorher lieferte infra/prometheus/prometheus.yml nur "down"-Targets, weil keine Metriken exponiert wurden (siehe common-observability).

Die drei Saeulen und ihre Werkzeuge in diesem Projekt

Saeule Beantwortet Werkzeug hier
Metriken "Wie viele Requests/Sekunde, wie hoch ist die Fehlerrate, wie voll ist der Heap?" Micrometer → Prometheus → Grafana
Distributed Tracing "Dieser eine Request war langsam - in WELCHEM der sechs beteiligten Services genau?" Micrometer Tracing (Brave) → Zipkin
Logs "Was genau ist passiert, mit welchen Werten?" strukturierte Log-Zeilen mit Correlation-Id (siehe CorrelationIdFilter, common-web), als JSON via logstash-logback-encoder → Promtail → Grafana Loki

Wie ein Service Metriken/Traces bekommt: common-observability

Ein Service muss dafuer NICHTS programmieren - common-observability (siehe Pattern-Katalog) ist ein reines Abhaengigkeits-Modul: micrometer-registry-prometheus (exponiert /actuator/prometheus) und micrometer-tracing-bridge-brave + zipkin-reporter-brave (sendet Spans an Zipkin). Sobald diese Bibliotheken auf dem Klassenpfad liegen, konfiguriert Spring Boot beides automatisch - "Classpath-getriebene Auto-Configuration", siehe die Modul-Beschreibung in common-observability/pom.xml.

Was WEITERHIN pro Service konfiguriert werden muss, ist bewusst zentral im Config Server gelöst (config-server/src/main/resources/config-repo/application.yml):

api-gateway, config-server und discovery-server importieren den Config Server NICHT (siehe deren application.yml-Kommentare) und haben deshalb ihre eigene, lokale Kopie dieser Einstellungen - ein bewusster, dokumentierter Fall von "nicht ALLES zentralisierbar", siehe auch ADR-0006.

Zentrales Logging: Grafana Loki + Promtail

infra/docker-compose.yml enthaelt zwei zusaetzliche Services:

Alle neun Fachservices setzen in infra/docker-compose.yml die Umgebungsvariable LOGGING_CONFIG: classpath:logback-json.xml - das schaltet Spring Boot auf die alternative Logback-Konfiguration aus common-observability um (logback-json.xml, JSON-Zeilen via LogstashEncoder, inklusive correlationId als eigenem JSON-Feld). Ohne diese Variable (z. B. beim Start ueber die IDE, "Local"-Stufe) bleibt Spring Boots menschenlesbares Standardformat aktiv - bewusst additiv, siehe Kommentar in logback-json.xml.

Ausprobieren

cd infra
podman compose up -d
# ein paar Anfragen ausloesen, z. B. ueber die Angular-Oberflaeche oder curl/Postman gegen
# das api-gateway (http://localhost:8080/api/books)

Warum keine Observability-Stack-Installation in Kubernetes

Das Helm-Chart (infra/helm/) deployt bewusst NUR die neun Anwendungsservices, nicht Prometheus/Grafana/Zipkin selbst - in einem echten Cluster wuerden dafuer etablierte, fertige Helm-Charts verwendet (kube-prometheus-stack, zipkin offizielles Chart), keine selbstgeschriebenen. Das nachzubauen waere hier reine Infrastruktur-Uebung ohne zusaetzlichen Lernwert gegenueber dem bereits vorhandenen Compose-Aufbau - siehe kubernetes-guide.md fuer den Scope der Kubernetes-Phase.

⌂ Cockpit