Überwachung von Go-Anwendungen: 3 Tools für Logging und Tracing

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

Warum schweigt Ihre Go-Anwendung und wie beheben Sie das?

\n

Sie haben einen perfekten Mikroservice in Go geschrieben. Er besteht alle Tests, startet schnell und verbraucht nur wenig Speicher. Sie bringen ihn in die Produktion – und eine Stunde später beschweren sich Benutzer über Verlangsamungen. Sie gehen auf den Server, sehen ein leeres Terminal und verstehen: Die Anwendung schweigt. Keine Logs, keine Metriken, kein Verständnis dafür, was schiefgelaufen ist.

\n

Kommt Ihnen das bekannt vor? Willkommen in der Welt der Observability (Beobachtbarkeit) von Go-Anwendungen. Ohne Überwachung und Logging ist Ihr Code eine Blackbox. Heute schauen wir uns an, wie Sie ihn in ein transparentes System verwandeln, in dem jede Verzögerung und jeder Fehler klar ersichtlich sind.

\n

Ich zeige Ihnen drei funktionierende Tools, echte Codebeispiele in Go und gebe Ihnen eine Checkliste, die Ihre Produktion rettet. Los geht's!

\n\n

1. Strukturiertes Logging: Wie Sie aufhören, in die Konsole zu schreiben, und anfangen zu leben

\n

Naives fmt.Println("Fehler:", err) ist von gestern. Im modernen Go-Logging braucht es Ordnung: JSON-Format, Ebenen (debug, info, warn, error), Felder zur Suche. Lernen Sie den König kennen – die Bibliothek Zap von Uber.

\n\n

Warum gerade Zap?

\n
    \n
  • Geschwindigkeit: Er ist bei hoher Last 10-100 Mal schneller als das Standard-log.
  • \n
  • Struktur: Sie fügen Schlüssel und Werte hinzu, anstatt Strings mit Pluszeichen zusammenzukleben.
  • \n
  • Flexibilität: Sie können in eine Datei, in stdout, in Elasticsearch schreiben – wohin Sie wollen.
  • \n
\n\n

Installation und einfaches Beispiel

\n
go get -u go.uber.org/zap
\n\n

Code eines einfachen Loggers:

\n
package main\n\nimport (\n    "go.uber.org/zap"\n)\n\nfunc main() {\n    logger, _ := zap.NewProduction()\n    defer logger.Sync() // Puffer vor dem Beenden leeren\n\n    logger.Info("Dienst gestartet",\n        zap.String("env", "production"),\n        zap.Int("port", 8080),\n    )\n\n    // Beispiel mit Fehler\n    err := someFunction()\n    if err != nil {\n        logger.Error("Vorgang konnte nicht ausgeführt werden",\n            zap.Error(err),\n            zap.String("module", "database"),\n        )\n    }\n}
\n\n

Als Ausgabe erhalten Sie sauberes JSON:

\n
{"level":"info","ts":1700000000.123,"msg":"Dienst gestartet","env":"production","port":8080}
\n\n

Jetzt kann jedes Tool wie Kibana oder Grafana Loki diese Logs nach Feldern durchsuchen. Sie möchten alle Fehler im Modul "database" der letzten Stunde finden? Ein Klick.

\n\n

Tipp: Protokollieren Sie keine Geheimnisse und personenbezogenen Daten

\n

Fügen Sie eine Prüfung hinzu: Wenn ein Feld ein Passwort oder eine E-Mail enthält – maskieren Sie es. Verwenden Sie zap.String("user", "***") für sensible Daten.

\n\n

2. Metriken und Überwachung: Code in ein Dashboard verwandeln

\n

Logs sind gut, aber sie sprechen über die Vergangenheit. Metriken sind der Puls Ihrer Anwendung in Echtzeit. Für die Überwachung von Go-Anwendungen ist der De-facto-Standard Prometheus + seine Client-Bibliothek.

\n\n

Was messen?

\n
    \n
  • RPS (Requests pro Sekunde) – Auslastung des Dienstes.
  • \n
  • Latenz (p50, p95, p99) – Antwortzeit.
  • \n
  • Fehlerrate – Prozentsatz der Fehler.
  • \n
  • Goroutinen – Goroutinen-Leaks.
  • \n
  • Speicher / CPU – Ressourcen.
  • \n
\n\n

Beispiel: Metriken für einen HTTP-Server hinzufügen

\n
package main\n\nimport (\n    "net/http"\n    "github.com/prometheus/client_golang/prometheus"\n    "github.com/prometheus/client_golang/prometheus/promhttp"\n)\n\nvar (\n    requestCount = prometheus.NewCounterVec(\n        prometheus.CounterOpts{\n            Name: "http_requests_total",\n            Help: "Total number of HTTP requests",\n        },\n        []string{"method", "endpoint", "status"},\n    )\n    requestDuration = prometheus.NewHistogramVec(\n        prometheus.HistogramOpts{\n            Name:    "http_request                

Blogs

Buchempfehlungen