Aperçu
AWS Lambda avec OpenTelemetry pour .NET est toujours en développement.
Nous avons une documentation similaire pour Java, mais si vous utilisez Python, Go, JavaScript, Ruby ou PHP pour AWS Lambda avec OpenTelemetry, vous pouvez utiliser notre documentation Java ou .NET comme guide général pour la configuration. Pour plus d'informations, consultez AWS Distro pour OpenTelemetry.
Ce guide explique comment utiliser OpenTelemetry Lambda pour trace votre fonction Lambda .NET à l'aide des couches OpenTelemetry Lambda gérées par AWS. OpenTelemetry facilite l'instrumentation de vos fonctions, y compris l'instrumentation automatique pour de nombreuses bibliothèques populaires.
Prérequis
Ce guide suppose que vous disposez des éléments suivants :
- Un compte New Relic. Si vous n'en avez pas, créez-en un gratuitement.
- Un compte AWS. Si vous n'en avez pas, créez-en un gratuitement.
- Une fonction Lambda .NET. Si vous n'en avez pas encore, créez-en un maintenant.
Important
L'activation de X-Ray n'est plus nécessaire, car DisableAwsXRayContextExtraction
est défini sur true
dans le SDK AWS OTel .NET pour Lambda. Vous trouverez plus de détails dans le fichier Lisez-moi du kit AWS OTel .NET SDK pour Lambda.
Installer la couche
AWS publie une couche gérée qui inclut OpenTelemetry Lambda Collector.
Pour l'installer :
Ouvrez votre fonction dans la console Lambda.
Sous Layers dans la section Designer , choisissez Add a layer.
Sous Specify an ARN, collez l’un des ARN de couche pour l’architecture de votre fonction à partir de la liste ci-dessous. Remplacez
{region}
par votre région AWS, par exempleus-east-1
.Choisissez 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
Pour les modèles SAM et CloudFormation, ajoutez les éléments suivants aux propriétés de votre fonction :
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:1Important
Reportez-vous aux derniers ARN publiés par AWS pour vérifier que les ARN de couche ci-dessus sont à jour.
- AMD64 / X86_64:
Ajouter des variables d'environnement New Relic
Pour envoyer les OpenTelemetry données que cette couche collecte à New Relic, nous devons configurer le OpenTelemetry Lambda Collector fourni avec la couche pour exporter la télémétrie qu'il reçoit vers le point de terminaison de New Relic OpenTelemetry . Avant de faire cela, nous devons d’abord définir certaines variables d’environnement dont cela dépendra.
- Générez et copiez une New Relic à partir de votre compte New Relic.
- Ouvrez votre fonction dans la console Lambda.
- Choisissez Configuration puis Environment variables.
- Sous Environment variables, choisissez Edit.
- Choisissez Add environment variable.
- Pour le Key définissez-le sur
NEW_RELIC_LICENSE_KEY
et définissez le Value sur la valeur de la clé de licence que vous avez générée à l'étape 1. Choisissez ensuite Save. - Choisissez à nouveau Add environment variable .
- Pour le Key définissez-le sur
NEW_RELIC_OPENTELEMETRY_ENDPOINT
et définissez le Value sur l'une des options ci-dessous (dépend de votre région New Relic). Choisissez ensuite Save. - Choisissez à nouveau Add environment variable .
- Pour le Key définissez-le sur
OTEL_SERVICE_NAME
et définissez le Value sur le nom de votre fonction. Choisissez ensuite Save.
otlp.nr-data.net:4317
:Si votre compte New Relic se trouve dans la région des États-Unisotlp.eu01.nr-data.net:4317
:Si votre compte New Relic se trouve dans la région UEPour les modèles SAM et CloudFormation, ajoutez les éléments suivants aux propriétés de votre fonction. Assurez-vous de remplacer
your-license-key-here
par votre etotlp.nr-data.net:4317
par le point de terminaison New Relic OpenTelemetry pour votre région.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-hereImportant
Remplacez
your-license-key-here
par votre New Relic etotlp.nr-data.net:4317
par le point de terminaison approprié pour votre région New Relic (voir la liste ci-dessus).
Configurer le Collector
Nous allons maintenant remplacer la OpenTelemetry Lambda Collector par défaut du configuration par une configuration qui exporte la télémétrie vers le OpenTelemetry point de terminaison New Relic . Pour ce faire, nous devons inclure un fichier de configuration collector.yaml
avec notre fonction.
Créez un fichier collector.yaml
dans le répertoire racine de votre fonction avec le contenu suivant :
receivers: otlp: protocols: grpc: http:
exporters: otlp: endpoint: ${env:NEW_RELIC_OPENTELEMETRY_ENDPOINT} headers: api-key: ${env:NEW_RELIC_LICENSE_KEY}
service: pipelines: traces: receivers: [otlp] exporters: [otlp] metrics: receivers: [otlp] exporters: [otlp] logs: receivers: [otlp] exporters: [otlp]
Regroupez ce fichier collector.yaml
dans le répertoire racine du package zip de votre fonction.
Un exemple de configuration *.csproj
pourrait ressembler à ceci :
<ItemGroup> <Content Include="collector.yaml"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup>
Puis redéployez votre fonction.
- Ouvrez votre fonction dans la console Lambda.
- Choisissez Configuration puis Environment variables.
- Sous Environment variables, choisissez Edit.
- Choisissez Add environment variable.
- Pour le Key définissez
OPENTELEMETRY_COLLECTOR_CONFIG_FILE
et définissez le Value sur/var/task/collector.yaml
. - Choisissez ensuite Save.
Pour les modèles SAM et CloudFormation, ajoutez ceci aux propriétés de votre fonction :
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Environment: Variables: # ... OPENTELEMETRY_COLLECTOR_CONFIG_FILE: /var/task/collector.yaml
Important
Cela suppose que vous avez regroupé votre collector.yaml
dans le répertoire racine de votre fonction. Si vous l'avez regroupé ailleurs, remplacez /var/task/collector.yaml
par le chemin vers votre collector.yaml
.
Instrumenter Votre fonction
Ajoutez d’abord le SDK OpenTelemetry pour AWS Lambda, ainsi que le packageexportateur OTLP. Vous pouvez ajouter davantage de packages d'instrumentation OpenTelemetry , tels que OpenTelemetry.Instrumentation.AWS et OpenTelemetry.Instrumentation.Http, pour obtenir une visibilité supplémentaire sur le comportement de votre fonction.
$dotnet add package OpenTelemetry.Instrumentation.AWSLambda$dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol$dotnet add package OpenTelemetry.Instrumentation.AWS$dotnet add package OpenTelemetry.Instrumentation.Http
Ajoutez des appels à AddAWSLambdaConfigurations()
et AddOtlpExporter()
depuis TracerProvider
dans le constructeur statique de votre fonction.
Important
Le constructeur de votre fonction doit être statique, car TracerProvider
ne doit être initialisé qu'une seule fois par démarrage à froid Lambda.
TracerProvider tracerProvider = Sdk.CreateTracerProviderBuilder() // add other instrumentations here .AddAWSLambdaConfigurations(options => options.DisableAwsXRayContextExtraction = true) .AddOtlpExporter() .Build();
Important
Assurez-vous de définir la propriété DisableAwsXRayContextExtraction
sur true
si vous n'activez pas X-Ray. Dans le cas contraire, la trace ne sera pas instrumentée.
Créez une fonction wrapper avec la même signature que la fonction de gestionnaire Lambda d’origine. Appelez l'API AWSLambdaWrapper.Trace()
et transmettez TracerProvider
, la fonction Lambda d'origine et ses entrées comme paramètres.
// 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 votre gestionnaire d'origine est une fonction asynchrone, utilisez l'API TraceAsync()
au lieu 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.}
Par exemple, une fonction API Gateway de base Lambda ressemblerait à ceci :
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") }; } } }}
Définissez ensuite la fonction wrapper comme gestionnaire de la fonction Lambda. Pour la classe ci-dessus, le gestionnaire serait function::Example.Function::TracingFunctionHandler
.
Pour un exemple fonctionnel, y compris le tracing du SDK AWS, consultez cet exemple d'application.
Ce qui précède n'est qu'un exemple de base. Pour une instrumentation plus avancée, reportez-vous à la documentation du SDK OpenTelemetry .NET.
Affichez vos données dans l'interface utilisateur de New Relic
Tout d’abord, vous souhaiterez appeler votre fonction Lambda plusieurs fois pour commencer à générer de la télémétrie. De là, rendez-vous sur New Relic pour trouver votre trace, vos métriques et votre log.
Votre télémétrie n'apparaîtra pas sous New Relic Serverless. Au lieu de cela, vous trouverez vos données télémétriques sous les Nerdlets New Relic OpenTelemetry .
Tracing distribué
Dans certains cas, vous pouvez voir des traces distribuées fragmentées dans New Relic avec cette configuration. Cela se produit lorsqu'une trace démarre ou implique un service qui est en dehors du contexte ADOT (par exemple, un service géré AWS). Les portées de ce service sont créées par X-Ray, et non par OpenTelemetry, et ADOT ne les transmet pas à New Relic. Bien que les traces semblent fragmentées, elles fournissent néanmoins des informations complètes détaillées sur les performances au sein de la fonction Lambda ainsi que d'autres services dont les traces ont été transmises à New Relic.
Plus d'informations
Pour plus d'informations, consultez le démarrage rapide de New Relic OpenTelemetry.