Lambda se integra con AWS X-Ray para permitirle seguir, depurar y optimizar aplicaciones de Lambda. Puede utilizar X-Ray para seguir una solicitud mientras atraviesa los recursos de la aplicación, que pueden incluir funciones de Lambda y otros servicios de AWS.
Para enviar datos de seguimiento a X-Ray, puede utilizar una de estas tres bibliotecas de SDK:
-
AWS Distro for OpenTelemetry (ADOT)
: una distribución segura, lista para producción y con soporte de AWS del OpenTelemetry (OTel) SDK. -
AWS X-Ray SDK para Python: un SDK para generar y enviar datos de seguimiento a X-Ray.
-
Powertools para AWS Lambda (Python)
: un kit de herramientas para desarrolladores destinado a implementar prácticas recomendadas sin servidor y aumentar la velocidad de los desarrolladores.
Cada uno de los SDK ofrecen formas de enviar los datos de telemetría al servicio X-Ray. Tras ello, se puede utilizar X-Ray para consultar, filtrar y obtener información sobre las métricas de rendimiento de la aplicación con el fin de identificar problemas y oportunidades de optimización.
importante
Los SDK de X-Ray y Powertools para AWS Lambda son parte de una solución de instrumentación completamente integrada que ofrece AWS. Las capas Lambda de ADOT forman parte de un estándar que abarca todo el sector para la instrumentación de seguimiento que recopila más datos en general, pero es posible que no sean adecuadas para todos los casos de uso. Puede implementar el seguimiento integral en X-Ray con cualquiera de las soluciones. Para obtener más información sobre cuál elegir, consulte Elegir entre SDK de AWS Distro para OpenTelemetry y X-Ray.
Secciones
Uso de Powertools para AWS Lambda (Python) y AWS SAM para el seguimiento
Siga los pasos que figuran a continuación para descargar, crear e implementar una aplicación de muestra “Hola, mundo” de Python con módulos integrados de Powertools para AWS Lambda (Python)
Requisitos previos
Para completar los pasos de esta sección, debe disponer de lo siguiente:
-
Python 3.11
-
Versión 1.75 o posterior de la CLI de AWS SAM. Si tiene una versión anterior de la CLI de AWS SAM, consulte Actualización de la CLI de AWS SAM.
Implementar una aplicación de ejemplo de AWS SAM
-
Inicialice la aplicación con la plantilla “Hola, mundo” de Python.
sam init --app-template hello-world-powertools-python --name sam-app --package-type Zip --runtime python3.11 --no-tracing
-
Compile la aplicación.
cd sam-app && sam build
-
Implemente la aplicación.
sam deploy --guided
-
Siga las indicaciones que aparecen en pantalla. Para aceptar las opciones predeterminadas proporcionadas en la experiencia interactiva, oprima
Enter
.nota
En HelloWorldFunction es posible que no tenga definida la autorización, ¿está bien?, asegúrese de ingresar
y
. -
Obtenga la URL de la aplicación implementada:
aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
-
Invoque el punto de conexión de la API:
curl -X GET
<URL_FROM_PREVIOUS_STEP>
Si se realiza de forma correcta, verá el siguiente resultado:
{"message":"hello world"}
-
Para obtener el seguimiento de la función, ejecute sam traces.
sam traces
El resultado del seguimiento tendrá este aspecto:
New XRay Service Graph Start time: 2023-02-03 14:59:50+00:00 End time: 2023-02-03 14:59:50+00:00 Reference Id: 0 - (Root) AWS::Lambda - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [1] Summary_statistics: - total requests: 1 - ok count(2XX): 1 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0.924 Reference Id: 1 - AWS::Lambda::Function - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [] Summary_statistics: - total requests: 1 - ok count(2XX): 1 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0.016 Reference Id: 2 - client - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [0] Summary_statistics: - total requests: 0 - ok count(2XX): 0 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0 XRay Event [revision 1] at (2023-02-03T14:59:50.204000) with id (1-63dd2166-434a12c22e1307ff2114f299) and duration (0.924s) - 0.924s - sam-app-HelloWorldFunction-YBg8yfYtOc9j [HTTP: 200] - 0.016s - sam-app-HelloWorldFunction-YBg8yfYtOc9j - 0.739s - Initialization - 0.016s - Invocation - 0.013s - ## lambda_handler - 0.000s - ## app.hello - 0.000s - Overhead
-
Se trata de un punto de conexión de API pública al que se puede acceder a través de Internet. Se recomienda eliminar el punto de conexión después de las pruebas.
sam delete
X-Ray no sigue todas las solicitudes realizadas a la aplicación. X-Ray aplica un algoritmo de muestreo para garantizar que el seguimiento sea eficiente, a la vez que proporciona una muestra representativa de todas las solicitudes. La tasa de muestreo es 1 solicitud por segundo y un 5 por ciento de las solicitudes adicionales. La frecuencia de muestreo de X-Ray no se puede configurar para las funciones.
Uso de Powertools para AWS Lambda (Python) y el AWS CDK para el seguimiento
Siga los pasos que figuran a continuación para descargar, crear e implementar una aplicación de muestra “Hola, mundo” de Python con módulos integrados de Powertools para AWS Lambda (Python)
Requisitos previos
Para completar los pasos de esta sección, debe disponer de lo siguiente:
-
Python 3.11
-
Versión 1.75 o posterior de la CLI de AWS SAM. Si tiene una versión anterior de la CLI de AWS SAM, consulte Actualización de la CLI de AWS SAM.
Implementar una aplicación de ejemplo de AWS CDK
-
Cree un directorio de proyecto para la nueva aplicación.
mkdir hello-world cd hello-world
-
Inicialice la aplicación.
cdk init app --language python
-
Instale las dependencias de Python.
pip install -r requirements.txt
Cree un directorio lambda_function en la carpeta raíz.
mkdir lambda_function cd lambda_function
Cree un archivo app.py y agregue el siguiente código al archivo. Se trata del código de la función de Lambda.
from aws_lambda_powertools.event_handler import APIGatewayRestResolver from aws_lambda_powertools.utilities.typing import LambdaContext from aws_lambda_powertools.logging import correlation_paths from aws_lambda_powertools import Logger from aws_lambda_powertools import Tracer from aws_lambda_powertools import Metrics from aws_lambda_powertools.metrics import MetricUnit app = APIGatewayRestResolver() tracer = Tracer() logger = Logger() metrics = Metrics(namespace="PowertoolsSample") @app.get("/hello") @tracer.capture_method def hello(): # adding custom metrics # See: https://docs.powertools.aws.dev/lambda-python/latest/core/metrics/ metrics.add_metric(name="HelloWorldInvocations", unit=MetricUnit.Count, value=1) # structured log # See: https://docs.powertools.aws.dev/lambda-python/latest/core/logger/ logger.info("Hello world API - HTTP 200") return {"message": "hello world"} # Enrich logging with contextual information from Lambda @logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST) # Adding tracer # See: https://docs.powertools.aws.dev/lambda-python/latest/core/tracer/ @tracer.capture_lambda_handler # ensures metrics are flushed upon request completion/failure and capturing ColdStart metric @metrics.log_metrics(capture_cold_start_metric=True) def lambda_handler(event: dict, context: LambdaContext) -> dict: return app.resolve(event, context)
-
Abra el directorio hello_world. Debería ver un archivo llamado hello_world_stack.py.
cd .. cd hello_world
Abra hello_world_stack.py y agregue el siguiente código al archivo. Esto contiene el constructor de Lambda, el cual crea la función de Lambda, configura variables de entorno para Powertools y establece la retención de registros en una semana, y el constructor ApiGatewayV1, el cual crea la API de REST.
from aws_cdk import ( Stack, aws_apigateway as apigwv1, aws_lambda as lambda_, CfnOutput, Duration ) from constructs import Construct class HelloWorldStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Powertools Lambda Layer powertools_layer = lambda_.LayerVersion.from_layer_version_arn( self, id="lambda-powertools", # At the moment we wrote this example, the aws_lambda_python_alpha CDK constructor is in Alpha, o we use layer to make the example simpler # See https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_lambda_python_alpha/README.html # Check all Powertools layers versions here: https://docs.powertools.aws.dev/lambda-python/latest/#lambda-layer layer_version_arn=f"arn:aws:lambda:{self.region}:017000801446:layer:AWSLambdaPowertoolsPythonV2:21" ) function = lambda_.Function(self, 'sample-app-lambda', runtime=lambda_.Runtime.PYTHON_3_11, layers=[powertools_layer], code = lambda_.Code.from_asset("./lambda_function/"), handler="app.lambda_handler", memory_size=128, timeout=Duration.seconds(3), architecture=lambda_.Architecture.X86_64, environment={ "POWERTOOLS_SERVICE_NAME": "PowertoolsHelloWorld", "POWERTOOLS_METRICS_NAMESPACE": "PowertoolsSample", "LOG_LEVEL": "INFO" } ) apigw = apigwv1.RestApi(self, "PowertoolsAPI", deploy_options=apigwv1.StageOptions(stage_name="dev")) hello_api = apigw.root.add_resource("hello") hello_api.add_method("GET", apigwv1.LambdaIntegration(function, proxy=True)) CfnOutput(self, "apiUrl", value=f"{apigw.url}hello")
-
Implementación de la aplicación.
cd .. cdk deploy
-
Obtenga la URL de la aplicación implementada:
aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?OutputKey==`apiUrl`].OutputValue' --output text
-
Invoque el punto de conexión de la API:
curl -X GET
<URL_FROM_PREVIOUS_STEP>
Si se realiza de forma correcta, verá el siguiente resultado:
{"message":"hello world"}
-
Para obtener el seguimiento de la función, ejecute sam traces.
sam traces
El resultado del seguimiento se verá de la siguiente manera:
New XRay Service Graph Start time: 2023-02-03 14:59:50+00:00 End time: 2023-02-03 14:59:50+00:00 Reference Id: 0 - (Root) AWS::Lambda - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [1] Summary_statistics: - total requests: 1 - ok count(2XX): 1 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0.924 Reference Id: 1 - AWS::Lambda::Function - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [] Summary_statistics: - total requests: 1 - ok count(2XX): 1 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0.016 Reference Id: 2 - client - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [0] Summary_statistics: - total requests: 0 - ok count(2XX): 0 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0 XRay Event [revision 1] at (2023-02-03T14:59:50.204000) with id (1-63dd2166-434a12c22e1307ff2114f299) and duration (0.924s) - 0.924s - sam-app-HelloWorldFunction-YBg8yfYtOc9j [HTTP: 200] - 0.016s - sam-app-HelloWorldFunction-YBg8yfYtOc9j - 0.739s - Initialization - 0.016s - Invocation - 0.013s - ## lambda_handler - 0.000s - ## app.hello - 0.000s - Overhead
-
Se trata de un punto de conexión de API pública al que se puede acceder a través de Internet. Se recomienda eliminar el punto de conexión después de las pruebas.
cdk destroy
Uso de ADOT para instrumentar las funciones de Python
ADOT proporciona capas de Lambda completamente administradas que empaquetan todo lo necesario para recopilar datos de telemetría mediante el OTel SDK. Utilizando esta capa, se pueden instrumentar las funciones de Lambda sin tener que modificar el código de ninguna función. También se puede configurar la capa para que realice una inicialización personalizada de OTel. Para obtener más información, consulte Configuración personalizada del recopilador de ADOT en Lambda
Para los tiempos de ejecución de Python, puede agregar la capa Lambda administrada por AWS para ADOT Python para instrumentar automáticamente sus funciones. Esta capa funciona para arquitecturas arm64 y x86_64. Para obtener instrucciones detalladas sobre cómo agregar esta capa, consulte Soporte de Lambda de AWS Distro for OpenTelemetry para Python
Uso del X-Ray SDK para instrumentar las funciones de Python
Para registrar detalles sobre las llamadas que realiza la función Lambda a otros recursos de la aplicación, también se puede utilizar el AWS X-Ray SDK para Python. Para obtener el SDK, agregue el paquete aws-xray-sdk
a las dependencias de la aplicación.
ejemplo requirements.txt
jsonpickle==1.3 aws-xray-sdk==2.4.3
En el código de función, puede instrumentar los clientes del SDK de AWS mediante la aplicación de parches a la biblioteca boto3
con el módulo de aws_xray_sdk.core
.
ejemplo función: rastreo de un cliente del SDK de AWS
import boto3 from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.core import patch_all logger = logging.getLogger() logger.setLevel(logging.INFO) patch_all() client = boto3.client('lambda') client.get_account_settings() def lambda_handler(event, context): logger.info('## ENVIRONMENT VARIABLES\r' + jsonpickle.encode(dict(**os.environ))) ...
Una vez agregadas las dependencias correctas y realizados los cambios de código necesarios, active el seguimiento en la configuración de la función mediante la consola de Lambda o la API.
Activación del seguimiento con la consola de Lambda
Para activar el seguimiento activo de la función Lambda mediante la consola, siga estos pasos:
Cómo activar el seguimiento activo
Abra la página de Funciones
en la consola de Lambda. -
Elija una función.
Elija Configuration (Configuración), y luego Monitoring and operations tools (Herramientas de supervisión y operaciones).
En Herramientas de monitorización adicionales, elija Editar.
-
En CloudWatch Application Signals y AWS X-Ray, seleccione Habilitar para Seguimientos de servicios de Lambda.
-
Seleccione Guardar.
Activación del seguimiento con la API de Lambda
Configure el rastreo en la función Lambda con AWS CLI o SDK de AWS, utilice las siguientes operaciones de API:
El siguiente comando de ejemplo de la AWS CLI habilita el seguimiento activo en una función llamada my-function.
aws lambda update-function-configuration --function-name my-function \ --tracing-config Mode=Active
El modo de seguimiento forma parte de la configuración específica de la versión, cuando se publica una versión de la función. No se puede cambiar el modo de seguimiento de una versión publicada.
Activación del seguimiento con AWS CloudFormation
Para activar el seguimiento en un recurso de AWS::Lambda::Function
de una plantilla de AWS CloudFormation, utilice la propiedad TracingConfig
.
ejemplo función-inline.yml : configuración de rastreo
Resources: function: Type: AWS::Lambda::Function Properties:
TracingConfig: Mode: Active
...
Para un recurso AWS::Serverless::Function
de AWS Serverless Application Model (AWS SAM) , utilice la propiedad Tracing
.
ejemplo template.yml : configuración de rastreo
Resources: function: Type: AWS::Serverless::Function Properties:
Tracing: Active
...
Interpretación de un seguimiento de X-Ray
La función necesita permiso para cargar datos de rastreo en X-Ray. Cuando activa el rastreo activo en la consola de Lambda, Lambda agrega los permisos necesarios al rol de ejecución de la función. De lo contrario, agregue la política AWSXRayDaemonWriteAccess
Después de configurar el seguimiento activo, se pueden observar solicitudes específicas a través de la aplicación. El gráfico de servicios de X-Ray muestra información sobre la aplicación y todos sus componentes. En el siguiente ejemplo, se muestra una aplicación con dos funciones. La función principal procesa eventos y, a veces, devuelve errores. La segunda función de la cadena procesa los errores que aparecen en el primer grupo de registros y utiliza el SDK de AWS para llamar a X-Ray, Amazon Simple Storage Service (Amazon S3) y Registros de Amazon CloudWatch.

