Ihre Anwendung – eine Blackbox? Zeit, das zu ändern
\n\nHaben Sie sich schon einmal dabei ertappt zu denken: „Warum läuft mein Node.js-Dienst langsam, obwohl der Code perfekt ist?“ Oder haben Sie eine Beschwerde von einem Benutzer erhalten, konnten aber nicht verstehen, was schiefgelaufen ist? Kommt Ihnen bekannt vor? Willkommen in der Welt, in der Sie ohne Observability in JavaScript im Blindflug arbeiten.
\n\nObservability ist nicht nur ein Modewort. Es ist ein Ansatz, der Ihren Code von einer Blackbox in ein transparentes System verwandelt. Wir lernen, ihm Fragen zu stellen: „Wer ist schuld?“ (Tracing), „Was passiert gerade jetzt?“ (Metriken) und „Was ist gestern um 3:15 Uhr passiert?“ (Logs).
\n\nIn diesem Artikel behandeln wir die drei Säulen der Observability in Node.js: Tracing, Metriken und Logs. Sie erhalten fertige Codebeispiele und verstehen, wie Sie diese Praktiken noch heute einführen können. Los geht's!
\n\nTracing in JavaScript: Die Reise einer Anfrage
\n\nStellen Sie sich vor, ein Benutzer klickt auf die Schaltfläche „Bestellung aufgeben“. Diese Anfrage durchläuft das API-Gateway, den Authentifizierungsdienst, den Warenkorb, das Zahlungs-Gateway und die Datenbank. Wenn etwas kaputt geht – wo suchen? Tracing (oder verteiltes Tracing) gibt Ihnen eine Karte dieser Reise.
\n\nWas ist Tracing in einfachen Worten
\n\nTracing ist eine Möglichkeit, den Weg einer bestimmten Anfrage durch alle Microservices und Funktionen zu verfolgen. Jeder Schritt ist ein Span und die gesamte Kette ein Trace. Sie sehen, wie viel Zeit jeder Schritt in Anspruch genommen hat und wo ein Fehler aufgetreten ist.
\n\nOpenTelemetry: Der Standard für Observability in JavaScript
\n\nOpenTelemetry (OTel) ist der Industriestandard für die Erfassung von Traces, Metriken und Logs. Es wird von allen großen Cloud-Anbietern und Tools (Jaeger, Zipkin, Grafana) unterstützt.
\n\nInstallation:
\nnpm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node\n\nBasisbeispiel für Tracing in einer Express-Anwendung:
\nconst { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');\nconst { SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');\nconst { ConsoleSpanExporter } = require('@opentelemetry/exporter-console');\nconst { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express');\nconst { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');\n\nconst provider = new NodeTracerProvider();\nprovider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));\nprovider.register();\n\nconst { getTracer } = require('@opentelemetry/api');\nconst tracer = getTracer('my-app');\n\n// Automatisches Tracing von HTTP und Express\nconst { registerInstrumentations } = require('@opentelemetry/instrumentation');\nregisterInstrumentations({\n tracerProvider: provider,\n instrumentations: [\n new ExpressInstrumentation(),\n new HttpInstrumentation()\n ]\n});\n\n// Jetzt erstellt jede Anfrage einen Trace mit Spans\nconst express = require('express');\nconst app = express();\n\napp.get('/api/order', async (req, res) => {\n // Manueller Span für die Geschäftslogik\n const span = tracer.startSpan('processPayment');\n try {\n // ... Ihre Logik\n await new Promise(r => setTimeout(r, 100)); // Simulation\n span.setStatus({ code: 1 }); // OK\n } catch (err) {\n span.setStatus({ code: 2, message: err.message }); // ERROR\n throw err;\n } finally {\n span.end();\n }\n res.send('Order created');\n});\n\napp.listen(3000);\n\nJetzt sehen Sie in der Konsole strukturierte Daten: welche Anfrage, wie lange jeder Middleware-Schritt gedauert hat, wo ein Fehler aufgetreten ist. Das ist Observability JavaScript in Aktion.
\n\nMetriken: Der Puls Ihrer Anwendung
\n\nTracing ist gut für einzelne Anfragen, aber was ist mit dem Gesamtbild? Wie viele Anfragen pro Sekunde? Welche Latenz? Wie viel Speicher verbraucht Ihr Node.js? Dafür sind Metriken zuständig.
\n\nPrometheus und Client für Node.js
\n\nPrometheus ist der De-facto-Standard für die Metrikenerfassung. Es „zieht“ Daten aus Ihrer Anwendung über HTTP.