AVANCE
AWS Lambda con OpenTelemetry para .NET aún está en desarrollo.
Disponemos de documentación similar para Java, pero si utiliza Python, Go, JavaScript, Ruby o PHP para AWS Lambda con OpenTelemetry, puede utilizar 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 Lambda .NET 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 .NET. Si aún no tienes uno, crea uno ahora.
Importante
Ya no es necesario habilitar X-Ray porque DisableAwsXRayContextExtraction
está configurado en true
en AWS OTel .NET SDK para Lambda. Puede encontrar más detalles en AWS OTel .NET SDK para Lambda Readme.
Instalar la capa
AWS publica una capa administrada que incluye el recolector OpenTelemetry Lambda.
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-collector-amd64-ver-0-90-1:1
- ARM64:
arn:aws:lambda:\<region>:901920570463:layer:aws-otel-collector-arm64-ver-0-90-1:1
Para las plantillas SAM y CloudFormation, agregue lo siguiente a las propiedades de su función:
yourFunctionHere:Type: AWS::Serverless::FunctionProperties:...Layers:# Use this if using x86_64 architecture- !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:901920570463:layer:aws-otel-collector-amd64-ver-0-90-1:1# Use this if using arm64 architecture- !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:901920570463:layer:aws-otel-collector-arm64-ver-0-90-1:1Importante
Consulte los ARN más recientes publicados por AWS para verificar que los ARN de capa anteriores estén actualizados.
- AMD64/X86_64:
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 establezcaValue
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 configureValue
en una de las siguientes opciones (depende de su región de New Relic). Luego elija
Save
.
Elija
Add environment variable
nuevamente.
Para
Key
configúrelo en
OTEL_SERVICE_NAME
y establezcaValue
en el nombre de su función. 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 UEPara 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 yotlp.nr-data.net:4317
con el extremo New Relic OpenTelemetry para su región.yourFunctionHere:Type: AWS::Serverless::FunctionProperties:...Environment:Variables:...NEW_RELIC_LICENSE_KEY: your-license-key-hereNEW_RELIC_OPENTELEMETRY_ENDPOINT: otlp.nr-data.net:4317OTEL_SERVICE_NAME: your-function-name-hereImportante
Reemplace
your-license-key-here
con su New Relic yotlp.nr-data.net:4317
con el extremo apropiado para su región de New Relic (consulte la lista anterior).
Configurar el recolector
Ahora anularemos la configuración predeterminada del recolector OpenTelemetry Lambda con una que exporte telemetría al extremo New Relic OpenTelemetry. 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]
Empaquete este archivo collector.yaml
en el directorio raíz del paquete zip de su función.
Un ejemplo de configuración *.csproj
podría verse así:
<ItemGroup> <Content Include="collector.yaml"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup>
Luego vuelve a desplegar tu función.
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 establezcaValue
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
.
Instrumentado Tu Función
Primero agregue el SDK de OpenTelemetry para AWS Lambda, así como el paquete exportador OTLP. Puede agregar más paquetes de instrumentación de OpenTelemetry, como OpenTelemetry.instrumentación.AWS y OpenTelemetry.instrumentación.Http, para obtener visibilidad adicional del comportamiento de su función.
$dotnet add package OpenTelemetry.Instrumentation.AWSLambda$dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol$dotnet add package OpenTelemetry.Instrumentation.AWS$dotnet add package OpenTelemetry.Instrumentation.Http
Agregue llamadas a AddAWSLambdaConfigurations()
y AddOtlpExporter()
desde TracerProvider
en el constructor estático de su función.
Importante
El constructor de su función debe ser estático, porque TracerProvider
solo debe inicializarse una vez por arranque en frío de Lambda.
TracerProvider tracerProvider = Sdk.CreateTracerProviderBuilder() // add other instrumentations here .AddAWSLambdaConfigurations(options => options.DisableAwsXRayContextExtraction = true) .AddOtlpExporter() .Build();
Importante
Asegúrese de establecer la propiedad DisableAwsXRayContextExtraction
en true
si no habilita X-Ray. En caso contrario, la traza no será instrumentada.
Cree una función contenedora con la misma firma que la función del controlador Lambda original. Llame a la API AWSLambdaWrapper.Trace()
y pase TracerProvider
, la función Lambda original y sus entradas como parámetro.
// new Lambda function handler passed inpublic string TracingFunctionHandler(JObject input, ILambdaContext context) => AWSLambdaWrapper.Trace(tracerProvider, OriginalFunctionHandler, input, context);
public string OriginalFunctionHandler(JObject input, ILambdaContext context) { return input?.ToString();}
Si su controlador original es una función asíncrona, utilice la API TraceAsync()
en lugar de Trace()
.
public Task<APIGatewayProxyResponse> TracingFunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) => AWSLambdaWrapper.TraceAsync(tracerProvider, OriginalFunctionHandler, request, context);
public async Task<APIGatewayProxyResponse> OriginalFunctionHandler(APIGatewayProxyRequest apigProxyEvent, ILambdaContext context){ //your function here.}
Por ejemplo, una función Lambda básica de API Gateway se vería así:
using System;using Amazon.Lambda.APIGatewayEvents;using Amazon.Lambda.Core;using OpenTelemetry;using OpenTelemetry.Instrumentation.AWSLambda;using OpenTelemetry.Trace;
namespace Example{ public class Function { public static TracerProvider tracerProvider;
static Function() { tracerProvider = Sdk.CreateTracerProviderBuilder() .AddAWSLambdaConfigurations(options => options.DisableAwsXRayContextExtraction = true) .AddOtlpExporter() .Build();
// use AwsSdkSample::AwsSdkSample.Function::TracingFunctionHandler as input Lambda handler instead public APIGatewayProxyResponse TracingFunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { return AWSLambdaWrapper.Trace(tracerProvider, FunctionHandler, request, context); }
/// <summary> /// A simple function that takes a APIGatewayProxyRequest and returns a APIGatewayProxyResponse /// </summary> /// <param name="input"></param> /// <param name="context"></param> /// <returns></returns> public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { return new APIGatewayProxyResponse() { StatusCode = 200, Body = Environment.GetEnvironmentVariable("_X_AMZN_TRACE_ID") }; } } }}
Luego configure la función contenedora como controlador de la función Lambda. Para la clase anterior, el controlador sería function::Example.Function::TracingFunctionHandler
.
Para ver un ejemplo práctico, incluido el seguimiento del SDK de AWS, consulte esta aplicación de muestra.
Lo anterior es solo un ejemplo básico; para instrumentación más avanzada, consulte la documentación de OpenTelemetry .NET SDK.
Vea sus datos en la UI de New Relic
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 registro.
Su telemetría no aparecerá en New Relic Serverless. En su lugar, encontrará sus telemetry data en New Relic OpenTelemetry Nerdlets.
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.