AWS Lambda y OpenTelemetry
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.
Instrumentar AWS Lambda con OpenTelemetry
Existen varias formas de instrumentar las funciones de AWS Lambda con OpenTelemetry y enviar los datos a Datadog:
Compatibilidad de la API de OpenTelemetry en los rastreadores de Datadog
La biblioteca de rastreo de Datadog, que se incluye en la Datadog Lambda Extension tras su instalación, acepta tramos (spans) y trazas 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.
Enviar trazas de OpenTelemetry desde cualquier SDK de OpenTelemetry a través de la Datadog Lambda Extension
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).
Nota: No se admite el envío de métricas personalizadas desde el endpoint OTLP en la extensión.
Pídele a OpenTelemetry que exporte tramos a la Datadog Lambda Extension. Luego, añade la instrumentación de OpenTelemetry para AWS Lambda.
from opentelemetry.instrumentation.botocore import BotocoreInstrumentor from opentelemetry.instrumentation.aws_lambda import AwsLambdaInstrumentor from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.exporter.otlp.trace_exporter import OTLPExporter from opentelemetry.sdk.trace.export import SimpleSpanProcessor from opentelemetry.resource import Resource from opentelemetry.semconv.resource import ( SERVICE_NAME, SemanticResourceAttributes, ) # Create a TracerProvider tracer_provider = TracerProvider(resource=Resource.create({SERVICE_NAME: <YOUR_SERVICE_NAME>})) # Add a span processor with an OTLP exporter tracer_provider.add_span_processor( SimpleSpanProcessor( OTLPExporter(endpoint="http://localhost:4318/v1/traces") ) ) # Register the provider trace.set_tracer_provider(tracer_provider) # Instrument AWS SDK and AWS Lambda BotocoreInstrumentor().instrument(tracer_provider=tracer_provider) AwsLambdaInstrumentor().instrument(tracer_provider=tracer_provider)
// instrument.js const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node"); const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http'); const { Resource } = require('@opentelemetry/resources'); const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions'); const { SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base'); const provider = new NodeTracerProvider({ resource: new Resource({ [ SemanticResourceAttributes.SERVICE_NAME ]: 'rey-app-otlp-dev-node', }) }); provider.addSpanProcessor( new SimpleSpanProcessor( new OTLPTraceExporter( { url: 'http://localhost:4318/v1/traces' }, ), ), ); provider.register(); const { AwsInstrumentation } = require('@opentelemetry/instrumentation-aws-sdk'); const { AwsLambdaInstrumentation } = require('@opentelemetry/instrumentation-aws-lambda'); const { registerInstrumentations } = require('@opentelemetry/instrumentation'); registerInstrumentations({ instrumentations: [ new AwsInstrumentation({ suppressInternalInstrumentation: true, }), new AwsLambdaInstrumentation({ disableAwsContextPropagation: true, }), ], });
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: aws region: <YOUR_REGION> runtime: python3.8 # o la versión de Python que utilizas environment: DD_API_KEY: ${env:DD_API_KEY} DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT: localhost:4318 layers: - arn:aws:lambda:sa-east-1:464622532012:layer:Datadog-Extension:53 functions: python: handler: handler.handler environment: INSTRUMENTATION_FLAG: true
A continuación, actualiza tu código Python según corresponda. Por ejemplo, en handler.py:
import os def handler(event, context): if os.environ.get('INSTRUMENTATION_FLAG') == 'true': # Ejecuta aquí la lógica de la instrumentación print("Instrumentation is enabled") # Ejecuta la lógica normal del controlador aquí print("Handling the event")
# serverless.yml service: <YOUR_SERVICE_NAME> provider: name: aws region: <YOUR_REGION> runtime: nodejs18.x # o la versión de Node.js que utilizas environment: DD_API_KEY: ${env:DD_API_KEY} DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT: localhost:4318 layers: - arn:aws:lambda:sa-east-1:464622532012:layer:Datadog-Extension:53 functions: node: handler: handler.handler environment: NODE_OPTIONS: --require instrument
Despliega.
Referencias adicionales
Más enlaces, artículos y documentación útiles: