Monitoring & Observability: Warum Logs nicht reichen, Tracing hilft
Admin User
Author
Summary
Warum Sie gerade heute Ihren Log‑Ansatz über Bord werfen sollten
- Grundlagen: Monitoring vs. Observability
Erklärung
Konkretes Beispiel
Persönliche Einschätzung
- Beispiel 1 – Loki + Promtail + Grafana: Logs strukturiert erfassen
Erklärung
Konkrete Konfiguration
positions: filename: /tmp/positions.yaml
clients: - url: http://loki:3100/loki/api/v1/push
scrape_configs: - job_name: system static_configs: - targets: - localhost labels: job: varlogs path: /var/log/**/*.log
Persönliche Einschätzung
- Beispiel 2 – Jaeger Tracing in einem Go‑Microservice
Erklärung
Konkrete Implementierung (Go)
import ( "context" "log" "net/http"
<span class="s">"go.opentelemetry.io/otel"</span>
<span class="s">"go.opentelemetry.io/otel/exporters/jaeger"</span>
<span class="s">"go.opentelemetry.io/otel/trace"</span>
<span class="s">"go.opentelemetry.io/otel/sdk/trace"</span>
)
func initTracer() func(context.Context) error { // Jaeger‑Collector läuft auf localhost:14268 exp, err := jaeger.New(jaeger.WithCollectorEndpoint("http://localhost:14268/api/traces")) if err != nil { log.Fatalf("Jaeger exporter error: %v", err) } tp := trace.NewTracerProvider(trace.WithBatcher(exp)) otel.SetTracerProvider(tp) return tp.Shutdown }
func handler(w http.ResponseWriter, r *http.Request) { ctx, span := otel.Tracer("my‑service").Start(r.Context(), "handler") defer span.End() // Simulierter DB‑Call dbCall(ctx) w.Write([]byte("ok")) }
func dbCall(ctx context.Context) { _, span := otel.Tracer("my‑service").Start(ctx, "db‑query") defer span.End() // hier würde ein echter DB‑Aufruf stattfinden }
func main() { shutdown := initTracer() defer shutdown(context.Background()) http.HandleFunc("/", handler) log.Println("Listening on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
Persönliche Einschätzung
- Beispiel 3 – OpenTelemetry Collector als zentraler Hub
Erklärung
Konkrete Konfiguration (collector-config.yaml)
exporters: prometheus: endpoint: "0.0.0.0:9090" jaeger: endpoint: "jaeger:14250" loki: endpoint: "http://loki:3100/api/prom/push"
service: pipelines: traces: receivers: [otlp] exporters: [jaeger] metrics: receivers: [otlp] exporters: [prometheus] logs: receivers: [otlp] exporters: [loki]
Persönliche Einschätzung
- Häufige Fehler beim Aufbau eines Observability‑Stacks
- Fazit & konkreter nächster Schritt
Source
This article discusses content originally published by at Dev.to.