Trazado distribuido con aplicaciones Serverless de AWS Lambda

Trace funciones Serverless

Al conectar sus trazas Serverless con métricas, Datadog proporciona una imagen rica en contexto del rendimiento de su aplicación, permitiéndole resolver de forma más efectiva los problemas de rendimiento dada la naturaleza distribuida de las aplicaciones Serverless.

Los SDK de Datadog para Python, Node.js, Ruby, Go, Java y .NET soportan trazado distribuido para AWS Lambda.

Envíe trazas desde su aplicación Serverless

Diagrama de arquitectura para la traza de AWS Lambda con Datadog

Los SDK de Datadog para Python, Node.js, Ruby, Go, Java y .NET soportan trazado distribuido para AWS Lambda. Puede instalar el SDK siguiendo las instrucciones de instalación.

Recomendaciones de tiempo de ejecución

Python
Node.js
Ruby
Java
Go
.NET

Python y Node.js

La biblioteca y SDKs de Datadog Lambda para Python y Node.js soportan:

  • Correlación automática de registros y trazas de Lambda con ID de traza e inyección de etiquetas.
  • Instalación sin cambios en el código utilizando Serverless Framework, AWS SAM e integraciones de AWS CDK.
  • Trazado de solicitudes HTTP que invocan funciones Lambda o contenedores descendentes.
  • Trazado de invocaciones consecutivas de Lambda realizadas a través del SDK de AWS.
  • Trazado de inicio en frío
  • Trazado de invocaciones asíncronas de Lambda a través de Servicios Administrados de AWS
    • API Gateway
    • SQS
    • SNS
    • Integración directa de SNS y SQS
    • Kinesis
    • EventBridge
    • DynamoDB
    • S3
    • Step Functions
  • Trazado de docenas de bibliotecas adicionales listas para usar Python y Node.js.

Para aplicaciones Serverless en Python y Node.js, Datadog recomienda que instale los SDKs de Datadog.

¿Busca trazar recursos Serverless que no están listados arriba? Abra una solicitud de función.

Ruby

La Biblioteca Lambda de Datadog y los SDKs para Ruby soportan:

  • Correlación automática de logs y trazas de Lambda con ID de traza e inyección de etiquetas.
  • Trazado de solicitudes HTTP que invocan funciones Lambda o contenedores descendentes.
  • Trazado de docenas de bibliotecas adicionales de Ruby listas para usar.

Puede trazar sus funciones Serverless en Datadog con los SDK de Datadog.

¿Busca trazar recursos Serverless que no están listados arriba? Abra una solicitud de función.

Go

La Biblioteca Lambda de Datadog y los SDKs para Go soportan:

  • Correlación manual de registros y trazas de Lambda con ID de traza e inyección de etiquetas.
  • Trazado de solicitudes HTTP que invocan funciones Lambda o contenedores descendentes.
  • Trazado de docenas de bibliotecas adicionales de Go listas para usar.

Para aplicaciones Serverless en Go, Datadog recomienda instalar los SDK de Datadog.

¿Busca trazar recursos Serverless que no están listados arriba? Abra una solicitud de función.

Java

La Biblioteca Lambda de Datadog y los SDKs para Java soportan:

  • Correlación de los registros y trazas de Lambda con el ID de traza y la inyección de etiquetas. Consulte Conectando registros y trazas de Java para más detalles.
  • Trazado de solicitudes HTTP que invocan funciones Lambda o contenedores descendentes.
  • Trazado de docenas de bibliotecas adicionales de Java listas para usar.

Para aplicaciones Serverless en Java, Datadog recomienda instalar los SDK de Datadog.

¿Tiene comentarios sobre los SDK de Datadog para funciones Lambda en Java? Asegúrese de revisar las discusiones que se están llevando a cabo en el canal #serverless de la comunidad de Datadog en Slack.

.NET

El SDK para .NET soporta:

  • Trazado de solicitudes HTTP que invocan funciones Lambda o contenedores descendentes.
  • Trazado de docenas de bibliotecas adicionales de .NET listas para usar.

Para aplicaciones sin servidor en .NET, Datadog recomienda instalar los SDK de Datadog.

Aprenda más sobre el trazado a través de aplicaciones Serverless en .NET Azure.

Auto-enlazado de tramos

