AWS Lambda Instrumentierungsfunktionen - 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.

AWS Lambda Instrumentierungsfunktionen

Scorekeep verwendet zwei AWS Lambda Funktionen. Bei der ersten handelt es sich um eine Node.js-Funktion der lambda-Verzweigung, 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 for Java auf. Das X-Ray SDK for Java zeichnet Informationen über den Aufruf an Lambda in einem Untersegment wie jeder andere Aufruf auf, der mit einem instrumentierten AWS SDK-Client getätigt wurde.

Anmerkung

Das Ausführen der random-name Lambda-Funktion erfordert die Erstellung zusätzlicher Ressourcen außerhalb der Elastic Beanstalk-Umgebung. Weitere Informationen und Anweisungen finden Sie in der Readme: AWS Lambda Integration .

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 Datensätze jeder Spielsitzung für die Speicherung in Amazon S3 zu erstellen.

Scorekeep enthält AWS CloudFormation Vorlagen und Skripts 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 an verarbeitetrandom-name, liest es den Ablaufverfolgungs-Header , der die Ablaufverfolgungs-ID und die Sampling-Entscheidung enthält, die vom X-Ray SDK for Java geschrieben wurden.

Für jede Stichprobenanforderung führt Lambda den X-Ray-Daemon aus und schreibt zwei Segmente. Das erste Segment zeichnet Informationen über den Aufruf an Lambda auf, der die Funktion aufruft. Dieses Segment enthält dieselben Informationen wie das von Scorekeep aufgezeichnete Teilsegment, jedoch aus Sicht von Lambda. 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 Anforderungen 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 wird in Node.js implementiert. Es verwendet das SDK für JavaScript in Node.js, um Benachrichtigungen mit Amazon SNS zu senden, und das X-Ray SDK für Node.js, um den AWS SDK-Client zu 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 keine Anmerkungen direkt in das Funktionssegment schreiben, sondern nur in ein von Ihnen erstelltes Untersegment.

Beispiel function/index.js – Zufallsname-Lambda-Funktion
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 Zweig enthält ein Skript zum Erstellen einer leeren Lambda-Funktion. Konfigurationsdateien im .ebextensions Ordner erstellen das Funktionspaket mit npm install während der Bereitstellung und aktualisieren dann die Lambda-Funktion mit der AWS CLI.

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 es ausgeführt wird, ruft die Funktion ein Element aus einer Amazon SQS-Warteschlange ab, die Scorekeep verwaltet. 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. Der Spieledatensatz in DynamoDB enthält beispielsweise eine Liste von Schritten, 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 Auftragnehmer dereferenziert all diese Einträge und erstellt eine vollständige Aufzeichnung des Spiels als einzelnes Dokument in Amazon S3. Wenn Sie Analysen der Daten durchführen möchten, können Sie Abfragen direkt in Amazon S3 mit Amazon Athena ausführen, ohne leseintensive Datenmigrationen durchzuführen, um Ihre Daten aus DynamoDB zu entfernen.


        Trace-Übersicht, die zeigt, wie die Worker-Funktion scorekeep 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 Zufallsnamenfunktion erhält der Worker keine Anforderung von einer instrumentierten Anwendung und AWS Lambda daher keinen Ablaufverfolgungs-Header. Bei aktiver Nachverfolgung erstellt Lambda die Nachverfolgungs-ID und trifft Sampling-Entscheidungen.

Das X-Ray SDK für Python befindet sich nur wenige Zeilen oben in der Funktion, die das SDK importiert und seine patch_all Funktion ausführt, um die HTTclients AWS SDK for Python (Boto) und zu patchen, die zum Aufrufen von Amazon SQS und Amazon S3 verwendet werden. 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/scorekeep-worker.py – 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 ) ...