Dieses Dokument wurde mithilfe automatisierter maschineller Übersetzungstechnologie übersetzt. Wir bemühen uns um korrekte Übersetzungen, übernehmen jedoch keine Gewähr für die Vollständigkeit, Richtigkeit oder Zuverlässigkeit der übersetzten Inhalte. Im Falle von Abweichungen ist die englische Originalversion maßgebend und stellt den verbindlichen Text dar.

Automatisches Instrumentieren einer NodeJS-Lambda-Funktion

Einführung

Dieses Dokument führt Sie durch das automatische Instrumentieren von NodeJS Lambda-Funktionen mit OpenTelemetry. Die automatische Instrumentierung vereinfacht den Prozess, Ihren Lambda-Funktionen mehr Einblick zu gewähren, indem automatisch Leistungsmetriken und Tracing-Informationen erfasst werden.

Voraussetzungen

Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben:

  • AWS Lambda-Funktion: Die Funktion, die Sie instrumentieren möchten.

  • OpenTelemetry SDK: In Ihrer Lambda-Funktion installiert.

  • OpenTelemetry Collector: Bereitgestellt und konfiguriert.

  • SUSE Observability: Ein Konto bei SUSE Observability, wo Sie Ihre Telemetriedaten senden werden.

  • Arbeitsspeicher: Genug Speicher, um die Lambda-Funktion einschließlich der Instrumentierung auszuführen.

Von der Umgebung bereitgestellte Werte

OpenTelemetry ist auf verschiedene Konfigurationswerte angewiesen, um korrekt zu funktionieren. Diese Werte steuern Aspekte wie Datensammlung, Export und Kommunikation mit Backend-Systemen. Um Ihre OpenTelemetry-Implementierung flexibel und anpassungsfähig an verschiedene Umgebungen zu gestalten, können Sie diese Einstellungen über Umgebungsvariablen bereitstellen. Dieser Ansatz bietet mehrere Vorteile:

  • Dynamische Konfiguration: Einstellungen einfach anpassen, ohne den Code zu ändern.

  • Umgebungsabhängige Einstellungen: Konfigurieren Sie OpenTelemetry unterschiedlich für Entwicklung, Test und Produktion.

  • Secret Management: Speichern Sie sensible Informationen wie API-Schlüssel sicher.

Für das in dieser Dokumentation beschriebene OpenTelemetry-Setup müssen Sie die folgenden Umgebungsvariablen definieren:

  • VERBOSITY: Steuert das Detaillierungsniveau in den OpenTelemetry-Protokollen.

  • OTLP_API_KEY: Authentifiziert Ihre Lambda-Funktion, um Daten an SUSE Observability zu senden.

  • OTLP_ENDPOINT: Gibt die Adresse Ihrer SUSE Observability-Instanz an.

  • OPENTELEMETRY_COLLECTOR_CONFIG_FILE: Verweist auf die Konfigurationsdatei für den OpenTelemetry Collector.

  • AWS_LAMBDA_EXEC_WRAPPER: Konfiguriert die Lambda-Ausführungsumgebung, um den OpenTelemetry-Handler zu verwenden.

  • OTLP_INSTR_LAYER_ARN: Stellt die ARN (Amazon Resource Name) der OpenTelemetry-Instrumentierungsschicht bereit, die die erforderlichen Komponenten für die automatisierte Instrumentierung hinzufügt.

  • OTLP_COLLECTOR_LAYER_ARN: Stellt die ARN der OpenTelemetry-Collector-Schicht bereit, die für den Empfang, die Verarbeitung und den Export von Telemetriedaten verantwortlich ist.

Wichtige Überlegungen:

  • GRPC-Endpunkt: Der OTLP_ENDPOINT sollte den gRPC-Endpunkt Ihrer SUSE Observability-Instanz ohne jegliches http oder https Präfix angeben. Verwenden Sie Port 443 für sichere Kommunikation.

  • Regionsspezifische Schichten: Lambda-Schichten sind regionsgebunden. Stellen Sie sicher, dass die ARNs, die Sie für OTLP_INSTR_LAYER_ARN und OTLP_COLLECTOR_LAYER_ARN verwenden, mit der AWS-Region übereinstimmen, in der Ihre Lambda-Funktion bereitgestellt ist.

  • Architekturabgleich: Die OpenTelemetry Collector-Schicht ist architekturspezifisch. Wählen Sie die richtige ARN für die Architektur Ihrer Lambda-Funktion (z. B. amd64 oder arm64).

Ein vollständiges Beispiel: Beachten Sie, dass Sie Ihre eigenen Werte eingeben müssen.

VERBOSITY: "normal"
OTLP_API_KEY: "<your api key for sending data to SUSE Observability here>"
OTLP_ENDPOINT: "<your-dns-name-for-suse-observability-here>:443"
OPENTELEMETRY_COLLECTOR_CONFIG_FILE: "/var/task/collector.yaml"
AWS_LAMBDA_EXEC_WRAPPER: "/opt/otel-handler"
OTLP_INSTR_LAYER_ARN: "arn:aws:lambda:<aws-region>:184161586896:layer:opentelemetry-nodejs-0_11_0:1"
OTLP_COLLECTOR_LAYER_ARN: "arn:aws:lambda:<aws-region>:184161586896:layer:opentelemetry-collector-<amd64|arm64>-0_12_0:1"

Die collector.yaml-Datei

