Observability in Go: Tracing, Metriken und Logs für Profis

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Ihre Anwendung läuft, aber sind Sie sicher, dass Sie wissen, was im Inneren passiert?

\n\n

Stellen Sie sich vor: Sie haben einen Microservice in Go in der Produktion gestartet. Er stürzt nicht ab, liefert keine 500er-Fehler, aber Benutzer beschweren sich, dass die Seite "irgendwie langsam" lädt. Sie schauen ins Monitoring – CPU 30%, Speicher in Ordnung. Was tun? Ohne Observability in Go sind Sie ein Kapitän ohne Karte und Kompass.

\n\n

Observability (Beobachtbarkeit) ist nicht nur "Logs". Es sind die drei Säulen: Tracing, Metriken und Logs. Zusammen geben sie Ihnen die Superkraft zu verstehen, was im System passiert, selbst wenn Sie kein Problem erwarten. In diesem Artikel werden wir jeden dieser Aspekte anhand von Codebeispielen in Go durchgehen. Sie lesen nicht nur Theorie – Sie erhalten fertige Rezepte, die Sie noch heute implementieren können.

\n\n

Warum Go die ideale Sprache für Observability ist?

\n\n

Go wurde für Backend-Systeme entwickelt, bei denen Leistung und Zuverlässigkeit wichtig sind. Die Standardbibliothek (net/http, database/sql) kann bereits Metriken liefern und Kontexte für Tracing unterstützen. Und das Ökosystem OpenTelemetry Go und Prometheus Go macht die Implementierung von Observability einfach und elegant.

\n\n

Aber das Wichtigste: In Go gibt es keine "Magie". Sie schreiben Code, der ohne Schmerz gemessen, getracet und geloggt werden kann. Lassen Sie uns sehen, wie das gemacht wird.

\n\n

Tracing in Go: OpenTelemetry in Aktion

\n\n

Tracing (Trace-Verfolgung) ist die Geschichte einer einzelnen Anfrage vom Eintritt in das System bis zum Austritt. Es zeigt, wie lange jeder Schritt gedauert hat: Datenbankabfrage, Aufruf einer externen API, Datenverarbeitung. In Go basiert Tracing auf Kontexten (context.Context).

\n\n

Einrichtung des OpenTelemetry SDK

\n\n

Pakete installieren:

\n
go get go.opentelemetry.io/otel \\\n  go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp \\\n  go.opentelemetry.io/otel/sdk/trace
\n\n

Jetzt den Tracer initialisieren:

\n\n
package main\n\nimport (\n    "context"\n    "log"\n    "go.opentelemetry.io/otel"\n    "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"\n    "go.opentelemetry.io/otel/sdk/trace"\n)\n\nfunc initTracer() {\n    exporter, err := otlptracehttp.New(context.Background())\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    tp := trace.NewTracerProvider(\n        trace.WithBatcher(exporter),\n        trace.WithSampler(trace.AlwaysSample()),\n    )\n    otel.SetTracerProvider(tp)\n}
\n\n

Erstellen eines Spans im HTTP-Handler

\n\n

So sieht Tracing in echtem Code aus:

\n\n
func userHandler(w http.ResponseWriter, r *http.Request) {\n    tracer := otel.Tracer("user-service")\n    ctx, span := tracer.Start(r.Context(), "getUser")\n    defer span.End()\n\n    // Simulation einer Datenbankabfrage\n    user, err := getUserFromDB(ctx, r.URL.Query().Get("id"))\n    if err != nil {\n        span.RecordError(err)\n        span.SetStatus(codes.Error, err.Error())\n        http.Error(w, err.Error(), 500)\n        return\n    }\n\n    span.SetAttributes(\n        attribute.String("user.id", user.ID),\n        attribute.Int64("user.age", int64(user.Age)),\n    )\n\n    // Verschachtelter Span für externen Aufruf\n    _, childSpan := tracer.Start(ctx, "callAnalyticsAPI")\n    defer childSpan.End()\n\n    callAnalyticsAPI(user)\n    \n    w.Write([]byte("OK"))\n}
\n\n

Jeder Span enthält Name, Start- und Endzeit, Attribute und Status. In Jaeger oder Grafana Tempo sehen Sie die vollständige Karte der Anfrage.

\n\n

Praktischer Tipp

\n

Vergessen Sie nicht, den Kontext durch die gesamte Anwendung zu reichen. In Go geschieht dies automatisch, wenn Sie context.Context in den Funktionssignaturen verwenden. OpenTelemetry Go übernimmt den Kontext automatisch aus der HTTP-Anfrage, wenn Sie Middleware verwenden.

\n\n

Metriken: Prometheus und Export in Go

\n\n

Metriken sind Zahlen, die den Zustand des Systems anzeigen: RPS, Latenz, Anzahl der Fehler, Aus

Blogs

Buchempfehlungen