OpenTelemetry es un marco de observabilidad de código abierto que proporciona a los equipos de TI protocolos y herramientas estandarizados para recopilar y enrutar datos de telemetría.
Esta página trata sobre el uso de OpenTelemetry con Datadog Serverless Monitoring para AWS Lambda. Para obtener más información, incluido cómo utilizar OpenTelemetry en entornos que no son serverless, consulta OpenTelemetry en Datadog.
La biblioteca de rastreo de Datadog, que se incluye en la extensión Lambda Datadog tras su instalación, acepta tramos (spans) y trazas (traces) personalizados creados con código instrumentado con OpenTelemetry, procesa la telemetría y la envía a Datadog.
Puedes utilizar este enfoque si, por ejemplo, tu objetivo principal es el código que ya se ha instrumentado con la API de OpenTelemetry. Esto significa que puedes mantener una instrumentación independiente del proveedor para todos tus servicios, sin dejar de aprovechar la implementación, el etiquetado y las características nativos de Datadog.
Para instrumentar AWS Lambda con la API de OpenTelemetry, define la variable de entorno DD_TRACE_OTEL_ENABLED como true en tu función de Lambda. Consulta Instrumentación personalizada con la API de OpenTelemetry para obtener instrucciones específicas del tiempo de ejecución.
Este enfoque es análogo a la Ingesta de OLTP en el Datadog Agent. Se recomienda en situaciones en las que la compatibilidad del rastreo puede no estar disponible para un tiempo de ejecución (por ejemplo, Rust o PHP).
Pídele a OpenTelemetry que exporte tramos a la extensión Datadog Lambda. Luego, añade la instrumentación de OpenTelemetry para AWS Lambda.
fromopentelemetry.instrumentation.botocoreimportBotocoreInstrumentorfromopentelemetry.instrumentation.aws_lambdaimportAwsLambdaInstrumentorfromopentelemetryimporttracefromopentelemetry.sdk.traceimportTracerProviderfromopentelemetry.exporter.otlp.trace_exporterimportOTLPExporterfromopentelemetry.sdk.trace.exportimportSimpleSpanProcessorfromopentelemetry.resourceimportResourcefromopentelemetry.semconv.resourceimport(SERVICE_NAME,SemanticResourceAttributes,)# Create a TracerProvidertracer_provider=TracerProvider(resource=Resource.create({SERVICE_NAME:<YOUR_SERVICE_NAME>}))# Add a span processor with an OTLP exportertracer_provider.add_span_processor(SimpleSpanProcessor(OTLPExporter(endpoint="http://localhost:4318/v1/traces")))# Register the providertrace.set_tracer_provider(tracer_provider)# Instrument AWS SDK and AWS LambdaBotocoreInstrumentor().instrument(tracer_provider=tracer_provider)AwsLambdaInstrumentor().instrument(tracer_provider=tracer_provider)
Modifica el archivo serverless.yml para aplicar la instrumentación en el tiempo de ejecución, añade la versión 53 de la extensión de Datadog o una superior y habilita OpenTelemetry en la extensión de Datadog con la variable de entorno DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT definida como localhost:4318 (para HTTP) o DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT definida como localhost:4317 (para gRPC). No añadas la capa de rastreo de Datadog.
service:<YOUR_SERVICE_NAME>provider:name:awsregion:<YOUR_REGION>runtime:python3.8 # o la versión de Python que utilizasenvironment:DD_API_KEY:${env:DD_API_KEY}DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT:localhost:4318layers:- arn:aws:lambda:sa-east-1:464622532012:layer:Datadog-Extension:53functions:python:handler:handler.handlerenvironment:INSTRUMENTATION_FLAG:true
A continuación, actualiza tu código Python según corresponda. Por ejemplo, en handler.py:
importosdefhandler(event,context):ifos.environ.get('INSTRUMENTATION_FLAG')=='true':# Ejecuta aquí la lógica de la instrumentaciónprint("Instrumentation is enabled")# Ejecuta la lógica normal del controlador aquíprint("Handling the event")
# serverless.ymlservice:<YOUR_SERVICE_NAME>provider:name:awsregion:<YOUR_REGION>runtime:nodejs18.x# o la versión de Node.js que utilizasenvironment:DD_API_KEY:${env:DD_API_KEY}DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT:localhost:4318layers:- arn:aws:lambda:sa-east-1:464622532012:layer:Datadog-Extension:53functions:node:handler:handler.handlerenvironment:NODE_OPTIONS:--require instrument