En Datadog, una traza de DynamoDB. En la parte superior, un mensaje dice 'Esta traza está vinculada a otras trazas'. La pestaña Span Links está abierta y muestra un enlace clicable a otra traza de DynamoDB.

Datadog detecta automáticamente los tramos vinculados cuando los segmentos de sus solicitudes asíncronas no pueden propagar el contexto de la traza. Por ejemplo, esto puede ocurrir cuando una solicitud activa un Evento de Cambio de S3 o Flujos de DynamoDB. Puede ver que los tramos auto-enlazados aparecen en la pestaña Enlaces de Tramos. Estos aparecen como Hacia Atrás o Hacia Adelante.

Hacia Atrás: El tramo enlazado fue causado por la traza que está visualizando.

Hacia Adelante: El tramo enlazado causó la traza que está visualizando.

Los filtros de muestreo y retención de trazas pueden interferir con el auto-enlazado. Para mejorar sus posibilidades de ver tramos auto-enlazados, aumente su tasa de muestreo o ajuste sus filtros de retención de trazas.

Tecnologías soportadas

El auto-enlazado de tramos está disponible para:

Auto-enlazado de DynamoDB Change Stream

Para DynamoDB Change Streams, el auto-enlazado de tramos soporta las siguientes operaciones:

  • PutItem
  • UpdateItem
  • DeleteItem
  • BatchWriteItem
  • TransactWriteItems
El PutItem la operación requiere configuración adicional. Para más información, consulte Instrumentando Aplicaciones Serverless en Python o Instrumentando Aplicaciones Serverless en Node.js.

Auto-enlazado de Notificaciones de Cambio en S3

Para Notificaciones de Cambio en S3, el auto-enlazado de tramos soporta las siguientes operaciones:

  • PutObject
  • CompleteMultipartUpload
  • CopyObject

Entornos híbridos

Para visibilidad de extremo a extremo a través de funciones Lambda, hosts, contenedores y servicios administrados, instale los SDKs de Datadog (dd-trace) tanto en sus funciones Lambda como en sus hosts. Sus trazas mostrarán entonces una imagen completa de las solicitudes que cruzan los límites de infraestructura.

En Lambda, instale dd-trace con la Extensión de Lambda de Datadog, que ejecuta el Agente de Datadog dentro del entorno de ejecución de Lambda y envía trazas directamente a Datadog con un mínimo de sobrecarga. La Extensión de Lambda es el método de instalación recomendado para nuevas y existentes aplicaciones Serverless.

Consulte la documentación de APM de Datadog para la configuración de trazado en entornos basados en contenedores y hosts.

Perfilando sus Funciones Lambda

El Continuous Profiler de Datadog está disponible en versión preliminar para Python en la versión 4.62.0 y las versiones de capa 62 y superiores. Esta función opcional se habilita configurando la variable de entorno DD_PROFILING_ENABLED a true.

El Continuous Profiler funciona creando un hilo que se despierta periódicamente y toma una instantánea de la CPU y el heap de todo el código Python en ejecución. Esto puede incluir el propio Continuous Profiler. Si desea que el Continuous Profiler se ignore a sí mismo, configure DD_PROFILING_IGNORE_PROFILER a true.

Fusión de Trazas

Casos de uso

Datadog recomienda usar solo la biblioteca de traza de Datadog APM (dd-trace), pero en algunas situaciones avanzadas, los usuarios pueden combinar Datadog tracing y AWS X-Ray utilizando la fusión de trazas. La fusión de trazas está disponible para funciones de AWS Lambda en Node.js y Python. Si no está seguro de qué SDK usar, lea sobre elegir su SDK.

El trazado de AWS Step Functions es compatible de forma nativa con Datadog y ya no requiere X-Ray. Vea Serverless Monitoring para AWS Step Functions y Merge Step Functions and Lambda Traces.

Hay dos razones principales para instrumentar tanto dd-trace como las bibliotecas de traza de AWS X-Ray:

  • En un entorno serverless de AWS, ya está trazando sus funciones Lambda con dd-trace, necesita la traza activa de AWS X-Ray para un servicio administrado por AWS que Datadog APM aún no instrumenta (como AppSync), y desea visualizar los dd-trace y los tramos de AWS X-Ray en una sola traza.
  • En un entorno híbrido con funciones Lambda y servidores, dd-trace instrumenta sus servidores, AWS X-Ray instrumenta sus funciones Lambda, y desea visualizar trazas conectadas para transacciones a través de funciones Lambda y servidores.