X-Ray no sigue todas las solicitudes realizadas a la aplicación. X-Ray aplica un algoritmo de muestreo para garantizar que el seguimiento sea eficiente, a la vez que proporciona una muestra representativa de todas las solicitudes. La tasa de muestreo es 1 solicitud por segundo y un 5 por ciento de las solicitudes adicionales. La frecuencia de muestreo de X-Ray no se puede configurar para las funciones.
En X-Ray, un seguimiento registra información sobre una solicitud procesada por uno o varios servicios. Lambda registra 2 segmentos por seguimiento, lo que crea dos nodos en el gráfico de servicios. La siguiente imagen resalta estos dos nodos:

El primer nodo, situado a la izquierda, representa el servicio de Lambda, que recibe la solicitud de invocación. El segundo nodo representa la función Lambda específica. En el siguiente ejemplo, se muestra un seguimiento con estos dos segmentos. Ambos se denominan my-function, pero uno tiene un origen de AWS::Lambda
y el otro tiene origen de AWS::Lambda::Function
. Si el segmento AWS::Lambda
muestra un error, el servicio Lambda tuvo un problema. Si el segmento AWS::Lambda::Function
muestra un error, la función tuvo un problema.

En este ejemplo, el segmento AWS::Lambda::Function
aparece ampliado para mostrar los tres subsegmentos.
nota
AWS está implementando cambios en el servicio Lambda. Debido a estos cambios, es posible que vea pequeñas diferencias entre la estructura y el contenido de los mensajes de registro del sistema y los segmentos de rastro emitidos por diferentes funciones de Lambda en su Cuenta de AWS.
El rastro de ejemplo que se muestra aquí ilustra el segmento de función de estilo antiguo. Las diferencias entre los segmentos de estilo antiguo y nuevo se describen en los párrafos siguientes.
Estos cambios se implementarán en las próximas semanas y todas las funciones de todas las Regiones de AWS, excepto en las regiones de China y GovCloud, pasarán a utilizar el nuevo formato de mensajes de registro y segmentos de rastro.
El segmento de función de estilo antiguo contiene los siguientes subsegmentos:
-
Inicialización: representa el tiempo dedicado a cargar la función y ejecutar el código de inicialización. Este subsegmento aparece únicamente para el primer evento que procesa cada instancia de la función.
-
Invocación: representa el tiempo dedicado a ejecutar el código del controlador.
-
Sobrecarga: representa el tiempo que el tiempo de ejecución de Lambda dedica a prepararse para gestionar el siguiente evento.
El segmento de función de estilo nuevo no contiene ningún subsegmento de Invocation
. En cambio, los subsegmentos de clientes se adjuntan directamente al segmento de la función. Para obtener más información sobre la estructura de los segmentos de funciones de estilo antiguo y nuevo, consulte Comprensión de los rastros.
También puede instrumentar clientes HTTP, registrar consultas SQL y crear subsegmentos personalizados con anotaciones y metadatos. Para obtener más información, consulte AWS X-Ray SDK para Python en la Guía para desarrolladores de AWS X-Ray.
Precios
Puede utilizar el seguimiento de X-Ray de manera gratuita cada mes hasta un límite determinado como parte del nivel Gratuito de AWS. A partir de ese umbral, X-Ray realiza cargos por almacenamiento y recuperación del seguimiento. Para más información, consulte Precios de AWS X-Ray
Almacenamiento de dependencias de tiempo de ejecución en una capa (X-Ray SDK)
Si utiliza el X-Ray SDK para instrumentar el código de las funciones de los clientes del SDK de AWS, el paquete de implementación puede llegar a ser bastante grande. Para evitar que se carguen dependencias en tiempo de ejecución cada vez que se actualice el código de las funciones, empaquete el X-Ray SDK en una capa de Lambda.
El siguiente ejemplo muestra un recurso AWS::Serverless::LayerVersion
que almacena el AWS X-Ray SDK para Python.
ejemplo template.yml : capa de dependencias.
Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: function/. Tracing: Active
Layers: - !Ref libs
...libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-python-lib Description: Dependencies for the blank-python sample app. ContentUri: package/. CompatibleRuntimes: - python3.11
Con esta configuración, solo se actualiza la capa de la biblioteca si se modifican las dependencias del tiempo de ejecución. Dado que el paquete de implementación de la función contiene únicamente el código, esto puede ayudar a reducir los tiempos de carga.
Para crear una capa de dependencias, es necesario realizar cambios en la compilación para generar el archivo de capas antes de la implementación. Para ver un ejemplo de trabajo, consulte la aplicación de ejemplo blank-python