OpenTelemetry mit Node.js verwenden

Sie können Cloud Trace für Node.js-Anwendungen mit OpenTelemetry aktivieren. OpenTelemetry bietet eine Reihe von Instrumentierungsbibliotheken zum Erfassen von Trace- und Messwertdaten, die mit mehreren Back-Ends funktionieren. Aktuelle Informationen zu OpenTelemetry für Node.js sowie zusätzliche Dokumentation und Beispiele finden Sie unter https://opentelemetry.io/.

Installation und Konfiguration

Zum Erfassen von Traces gehen Sie so vor:

  • Installieren Sie die OpenTelemetry-Clientbibliotheken.
  • Importieren Sie die OpenTelemetry-Trace-Pakete.
  • Konfigurieren Sie OpenTelemetry so, dass Spans nach Cloud Trace exportiert werden.
  • Aktivieren Sie den Zugriffsbereich der Cloud Trace API.

Client installieren, initialisieren und verwenden

OpenTelemetry bietet drei Möglichkeiten zur Instrumentierung Ihrer Anwendung:

  • Automatische Instrumentierung für Node.js-Anwendungen
  • Manuelles Tracing
  • Automatische Instrumentierung für Webanwendungen

In den folgenden Abschnitten wird der Anwendungsfall für jede Instrumentierung dargestellt.

Automatische Instrumentierung

Das Modul @opentelemetry/node bietet eine automatische Instrumentierung für Node.js-Anwendungen.

Bei der automatischen Instrumentierung wird Folgendes in Ihrer Anwendung automatisch erkannt:

  • Frameworks wie Express
  • Gängige Protokolle wie HTTP, HTTPS und gRPC
  • Datenbanken wie MySQL, MongoDB, Redis und PostgreSQL
  • Andere Bibliotheken in Ihrer Anwendung

Die automatische Instrumentierung bietet einsatzbereites Tracing, sodass Sie keine Codeänderungen an einer der von Ihnen verwendeten Bibliotheken vornehmen müssen. Der Instrumentierungscode führt automatisch die folgenden Aktionen aus:

  • Extrahiert eine Trace-Kontext-ID aus eingehenden Anfragen, um ggf. verteiltes Tracing zu ermöglichen.
  • Garantiert, dass der aktuelle Trace-Kontext weitergegeben wird, während die Transaktion eine Anwendung durchläuft. Eine ausführliche Erläuterung finden Sie unter @opentelemetry/context-base.
  • Fügt die Trace-Kontext-ID zu ausgehenden Anfragen hinzu, damit der verteilte Trace gegebenenfalls auch mit dem nächsten Hop fortgesetzt werden kann.
  • Erstellt und beendet Spans.

Das Modul verwendet Plug-ins, um Ihre Anwendung automatisch zu instrumentieren, damit Spans erzeugt und ein End-to-End-Tracing mit nur wenigen Codezeilen bereitgestellt werden können.

Manuelle Instrumentierung

Das manuelle Tracing-Modul @opentelemetry/tracing bietet vollständige Kontrolle über Instrumentierung und Spanerstellung. async_hooks wird nicht geladen. Standardmäßig werden kein kontinuierlicher lokale Speicher oder Instrumentierungs-Plug-ins verwendet. Das manuelle Tracing hat im Vergleich zum Modul für die automatische Instrumente weniger Leistungseinsparungen.

Automatische Instrumentierung für Webanwendungen

Das Modul @opentelemetry/web bietet eine automatisierte Instrumentierung und Tracing für Webanwendungen. Er erfasst clientseitige Leistungsdaten, einschließlich Latenz und verteilter Traces, die Ihnen Informationen zum Diagnostizieren von Front-End-Problemen und zur Überwachung des Gesamtstatus der Anwendung bieten.

Die folgende Anleitung zeigt, wie das Modul zur automatischen Instrumentierung für Compute Engine und Google Kubernetes Engine verwendet wird.

Compute Engine

Installieren Sie die folgenden Pakete:

npm install --save @opentelemetry/api
npm install --save @opentelemetry/node
npm install --save @opentelemetry/tracing
npm install --save @google-cloud/opentelemetry-cloud-trace-exporter

Fügen Sie Ihrer Anwendung den folgenden Code hinzu, um den Exporter zu initialisieren und zu registrieren:

const opentelemetry = require('@opentelemetry/api');
const {NodeTracerProvider} = require('@opentelemetry/node');
const {SimpleSpanProcessor} = require('@opentelemetry/tracing');
const { TraceExporter } = require('@google-cloud/opentelemetry-cloud-trace-exporter');
// Enable OpenTelemetry exporters to export traces to Google Cloud Trace.
// Exporters use Application Default Credentials (ADCs) to authenticate.
// See https://developers.google.com/identity/protocols/application-default-credentials
// for more details.
const provider = new NodeTracerProvider();

// Initialize the exporter. When your application is running on Google Cloud,
// you don't need to provide auth credentials or a project id.
const exporter = new TraceExporter();

// Configure the span processor to send spans to the exporter
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));

GKE

Fügen Sie Folgendes zu Dockerfile hinzu:

RUN npm install --save @opentelemetry/api
RUN npm install --save @opentelemetry/node
RUN npm install --save @opentelemetry/tracing
RUN npm install --save @google-cloud/opentelemetry-cloud-trace-exporter

Fügen Sie Ihrer Anwendung den folgenden Code hinzu, um den Exporter zu initialisieren und zu registrieren:

const opentelemetry = require('@opentelemetry/api');
const {NodeTracerProvider} = require('@opentelemetry/node');
const {SimpleSpanProcessor} = require('@opentelemetry/tracing');
const { TraceExporter } = require('@google-cloud/opentelemetry-cloud-trace-exporter');
// Enable OpenTelemetry exporters to export traces to Google Cloud Trace.
// Exporters use Application Default Credentials (ADCs) to authenticate.
// See https://developers.google.com/identity/protocols/application-default-credentials
// for more details.
const provider = new NodeTracerProvider();

// Initialize the exporter. When your application is running on Google Cloud,
// you don't need to provide auth credentials or a project id.
const exporter = new TraceExporter();

// Configure the span processor to send spans to the exporter
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));

Beispielanwendung mit dem Express-Framework

Mit der OpenTelemetry-Express-Instrumentierung (@opentelemetry/plugin-http und @opentelemetry/plugin-express) können Sie Trace-Daten automatisch erfassen und in das Back-End Ihrer Wahl für eine Beobachtbarkeit auf verteilte Systeme exportieren.

Führen Sie die folgenden Schritte aus, um OpenTelemetry für Anwendungen zu verwenden, die das Express-Framework ausführen:

  1. Installieren Sie die folgenden Pakete:

    npm install --save @opentelemetry/plugin-http
    npm install --save @opentelemetry/plugin-express
    
  2. Fügen Sie Ihrer Anwendung den folgenden Code hinzu, der alle unterstützten Plug-ins lädt:

    const { NodeTracerProvider } = require('@opentelemetry/node');
    const provider = new NodeTracerProvider();
    

Ein einfaches Beispiel finden Sie im OpenTelemetry-Express-Beispiel.

Benutzerdefinierten Span erstellen

Sie können dem vom System erstellten Trace zusätzliche Informationen hinzufügen, indem Sie einen benutzerdefinierten Span erstellen.

Zum Erstellen eines benutzerdefinierten Spans fügen Sie dem Quellcode Folgendes hinzu:


// Initialize the OpenTelemetry APIs to use the
// NodeTracerProvider bindings
opentelemetry.trace.setGlobalTracerProvider(provider);
const tracer = opentelemetry.trace.getTracer('basic');

// Create a span.
const span = tracer.startSpan('foo');

// Set attributes to the span.
span.setAttribute('key', 'value');

// Annotate our span to capture metadata about our operation
span.addEvent('invoking work');

// simulate some random work.
for (let i = 0; i <= Math.floor(Math.random() * 40000000); i += 1) { }

// Be sure to end the span.
span.end();
  • getTracer gibt eine Instanz von Tracer zurück, wobei basic der Name des Tracers oder der Instrumentierungsbibliothek ist. Dadurch wird OpenTelemetry mitgeteilt, wer Spans erstellt.

  • foo ist der Name des benutzerdefinierten Spans.

  • invoking work ist der Name des Beispielereignisses. Hier erfahren Sie, wie Sie die addEvent API verwenden.

Ein einfaches Beispiel zum Erstellen eines benutzerdefinierten Spans finden Sie im OpenTelemetry-Beispiel.

Ihre Plattform konfigurieren

Sie können Cloud Trace in Google Cloud und auf anderen Plattformen verwenden.

In Google Cloud ausführen

Wenn Ihre Anwendung in Google Cloud ausgeführt wird, müssen Sie für die Clientbibliothek keine Anmeldedaten zur Authentifizierung in der Clientbibliothek angeben. Für die Google Cloud Platform muss jedoch der Zugriffsbereich der Cloud Trace API aktiviert sein.

Für die folgenden Konfigurationen wird die Cloud Trace API über die Standardeinstellungen für den Zugriffsbereich aktiviert:

  • Flexible App Engine-Umgebung
  • App Engine-Standardumgebung

  • Google Kubernetes Engine (GKE)

  • Compute Engine

Wenn Sie benutzerdefinierte Zugriffsbereiche verwenden, muss der Zugriffsbereich der Cloud Trace API aktiviert sein. Geben Sie für gcloud-Nutzer mithilfe des Flags --scopes Zugriffsbereiche an und beziehen Sie den Zugriffsbereich der Cloud Trace API trace.append ein. So erstellen Sie beispielsweise einen GKE-Cluster, für den nur die Cloud Trace API aktiviert ist:

gcloud container clusters create example-cluster-name --scopes=https://www.googleapis.com/auth/trace.append

Lokal und extern ausführen

Wenn Ihre Anwendung außerhalb von Google Cloud ausgeführt wird, müssen Sie Anmeldedaten zur Authentifizierung in Form eines Dienstkontos für die Clientbibliothek angeben. Das Dienstkonto muss die Rolle "Cloud Trace-Agent" enthalten. Informationen dazu finden Sie unter Dienstkonto erstellen.

Google Cloud-Clientbibliotheken verwenden Standardanmeldedaten für Anwendungen für die Suche nach den Anmeldedaten Ihrer Anwendung. Sie geben diese Anmeldedaten an, indem Sie die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS festlegen:

Linux/macOS

    export GOOGLE_APPLICATION_CREDENTIALS=path-to-your-service-accounts-private-key

Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path-to-your-service-accounts-private-key

PowerShell:

    $env:GOOGLE_APPLICATION_CREDENTIALS="path-to-your-service-accounts-private-key"

Traces ansehen

Nach der Bereitstellung können Sie die Traces im Trace Viewer der Cloud Console anzeigen.

Trace-Anzeige öffnen

Fehlerbehebung

Informationen zur Fehlerbehebung bei Cloud Trace finden Sie auf der Seite Fehlerbehebung.