Nota: Esto puede resultar en facturas de uso más altas. Los tramos de X-Ray continúan disponibles en sus trazas fusionadas después de 2-5 minutos. En muchos casos, Datadog recomienda usar un solo SDK. Aprenda más sobre elegir su SDK.

Puede encontrar instrucciones de configuración para cada uno de los casos de uso anteriores a continuación:

Fusión de trazas en un entorno serverless de AWS

AWS X-Ray proporciona tanto un servicio backend de AWS (AWS X-Ray active tracing) como un conjunto de bibliotecas de cliente. Habilitar solo el servicio backend de AWS en la consola de Lambda le brinda Initialization y Invocation tramos para sus funciones de AWS Lambda. También puede habilitar AWS X-Ray active tracing desde las consolas de API Gateway y Step Function.

Tanto el SDK de AWS X-Ray como las bibliotecas de clientes de Datadog APM (dd-trace) añaden metadatos y tramos para llamadas descendentes accediendo a la función directamente. Suponiendo que está utilizando dd-trace para rastrear a nivel de controlador, su configuración debería ser similar a la siguiente:

  1. Ha habilitado el rastreo activo de AWS X-Ray en sus funciones Lambda desde la consola de AWS Lambda y nuestra integración de AWS X-Ray dentro de Datadog.
  2. Ha instrumentado sus funciones Lambda con Datadog APM (dd-trace) siguiendo las instrucciones de instalación para su entorno de ejecución de Lambda.
  3. Las bibliotecas de terceros son parcheadas automáticamente por dd-trace, por lo que no es necesario instalar las bibliotecas de clientes de AWS X-Ray.
  4. Establezca la variable de entorno DD_MERGE_XRAY_TRACES en true en sus funciones Lambda para fusionar las trazas de X-Ray y dd-trace (DD_MERGE_DATADOG_XRAY_TRACES en Ruby).

Rastreo a través de AWS Lambda y servidores

Instale los SDK de Datadog (dd-trace) tanto en sus funciones Lambda como en los servidores. Sus trazas luego muestran automáticamente una imagen completa de las solicitudes que cruzan los límites de infraestructura, ya sea AWS Lambda, contenedores, servidores locales o servicios administrados.

traza de una solicitud de un servidor a una función Lambda

Propagación de traza

Traza distribuida no-HTTP en entornos Serverless

Configuración requerida

A veces se requiere instrumentación adicional para ver una sola traza conectada en aplicaciones Serverless de Node y Python que activan funciones Lambda de forma asíncrona. Si recién está comenzando a monitorear aplicaciones Serverless en Datadog, siga nuestros pasos principales de instalación y lea esta página sobre cómo elegir su SDK. Una vez que esté enviando trazas desde sus funciones Lambda a Datadog utilizando la Biblioteca Lambda de Datadog, puede seguir estos pasos para conectar trazas entre dos funciones Lambda en casos como:

  • Activando funciones Lambda a través de Step Functions
  • Invocando funciones Lambda a través de protocolos no-HTTP como MQTT

El trazado de muchos servicios administrados de AWS (listados aquí) es compatible de forma predeterminada y no requiere seguir los pasos descritos en esta página.

Para conectar con éxito el contexto de traza entre los recursos que envían trazas, necesitas:

  • Incluir el contexto de traza de Datadog en los eventos salientes. El evento saliente puede originarse de un host o de una función Lambda con dd-trace instalado.
  • Extraer el contexto de traza en la función Lambda consumidora.

Pasando el contexto de traza

Los siguientes ejemplos de código describen cómo pasar el contexto de traza en las cargas útiles salientes a servicios que no soportan encabezados HTTP, o servicios administrados que no son soportados nativamente por Datadog en Node y Python:

En Python, puede usar la función auxiliar get_dd_trace_context para pasar el contexto de traza a los eventos salientes en funciones Lambda:

import json
import boto3
import os

from datadog_lambda.tracing import get_dd_trace_context  # Datadog tracing helper function

def handler(event, context):
    my_custom_client.sendRequest(
        {
          'myCustom': 'data',
          '_datadog': {
              'DataType': 'String',
              'StringValue': json.dumps(get_dd_trace_context()) # Includes trace context in outgoing payload.
          },
        },
    )