Die OTEL-Sammelkonfiguration legt fest, wie die erfassten Daten verteilt werden sollen. Dies geschieht in der collector.yaml-Datei, die im src-Verzeichnis platziert ist, in dem sich die Lambda-Dateien befinden. Nachfolgend ein Beispiel für eine collector.yaml-Datei.

# collector.yaml in the root directory
# Set an environemnt variable 'OPENTELEMETRY_COLLECTOR_CONFIG_FILE' to
# '/var/task/collector.yaml'

receivers:
  otlp:
    protocols:
      grpc:
      http:

exporters:
  debug:
    verbosity: "${env:VERBOSITY}"
  otlp/stackstate:
    headers:
      Authorization: "SUSEObservability ${env:OTLP_API_KEY}"
    endpoint: "${env:OTLP_ENDPOINT}"

service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [debug, otlp/stackstate]
      processors: []
    metrics:
      receivers: [otlp]
      exporters: [debug, otlp/stackstate]
      processors: []

Bitte beachten Sie, dass dieser Collector verwendet wird, um die Daten an einen nächsten Collector zu senden, der dann für Tail-Sampling, Metrikaggregation usw. verwendet wird, bevor die Daten an SUSE Observability gesendet werden. Dieser zweite Collector muss ebenfalls in der Umgebung des Kunden ausgeführt werden.

Je nach gewünschter Funktionalität oder basierend auf Faktoren wie den von auf diese Weise instrumentierten Lambdas erzeugten Datenmengen können Collectoren für Batching, Tail-Sampling und andere Vorverarbeitungstechniken eingerichtet werden, um die Auswirkungen auf SUSE Observability zu reduzieren.

Befolgen Sie den Leitfaden zum Einstieg, um einen Collector einzurichten, der die Daten an SUSE Observability sendet. Die Anpassung der Konfiguration des Collectors zur Einrichtung von Sampling, Filtering usw. finden Sie in unserer Collector-Dokumentation.

AWS Lambda Instrumentierung mit OpenTelemetry

Package.json

Stellen Sie sicher, dass Sie "@opentelemetry/auto-instrumentations-node": "^0.55.2",+ zu package.json hinzufügen und npm install ausführen, um die Auto-Instrumentierungs-Clientbibliotheken zu Ihrer NodeJS-Lambda-Funktion hinzuzufügen.

Fehlerbehebung

Zeitüberschreitungen

Wenn durch die Hinzufügung der OTEL Lambda-Schichten Lambdas aufgrund eines Timeouts fehlschlagen (die Überprüfung der Protokolle könnte darauf hinweisen, dass der Collector aufgefordert wurde, sich während noch laufender Tätigkeit herunterzufahren, z. B. wenn folgender Protokolleintrag erscheint):

{
    "level": "info",
    "ts": 1736867469.2312617,
    "caller": "internal/retry_sender.go:126",
    "msg": "Exporting failed. Will retry the request after interval.",
    "kind": "exporter",
    "data_type": "traces",
    "name": "otlp/stackstate",
    "error": "rpc error: code = Canceled desc = context canceled",
    "interval": "5.125929689s"
}

kurz nach Erhalt der Anweisung zum Herunterfahren:

{
    "level": "info",
    "ts": 1736867468.4311068,
    "logger": "lifecycle.manager",
    "msg": "Received SHUTDOWN event"
}

Das oben Genannte zeigt, dass die zugewiesenen Ressourcen der Lambda-Funktion nicht ausreichen, um deren Ausführung und die zusätzliche Belastung durch die OTEL-Instrumentierung zu ermöglichen. Um dies zu beheben, können die Speicherzuweisung und die Lambda-Zeitüberschreitungs-Einstellungen nach Bedarf angepasst werden, um der Lambda-Funktion zu ermöglichen, ihre Arbeit abzuschließen, während die Telemetrieerfassung erfolgreich erfolgt.

Versuchen Sie, die Eigenschaften MemorySize und TimeOut der fehlerhaften Lambdas zu ändern:

MemorySize: 256
Timeout: 25

Beachten Sie, dass die Standard-Speicherzuweisung 128 MB beträgt.

Beachten Sie, dass die Speichererhöhung 128 MB beträgt.

Beachten Sie, dass der Timeout ein ganzzahliger Wert ist, der Sekunden angibt.

Authentifizierung und Quell-IP-Filterung

Wenn Sie error 403 Unauthorized beim Einreichen von Collector-Daten an Ihren Cluster oder an einen beliebigen Vorverarbeitungs- oder Proxy-Collector begegnen, überprüfen Sie bitte, ob die Quell-IP-Adresse des VPC NAT-Gateways mit der übereinstimmt, die vom Collector-Ingress freigegeben wurde. Überprüfen Sie auch, ob der gewählte Authentifizierungsmechanismus mit Quelle und Ziel übereinstimmt und ob die Zugangsdaten (Secrets usw.) korrekt eingerichtet sind.

Für weitere Informationen zur Konfiguration der Authentifizierung für den OpenTelemetry-Collector konsultieren Sie bitte die offiziellen Dokumentation.

Hinweise

Dokumentation zur automatischen Instrumentierung → https://opentelemetry.io/docs/faas/lambda-auto-instrument/

GitHub-Releases-Seite zum Finden der neuesten ARNs → https://github.com/open-telemetry/opentelemetry-lambda/releases