Funciones de instrumentación AWS Lambda - AWS X-Ray

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Funciones de instrumentación AWS Lambda

Scorekeep utiliza dos AWS Lambda funciones. La primera es una función de Node.js de la ramificación lambda que genera nombres aleatorios para nuevos usuarios. Cuando un usuario crea una sesión sin introducir ningún nombre, la aplicación llama a una función denominada random-name con el AWS SDK for Java. El SDK de X-Ray para Java registra la información sobre la llamada a Lambda en un subsegmento, como cualquier otra llamada realizada con un cliente de SDK AWS instrumentado.

nota

La ejecución de la función de Lambda random-name requiere la creación de recursos adicionales fuera del entorno de Elastic Beanstalk. Consulte el archivo readme para obtener más información e instrucciones: AWS Lambda Integration.

La segunda función, scorekeep-worker, es una función de Python que se ejecuta de forma independiente de la API de Scorekeep. Cuando un juego termina, la API escribe el ID de sesión y el ID de juego en una cola de SQS. La función de proceso de trabajo lee los elementos de la cola y llama a la API de Scorekeep con el fin de construir registros completos de cada sesión de juego para su almacenamiento en Amazon S3.

Scorekeep incluye AWS CloudFormation plantillas y scripts para crear ambas funciones. Dado que necesita agrupar el SDK de X-Ray con el código de la función, las plantillas crean las funciones sin ningún tipo de código. Al implementar Scorekeep, un archivo de configuración incluido en la carpeta .ebextensions crea un paquete de origen que incluye el SDK y actualiza el código de la función y la configuración con el AWS Command Line Interface.

Nombre aleatorio

Scorekeep llama a la función de nombre aleatorio cuando un usuario comienza una sesión de juego sin iniciar sesión o especificar un nombre de usuario. Cuando Lambda procesa la llamada a random-name, lee el encabezado de rastreo, que contiene el ID de rastro y la decisión de muestreo escrita por el SDK de X-Ray para Java.

Para cada solicitud muestreada, Lambda ejecuta el daemon de X-Ray y escribe dos segmentos. El primer segmento registra información sobre la llamada a Lambda que invoca la función. Este segmento contiene la misma información que el subsegmento registrado por Scorekeep, pero desde el punto de vista de Lambda. El segundo segmento representa el trabajo que hace la función.

Lambda pasa el segmento de la función al SDK de X-Ray a través del contexto de la función. Cuando instrumente una función de Lambda, no utilice el SDK con el fin de crear un segmento para las solicitudes entrantes. Lambda proporciona el segmento y usted debe utilizar el SDK para instrumentar clientes y escribir subsegmentos.

Mapa de rastreo que muestra cómo scorekeep llama a una función Lambda para obtener nombres aleatorios para nuevos usuarios

La función random-name se implementa en Node.js. Utiliza el SDK de Node.js para JavaScript enviar notificaciones con Amazon SNS y el SDK de X-Ray para Node.js para instrumentar el cliente del AWS SDK. Para escribir anotaciones, la función crea un subsegmento personalizado con AWSXRay.captureFunc y escribe anotaciones en la función instrumentada. En Lambda, no puede escribir anotaciones directamente en el segmento de la función, únicamente en un subsegmento que cree.

ejemplo function/index.js: función Lambda random-name
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;

Esta función se crea automáticamente al implementar la aplicación de ejemplo en Elastic Beanstalk. La ramificación xray incluye un script para crear una función de Lambda en blanco. Los archivos de configuración de la .ebextensions carpeta crean el paquete de funciones npm install durante la implementación y, a continuación, actualizan la función Lambda con la CLI AWS .

Entorno de trabajo

La función de trabajo instrumentada se proporciona en su propia ramificación, xray-worker, ya que no se puede ejecutar a menos que antes cree la función de trabajo y los recursos relacionados. Consulte el archivo readme de la ramificación para obtener instrucciones.

La función se activa mediante un paquete de CloudWatch eventos de Amazon Events cada 5 minutos. Cuando se ejecuta, la función extrae un elemento de una cola de Amazon SQS que administra Scorekeep. Cada mensaje contiene información sobre un juego terminado.

El trabajo extrae los documentos y el registro del juego de otras tablas a las que hace referencia el registro de juego. Por ejemplo, el registro del juego en DynamoDB incluye una lista de los movimientos que se han realizado durante el juego. La lista no contiene los movimientos en sí, sino los ID de los movimientos que están almacenados en una tabla distinta.

Las sesiones y los estados también se almacenan como referencias. Esto impide que las entradas de la tabla de juego sean demasiado grandes, pero requiere llamadas adicionales para obtener toda la información sobre el juego. El proceso de trabajo anula las referencias a todas estas entradas y construye un registro completo del juego como un único documento en Amazon S3. Cuando desee realizar el análisis de los datos, podrá ejecutar consultas en él directamente en Amazon S3 con Amazon Athena sin ejecutar migraciones de datos que realizan muchas lecturas para obtener los datos de DynamoDB.

Mapa de rastreo que muestra cómo la función de trabajador de mantenimiento de puntajes utiliza Amazon SQS, Amazon S3 y la API de mantenimiento de puntajes.

La función de trabajo tiene habilitado el rastreo activo en su configuración en AWS Lambda. A diferencia de la función de nombres aleatorios, el trabajador no recibe una solicitud de una aplicación instrumentada, por lo que AWS Lambda no recibe un encabezado de seguimiento. Con el rastreo activo, Lambda crea el ID de rastro y toma decisiones de muestreo.

El SDK de X-Ray para Python está solo unas líneas en la parte superior de la función que importa el SDK y ejecuta su patch_all función para parchear los HTTClients AWS SDK for Python (Boto) y los HttpClients que utiliza para llamar a Amazon SQS y Amazon S3. Cuando el trabajo llama a la API de Scorekeep, el SDK añade el encabezado de rastreo a la solicitud para rastrear llamadas a través de la API.

ejemplo _lambda/scorekeep-worker/scorekeep-worker.py: función Lambda del proceso de trabajo
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 ) ...