En Node, puede usar la función auxiliar getTraceHeaders para pasar el contexto de traza a los eventos salientes en una función Lambda:

const { getTraceHeaders } = require("datadog-lambda-js"); // Datadog tracing helper function

module.exports.handler = async event => {
  const _datadog = getTraceHeaders(); // Captures current Datadog trace context.

  var payload = JSON.stringify({ data: 'sns', _datadog });
  await myCustomClient.sendRequest(payload)

Desde servidores

Si no está pasando el contexto de traza desde sus funciones Lambda, puede usar la siguiente plantilla de código en lugar de las funciones auxiliares getTraceHeaders y get_dd_trace_context para obtener el contexto de tramo actual. Las instrucciones sobre cómo hacer esto en cada entorno de ejecución están descritas aquí.

const tracer = require("dd-trace");

exports.handler = async event => {
  const span = tracer.scope().active();
  const _datadog = {}
  tracer.inject(span, 'text_map', _datadog)

  // ...

Extrayendo el contexto de traza

Para extraer el contexto de traza mencionado anteriormente de la función Lambda consumidora, necesita definir una función extractora que capture el contexto de traza antes de la ejecución del controlador de su función Lambda. Para hacer esto, configure la variable de entorno DD_TRACE_EXTRACTOR para apuntar a la ubicación de su función extractora. El formato para esto es <FILE NAME>.<FUNCTION NAME>. Por ejemplo, extractors.json si el extractor json está en el archivo extractors.js. Datadog recomienda que coloque todos sus métodos extractores en un solo archivo, ya que los extractores pueden ser reutilizados en múltiples funciones Lambda. Estos extractores son completamente personalizables para adaptarse a cualquier caso de uso.

Notas:

  • Si está usando TypeScript o un empaquetador como webpack, debe import o require su módulo de Node.js donde se definen los extractores. Esto asegura que el módulo se compile y se incluya en su paquete de implementación de Lambda.
  • Si su función de Lambda en Node.js se ejecuta en arm64, debe definir el extractor en el código de su función en lugar de usar la variable de entorno DD_TRACE_EXTRACTOR.

Extractores de muestra

El siguiente código muestra extractores de muestra que podrías usar para propagar el contexto de traza a través de un sistema de terceros o una API que no soporta encabezados HTTP estándar.

def extractor(payload):
    trace_headers = json.loads(payload["_datadog"]);
    trace_id = trace_headers["x-datadog-trace-id"];
    parent_id = trace_headers["x-datadog-parent-id"];
    sampling_priority = trace_headers["x-datadog-sampling-priority"];
    return trace_id, parent_id, sampling_priority
exports.json = (payload) => {
    const traceData = payload._datadog
    const traceID = traceData["x-datadog-trace-id"];
    const parentID = traceData["x-datadog-parent-id"];
    const sampledHeader = traceData["x-datadog-sampling-priority"];
    const sampleMode = parseInt(sampledHeader, 10);

    return {
      parentID,
      sampleMode,
      source: 'event',
      traceID,
    };
};
var exampleSQSExtractor = func(ctx context.Context, ev json.RawMessage) map[string]string {
	eh := events.SQSEvent{}

	headers := map[string]string{}

	if err := json.Unmarshal(ev, &eh); err != nil {
		return headers
	}

	// Using SQS as a trigger with a batchSize=1 so it's important we check
  // for this as a single SQS message will drive the execution of the handler.
	if len(eh.Records) != 1 {
		return headers
	}

	record := eh.Records[0]

	lowercaseHeaders := map[string]string{}
	for k, v := range record.MessageAttributes {
		if v.StringValue != nil {
			lowercaseHeaders[strings.ToLower(k)] = *v.StringValue
		}
	}

	return lowercaseHeaders
}

cfg := &ddlambda.Config{
    TraceContextExtractor: exampleSQSExtractor,
}
ddlambda.WrapFunction(handler, cfg)

Enviando trazas a Datadog con la integración de X-Ray

Si tiene instrumentación de X-Ray existente y desea seguir usándola, instale la integración de AWS X-Ray para enviar trazas de X-Ray a Datadog. Para nuevas aplicaciones Serverless, Datadog recomienda instrumentar funciones Lambda con la Datadog Lambda Extension en su lugar.

Lectura adicional