AVANCE
AWS Lambda con OpenTelemetry para Java aún está en desarrollo.
Tenemos documentación similar para .NET, pero si usa Python, Go, JavaScript, Ruby o PHP para AWS Lambda con OpenTelemetry, puede usar nuestra documentación de Java o .NET como guía general para la configuración. Para obtener información adicional, consulte Distribución de AWS para OpenTelemetry.
Esta guía cubrirá cómo puede utilizar OpenTelemetry Lambda para trazar su función Java Lambda utilizando las capas OpenTelemetry Lambda administradas de AWS. OpenTelemetry facilita la instrumentación de sus funciones, incluida la instrumentación automática para muchas bibliotecas populares.
Requisitos previos
Esta guía asume que usted tiene lo siguiente:
- Una cuenta New Relic . Si no tienes uno, crea uno gratis.
- Una cuenta de AWS. Si no tienes uno, crea uno gratis.
- Una función Lambda de Java que se ejecuta en los tiempos de ejecución
java8.al2
ojava11
. Si aún no tienes uno, crea uno ahora.
Paso 1: habilitar rayos X
Aunque no utilizamos AWS X-Ray en esta configuración, aún necesitamos habilitar X-Ray en la función Lambda para habilitar la característica de seguimiento integrada en AWS OpenDistro.
Para habilitar rayos X:
- Abra su función en Lambda Console.
- Elija Configuration y luego Monitoring Tools.
- Elija Edit.
- En X-Ray, habilite Active tracing.
Alternativamente, si está utilizando plantillas SAM (modelo de aplicación serverless) o CloudFormation , puede habilitar X-Ray agregando lo siguiente a las propiedades de su función Lambda:
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Policies: - AWSLambdaBasicExecutionRole # ... - AWSXrayWriteOnlyAccess Tracing: Active
Importante
Esta opción requiere que tenga AWSLambdaBasicExecutionRole
o una política equivalente adjunta a su función.
Paso 2: instalar la capa
AWS publica una capa gestionada que incluye el recolector LambdaOpenTelemetry , el SDK de JavaOpenTelemetry y el agente de instrumentación automática ADOT.
Para instalarlo:
Abra su función en Lambda Console.
En Layers en la sección Designer , elija Add a layer.
En Specify an ARN, pegue uno de los ARN de capa para la arquitectura de su función de la lista siguiente. Reemplace
{region}
con su región de AWS, comous-east-1
.Elija Add.
- AMD64/X86_64:
arn:aws:lambda:{region}:901920570463:layer:aws-otel-java-agent-amd64-ver-1-11-1:1
- ARM64:
arn:aws:lambda:{region}:901920570463:layer:aws-otel-java-agent-arm64-ver-1-11-1:1
- AMD64/X86_64:
Para plantillas SAM o CloudFormation, agregue esto a las propiedades de su función:
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Layers: # Use this if using x86_64 architecture - !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:901920570463:layer:aws-otel-java-agent-amd64-ver-1-11-1:1 # Use this if using arm64 architecture - !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:901920570463:layer:aws-otel-java-agent-arm64-ver-1-11-1:1
Importante
Consulte los ARN más recientes publicados por AWS para verificar que los ARN de capa anteriores estén actualizados.
Paso 3: configurar la capa
Para configurar la capa necesitamos configurar un contenedor ejecutivo. El contenedor ejecutivo es un script que se ejecuta durante la inicialización de la función. En este caso, el script configura OpenTelemetry.
Abra su función en Lambda Console.
Elija Configuration y luego Environment variables.
En Environment variables, elija Edit.
Elija Add environment variable.
Para Key configúrelo en
AWS_LAMBDA_EXEC_WRAPPER
y configure Value en una de las siguientes opciones (depende de su tipo de controlador). Luego elija Save./opt/otel-handler
: para empaquetar controladores regulares (implementandoRequestHandler
)/opt/otel-proxy-handler
: para empaquetar controladores regulares (implementandoRequestHandler
) enviados mediante proxy a través de API Gateway, lo que permite la propagación del contexto HTTP/opt/otel-stream-handler
: para empaquetar controladores de transmisión (implementandoRequestStreamHandler
), habilitando la propagación del contexto HTTP para solicitudes HTTP
Para plantillas SAM o CloudFormation, agregue esto a las propiedades de su función:
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Environment: Variables: AWS_LAMBDA_EXEC_WRAPPER: /opt/otel-handler
Importante
Reemplace /opt/otel-handler
si su controlador de funciones implementa uno de los otros tipos de controladores.
Paso 4: Agregar variables de entorno de New Relic
Para enviar los datos de OpenTelemetry que esta capa recopila a New Relic, necesitamos configurar el recolector OpenTelemetry Lambda que está empaquetado con la capa para exportar la telemetría que recibe al extremo New Relic OpenTelemetry. Antes de hacer eso, primero debemos establecer algunas variables de entorno de las que dependerá.
Genera y copia una New Relic desde tu cuenta New Relic.
Abra su función en Lambda Console.
Elija Configuration y luego Environment variables.
En Environment variables, elija Edit.
Elija Add environment variable.
Para Key configúrelo en
NEW_RELIC_LICENSE_KEY
y establezca Value en el valor de la clave de licencia que generó en el paso 1. Luego elija Save.Elija Add environment variable nuevamente.
Para Key configúrelo en
NEW_RELIC_OPENTELEMETRY_ENDPOINT
y configure Value en una de las siguientes opciones (depende de su región de New Relic). Luego elija Save.otlp.nr-data.net:4317
: Si su cuenta New Relic está en la región de EE. UU.otlp.eu01.nr-data.net:4317
: Si su cuenta New Relic está en la región de la UE
Para las plantillas SAM y CloudFormation, agregue lo siguiente a las propiedades de su función. Asegúrese de reemplazar your-license-key-here
con su y otlp.nr-data.net:4317
con el extremo New Relic OpenTelemetry para su región.
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Environment: Variables: # ... NEW_RELIC_LICENSE_KEY: your-license-key-here NEW_RELIC_OPENTELEMETRY_ENDPOINT: otlp.nr-data.net:4317
Importante
Reemplace your-license-key-here
con su New Relic y otlp.nr-data.net:4317
con el extremo apropiado para su región de New Relic. Vea la lista de arriba.
Paso 5: Configurar el recolector
Ahora OpenTelemetry anularemos la configuración por defecto del recolector Lambda por una que exporte telemetría al New Relic OpenTelemetry extremo . Para hacer esto debemos incluir un archivo de configuración collector.yaml
con nuestra función.
Cree un archivo collector.yaml
en el directorio raíz de su función con el siguiente contenido:
receivers: otlp: protocols: grpc: http:
exporters: otlp: endpoint: ${NEW_RELIC_OPENTELEMETRY_ENDPOINT} headers: api-key: ${NEW_RELIC_LICENSE_KEY}
service: pipelines: traces: receivers: [otlp] exporters: [otlp] metrics: receivers: [otlp] exporters: [otlp] logs: receivers: [otlp] exporters: [otlp]
Agrupe este archivo collector.yaml
en el directorio raíz del paquete zip de su función y vuelva a desplegarlo.
- Abra su función en Lambda Console.
- Elija Configuration y luego Environment variables.
- En Environment variables, elija Edit.
- Elija Add environment variable.
- Para Key establezca
OPENTELEMETRY_COLLECTOR_CONFIG_FILE
y establezca Value en/var/task/collector.yaml
. - Luego elija Save.
Para las plantillas SAM y CloudFormation, agregue esto a las propiedades de su función:
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Environment: Variables: # ... OPENTELEMETRY_COLLECTOR_CONFIG_FILE: /var/task/collector.yaml
Importante
Esto supone que agrupaste tu collector.yaml
en el directorio raíz de tu función. Si lo agrupaste en otro lugar, reemplaza /var/task/collector.yaml
con la ruta a tu collector.yaml
.
Paso 6: vea sus datos en la UI de New Relic [ver-datos]
Primero querrás invocar tu función Lambda varias veces para comenzar a generar telemetría. Desde allí, dirígete a New Relic para encontrar tu traza, métrica y log.
Su telemetría no aparecerá en New Relic Serverless. En su lugar, encontrará sus telemetry data en New Relic OpenTelemetry Nerdlets.
Gastos generales de instrumentación automática
El agente de instrumentación automática ADOT Lambda Layer para Java tiene un impacto notable en el tiempo de inicio en AWS Lambda y, por lo general, necesitará usarlo junto con la simultaneidad aprovisionada para atender solicitudes de producción sin causar tiempos de espera en las solicitudes iniciales mientras se inicializa. Recomendamos probar primero esta configuración en un entorno sin producción para determinar la configuración adecuada para su caso de uso.
Alternativamente, puede utilizar el siguiente método de instrumentación manual. De forma predeterminada, la instrumentación manual requiere menos recursos en la inicialización de la función. Sin embargo, este método requiere un cambio de código en la mayoría de los casos.
Instrumentación manual
El método de instrumentación manual es similar al procedimiento de instrumentación automática en este documento. La única diferencia es el ARN de la capa Lambda que especifica en el paso 1.
Para la instrumentación manual, en lugar de usar los ARN de capa en el Paso 2, use uno de los ARN de capa en la lista siguiente para la arquitectura de su función:
- AMD64/X86_64:
arn:aws:lambda:{region}:901920570463:layer:aws-otel-java-wrapper-amd64-ver-1-11-1:1
- ARM64:
arn:aws:lambda:{region}:901920570463:layer:aws-otel-java-wrapper-arm64-ver-1-11-1:1
Reemplace {region}
con su región de AWS, como us-east-1
.
Todos los demás pasos siguen siendo los mismos.
Esta capa Lambda alternativa seguirá ajustando su función Lambda como el método automático. También instrumentará el SDK de AWS automáticamente. Pero todas las demás bibliotecas que utilice requerirán que incluya la biblioteca de instrumentación OpenTelemetry de la biblioteca desde el repositorio de instrumentación OpenTelemetry en la dependencia de su función y modifique su código para inicializarla.
Puedes ver un ejemplo con OKHttp en GitHub.
Importante
Consulte los ARN más recientes publicados por AWS para verificar que los ARN de capa anteriores estén actualizados.
Rastreo distribuido
En algunos casos es posible que veas un rastreo fragmentado distribuido dentro de New Relic con esta configuración. Esto ocurre cuando una traza inicia o involucra un servicio que está fuera del contexto ADOT (por ejemplo, un servicio administrado de AWS). Los tramos de ese servicio son creados por X-Ray, no por OpenTelemetry, y ADOT no los reenvía a New Relic. Aunque la traza parece fragmentada, aún proporciona información completa y valiosa sobre el desempeño dentro de la función Lambda, así como otros servicios cuyos tramos fueron enviados a New Relic.
Más información
Para obtener más información, consulte el inicio rápido de New Relic OpenTelemetry.