View a markdown version of this page

Instrumentierung AWS Lambda Funktionen - AWS X-Ray

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Instrumentierung AWS Lambda Funktionen

Anmerkung

X-Ray SDK/Daemon Wartungshinweis — Am 25. Februar 2026 wechselt das in den AWS X-Ray SDKs/Daemon Wartungsmodus, in dem die X-Ray SDK- und Daemon-Versionen begrenzt AWS werden, um nur Sicherheitsprobleme zu beheben. Weitere Informationen zum Zeitplan für den Support finden Sie unter. Zeitplan für die Support von X-Ray SDK und Daemon Wir empfehlen die Migration zu OpenTelemetry. Weitere Informationen zur Migration zu OpenTelemetry finden Sie unter Migration von X-Ray Instrumentierung zu OpenTelemetry Instrumentierung.

Scorekeep verwendet zwei Funktionen. AWS Lambda Die erste ist eine Node.js Funktion aus dem lambda Zweig, die zufällige Namen für neue Benutzer generiert. Wenn ein Benutzer eine Sitzung erstellt, ohne einen Namen einzugeben, ruft die Anwendung eine Funktion namens random-name mit dem AWS SDK für Java auf. Das X-Ray SDK für Java zeichnet Informationen über den Lambda-Aufruf in einem Untersegment auf, wie jeder andere Aufruf, der mit einem instrumentierten AWS SDK-Client getätigt wird.

Anmerkung

Für die Ausführung der random-name Lambda-Funktion müssen zusätzliche Ressourcen außerhalb der Elastic Beanstalk-Umgebung erstellt werden. Weitere Informationen und Anweisungen finden Sie in der Readme-Datei: Lambda-Integration. AWS

Die zweite Funktion, scorekeep-worker, ist eine Python-Funktion, die unabhängig von der Scorekeep-API ausgeführt wird. Wenn ein Spiel endet, schreibt die API die Sitzungs- und Spiele-ID in eine SQS-Warteschlange. Die Worker-Funktion liest Elemente aus der Warteschlange und ruft die Scorekeep-API auf, um vollständige Aufzeichnungen jeder Spielsitzung zur Speicherung in Amazon S3 zu erstellen.

Scorekeep enthält CloudFormation Vorlagen und Skripte zum Erstellen beider Funktionen. Da Sie das X-Ray SDK mit dem Funktionscode bündeln müssen, erstellen die Vorlagen die Funktionen ohne Code. Wenn Sie Scorekeep bereitstellen, erstellt eine im Ordner .ebextensions enthaltene Konfigurationsdatei ein Quell-Bundle, in dem das SDK enthalten ist, und aktualisiert den Funktionscode und die Konfiguration mit der AWS Command Line Interface.

Zufälliger Name

Scorekeep ruft die Funktion für zufällige Namen auf, wenn ein Benutzer eine Spielesitzung beginnt, ohne dass er sich anmeldet oder einen Benutzernamen angibt. Wenn Lambda den Aufruf von verarbeitetrandom-name, liest es den Tracing-Header, der die Trace-ID und die Stichprobenentscheidung enthält, die vom X-Ray SDK für Java geschrieben wurden.

Für jede gesampelte Anfrage führt Lambda den X-Ray Daemon aus und schreibt zwei Segmente. Das erste Segment zeichnet Informationen über den Lambda-Aufruf auf, der die Funktion aufruft. Dieses Segment enthält dieselben Informationen wie das von Scorekeep aufgezeichnete Untersegment, jedoch aus Lambda-Sicht. Das zweite Segment repräsentiert die von der Funktion durchgeführte Arbeit.

Lambda übergibt das Funktionssegment über den Funktionskontext an das X-Ray SDK. Wenn Sie eine Lambda-Funktion instrumentieren, verwenden Sie das SDK nicht, um ein Segment für eingehende Anfragen zu erstellen. Lambda stellt das Segment bereit, und Sie verwenden das SDK, um Clients zu instrumentieren und Untersegmente zu schreiben.

Trace-Map, die zeigt, wie Scorekeep eine Lambda-Funktion aufruft, um zufällige Namen für neue Benutzer zu erhalten

Die random-name Funktion ist in implementiert. Node.js Es verwendet das SDK für JavaScript in Node.js , um Benachrichtigungen mit Amazon SNS zu senden, und das X-Ray SDK für, um den SDK-Client Node.js zu AWS instrumentieren. Zum Schreiben von Anmerkungen erstellt die Funktion ein benutzerdefiniertes Untersegment mit AWSXRay.captureFunc und schreibt die Anmerkungen in die instrumentierte Funktion. In Lambda können Sie Anmerkungen nicht direkt in das Funktionssegment schreiben, sondern nur in ein Untersegment, das Sie erstellen.

Beispiel function/index.js -- Lambda-Funktion mit zufälligem Namen
var AWSXRay = require('aws-xray-sdk-core'); var AWS = AWSXRay.captureAWS(require('aws-sdk')); AWS.config.update({region: process.env.AWS_REGION}); var Chance = require('chance'); var myFunction = function(event, context, callback) { var sns = new AWS.SNS(); var chance = new Chance(); var userid = event.userid; var name = chance.first(); AWSXRay.captureFunc('annotations', function(subsegment){ subsegment.addAnnotation('Name', name); subsegment.addAnnotation('UserID', event.userid); }); // Notify var params = { Message: 'Created randon name "' + name + '"" for user "' + userid + '".', Subject: 'New user: ' + name, TopicArn: process.env.TOPIC_ARN }; sns.publish(params, function(err, data) { if (err) { console.log(err, err.stack); callback(err); } else { console.log(data); callback(null, {"name": name}); } }); }; exports.handler = myFunction;

Diese Funktion wird automatisch erstellt, wenn Sie die Beispielanwendung für Elastic Beanstalk bereitstellen. Der xray Branch enthält ein Skript zum Erstellen einer leeren Lambda-Funktion. Mit den Konfigurationsdateien im .ebextensions Ordner wird das Funktionspaket npm install während der Bereitstellung erstellt und anschließend die Lambda-Funktion mit der AWS CLI aktualisiert.

Worker

Die instrumentierten Worker-Funktion wird in einer eigenen Verzweigung, xray-worker, bereitgestellt, da sie nur ausgeführt werden kann, wenn Sie die Worker-Funktion und verwandte Ressourcen zuerst erstellen. Detaillierte Anweisungen finden Sie in der Readme-Datei zur Verzweigung.

Die Funktion wird alle 5 Minuten durch ein gebündeltes Amazon CloudWatch Events-Ereignis ausgelöst. Wenn sie ausgeführt wird, ruft die Funktion ein Element aus einer Amazon SQS-Warteschlange ab, die von Scorekeep verwaltet wird. Jede Nachricht enthält Informationen zu einem abgeschlossenen Spiel.

Der Worker ruft den Spieledatensatz und die Spieledokumente von anderen Tabellen ab, auf die der Spieledatensatz verweist. Zum Beispiel enthält die Spielaufzeichnung in DynamoDB eine Liste von Zügen, die während des Spiels ausgeführt wurden. Die Liste enthält nicht die Züge selbst, sondern die IDs der Züge, die in einer separaten Tabelle gespeichert werden.

Sitzungen und Status werden ebenfalls als Referenzen gespeichert. Auf diese Weise wird verhindert, dass die Einträge in der Spieletabelle zu groß werden. Allerdings sind zusätzliche Aufrufe notwendig, um alle Informationen zum Spiel zu erhalten. Der Worker dereferenziert all diese Einträge und erstellt eine vollständige Aufzeichnung des Spiels als einzelnes Dokument in Amazon S3. Wenn Sie die Daten analysieren möchten, können Sie mit Amazon Athena Abfragen direkt in Amazon S3 ausführen, ohne leseintensive Datenmigrationen durchführen zu müssen, um Ihre Daten aus DynamoDB zu holen.

Trace-Karte, die zeigt, wie die Scorekeep-Worker-Funktion Amazon SQS, Amazon S3 und die Scorekeep-API verwendet.

Für die Worker-Funktion ist die aktive Nachverfolgung in der Konfiguration in AWS Lambda aktiviert. Im Gegensatz zur Funktion für zufällige Namen erhält der Worker keine Anforderung von einer instrumentierten Anwendung und daher auch AWS Lambda keinen Tracing-Header. Bei aktivem Tracing erstellt Lambda die Trace-ID und trifft Stichprobenentscheidungen.

Das X-Ray SDK für Python besteht nur aus ein paar Zeilen am Anfang der Funktion, die das SDK importieren und seine patch_all Funktion zum Patchen der AWS SDK for Python (Boto) und HttClients ausführen, mit denen es Amazon SQS und Amazon S3 aufruft. Wenn der Auftragnehmer die Scorekeep-API aufruft, fügt das SDK den Ablaufverfolgungs-Header zur Anforderung hinzu, um Aufrufe über die API nachzuverfolgen.

Beispiel_lambda/scorekeep- -worker.py worker/scorekeep -- Worker Lambda-Funktion
import os import boto3 import json import requests import time from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.core import patch_all patch_all() queue_url = os.environ['WORKER_QUEUE'] def lambda_handler(event, context): # Create SQS client sqs = boto3.client('sqs') s3client = boto3.client('s3') # Receive message from SQS queue response = sqs.receive_message( QueueUrl=queue_url, AttributeNames=[ 'SentTimestamp' ], MaxNumberOfMessages=1, MessageAttributeNames=[ 'All' ], VisibilityTimeout=0, WaitTimeSeconds=0 ) ...