Instrumentación del código Java en AWS Lambda - AWS Lambda

Instrumentación del código Java en AWS Lambda

Lambda se integra con AWS X-Ray para permitirle rastrear, depurar y optimizar las aplicaciones de Lambda. Puede utilizar X-Ray para rastrear una solicitud a medida que esta recorre los recursos de la aplicación, desde el frontend de la API hasta el almacenamiento y la base de datos del backend. Solo con agregar la biblioteca del SDK de X-Ray a la configuración de compilación, puede registrar los errores y la latencia de cualquier llamada que realice la función a un servicio de AWS.

El mapa de servicio de X-Ray muestra el flujo de solicitudes de la aplicación. En el siguiente ejemplo de la aplicación de ejemplo de procesamiento de errores se muestra una aplicación con dos funciones. La función principal procesa eventos y, a veces, devuelve errores. La segunda función procesa los errores que aparecen en el grupo de registros de la primera y utiliza el SDK de AWS para llamar a X-Ray, Amazon S3 y Amazon CloudWatch Logs.


          Service map showing nodes for Lambda functions, X-Ray, Amazon S3 and CloudWatch Logs

Para rastrear solicitudes que no tienen un encabezado de rastreo, habilite el rastreo activo en la configuración de la función.

Para habilitar el rastreo activo

  1. Abra la Página de funciones en la consola de Lambda.

  2. Elija una función.

  3. Elija Configuration (Configuración) y, a continuación, seleccione Monitoring tools (Herramientas de monitoreo).

  4. Elija Edit (Editar).

  5. En X-Ray, habilite Active tracing (Activar rastreo).

  6. Elija Save (Guardar).

Precios

X-Ray tiene una capa gratuita permanente Más allá del umbral de la capa gratuita, X-Ray realiza cargos por almacenamiento y recuperación del seguimiento. Consulte Precios de AWS X-Ray para obtener más información.

Su función necesita permiso para cargar datos de rastreo en X-Ray. Cuando habilita el rastreo activo en la Lambda consola, Lambda agrega los permisos necesarios al rol de ejecución de la función. De lo contrario, agregue la política AWSXRayDaemonWriteAccess al rol de ejecución.

X-Ray aplica un algoritmo de muestreo para garantizar que el rastreo sea eficiente, al tiempo que proporciona una muestra representativa de las solicitudes a las que sirve la aplicación. La regla de muestreo predeterminada es 1 solicitud por segundo y un 5 por ciento de las solicitudes adicionales. Esta frecuencia de muestreo no se puede configurar para las funciones de Lambda.

Cuando el rastreo activo está habilitado, Lambda registra el rastreo de un subconjunto de invocaciones. Lambda registra dos segmentos, lo que crea dos nodos en el mapa de servicio. El primer nodo representa el servicio de Lambda que recibe la solicitud de invocación. El tiempo de ejecución de la función registra el segundo nodo.


      Un mapa de servicio X-Ray con una sola función.

Para registrar los detalles sobre las llamadas a otros recursos y servicios que realiza la función, agregue el SDK para Java de X-Ray a la configuración de compilación. En el siguiente ejemplo, se muestra una configuración de compilación de Gradle que incluye las bibliotecas que permiten la instrumentación automática de los clientes de SDK de AWS para Java 2.x.

ejemplo build.gradle –: dependencias de seguimiento.

dependencies { implementation platform('software.amazon.awssdk:bom:2.10.73') implementation platform('com.amazonaws:aws-xray-recorder-sdk-bom:2.4.0') implementation 'software.amazon.awssdk:lambda' implementation 'com.amazonaws:aws-xray-recorder-sdk-core' implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-core' implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2' implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2-instrumentor' ... }

En el ejemplo siguiente se muestra un seguimiento con 2 segmentos. Ambos se llaman my-function, pero uno es tipo AWS::Lambda y el otro es AWS::Lambda::Function. El segmento de función se expande para mostrar sus subsegmentos.

El primer segmento representa la solicitud de invocación procesada por el servicio Lambda. El segundo segmento registra el trabajo realizado por la función. El segmento de la función tiene 3 subsegmentos.

  • Initialization (Inicialización) – Representa el tiempo dedicado a cargar la función y ejecutar el código de inicialización. Este subsegmento únicamente aparece para el primer evento procesado por cada instancia de la función.

  • Invocation (Invocación) – Representa el trabajo realizado por el código del controlador. Al instrumentar el código, puede extender este subsegmento mediante subsegmentos adicionales.

  • Overhead (Sobrecarga) – Representa el trabajo realizado por el tiempo de ejecución de Lambda con el fin de prepararse para controlar el siguiente evento.

También puede instrumentar clientes HTTP, registrar consultas SQL y crear subsegmentos personalizados con anotaciones y metadatos. Para obtener más información, consulte SDK de AWS X-Ray para Java en Guía para desarrolladores de AWS X-Ray.

Habilitación del seguimiento activo con la API de Lambda

Para administrar la configuración de seguimiento con la AWS CLI o el SDK de AWS, utilice las siguientes operaciones de API.

El siguiente comando de la AWS CLI de ejemplo habilita el rastreo 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, que se bloquea cuando se publica una versión de la función. No se puede cambiar el modo de seguimiento de una versión publicada.

Habilitación del seguimiento activo con AWS CloudFormation

Para habilitar el seguimiento activo en un recurso de AWS::Lambda::Function de una plantilla de AWS CloudFormation, utilice la propiedad TracingConfig.

ejemplo function-inline.yml: configuración de seguimiento

Resources: function: Type: AWS::Lambda::Function Properties: TracingConfig: Mode: Active ...

Para un recurso AWS::Serverless::Function de Modelo de aplicación sin servidor de AWS (AWS SAM) , utilice la propiedad Tracing.

ejemplo template.yml: configuración de seguimiento

Resources: function: Type: AWS::Serverless::Function Properties: Tracing: Active ...

Almacenamiento de dependencias en tiempo de ejecución en una capa

Si utiliza el SDK de X-Ray 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, empaquételas en una capa de Lambda.

En el ejemplo siguiente, se muestra un recurso de AWS::Serverless::LayerVersion que almacena el SDK para Java de SDK para Java y X-Ray.

ejemplo template.yml –: capa de dependencias.

Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: build/distributions/blank-java.zip Tracing: Active Layers: - !Ref libs ... libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-java-lib Description: Dependencies for the blank-java sample app. ContentUri: build/blank-java-lib.zip CompatibleRuntimes: - java8

Con esta configuración, solo actualiza la capa de la biblioteca si se modifican las dependencias del tiempo de ejecución. El paquete de implementación de funciones solo contiene su código. Cuando actualiza el código de la función, el tiempo de carga es mucho más rápido que si incluye dependencias en el paquete de implementación.

Para crear una capa de dependencias, es necesario realizar cambios en la configuración de compilación para generar el archivo de capas antes de la implementación. Para ver un ejemplo práctico, consulte la aplicación de muestra java-basic.

Seguimiento en las aplicaciones de ejemplo

El repositorio de GitHub para esta guía contiene aplicaciones de ejemplo en las que se muestra el uso del seguimiento. Cada una de las aplicaciones de ejemplo contiene scripts para facilitar la implementación y la limpieza, una plantilla de AWS SAM y recursos de soporte.

Aplicaciones de Lambda de ejemplo en Java

  • blank-java – función de Java que muestra el uso de bibliotecas de Java de Lambda, el registro, las variables de entorno, las capas, el seguimiento de AWS X-Ray, las pruebas unitarias y el AWS SDK.

  • java-basic: función de Java mínima con pruebas unitarias y configuración de registro de variables.

  • java-events – función de Java mínima que utiliza la biblioteca aws-lambda-java-events con tipos de eventos que no requieren el SDK AWS como dependencia, como Amazon API Gateway.

  • java-events-v1sdk – Función Java que utiliza la biblioteca aws-lambda-java-events con tipos de eventos que requieren el AWS SDK como una dependenciaAmazon Simple Storage Service ((Amazon S3) Amazon DynamoDB, y Amazon Kinesis).

  • s3-java: función de Java que procesa los eventos de notificación de Amazon S3 y utiliza Java Class Library (JCL) para crear miniaturas de los archivos de imagen cargados.

Todas las aplicaciones de ejemplo tienen activado el seguimiento activo de las funciones Lambda. En la aplicación blank-java, se muestra la instrumentación automática de los clientes de SDK de AWS para Java 2.x, la administración de segmentos para pruebas, subsegmentos personalizados y el uso de capas de Lambda para almacenar dependencias en tiempo de ejecución.


        Mapa de servicios de X-Ray con una función que llama a la API de Lambda.

En este ejemplo de la aplicación blank-java, se muestran los nodos del servicio Lambda, una función y la API de Lambda. La función llama a la API de Lambda para monitorear el uso del almacenamiento en Lambda.