Migre a .NET OpenTelemetry - AWS X-Ray

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Migre a .NET OpenTelemetry

Al utilizar el trazado de rayos X en sus aplicaciones.NET, se utiliza el SDK X-Ray.NET con esfuerzos manuales para la instrumentación.

Esta sección proporciona ejemplos de código en la Soluciones de instrumentación manual con el SDK sección para migrar de la solución de instrumentación manual de X-Ray a las soluciones de instrumentación OpenTelemetry manual para.NET. Como alternativa, puede migrar de la instrumentación manual de X-Ray a las soluciones de instrumentación OpenTelemetry automática y a las aplicaciones .NET de los instrumentos sin tener que modificar el código fuente de la aplicación en la Soluciones de instrumentación automática de código cero sección.

Soluciones de instrumentación automática de código cero

OpenTelemetry proporciona soluciones de autoinstrumentación sin código. Estas soluciones rastrean las solicitudes sin necesidad de cambiar el código de la aplicación.

OpenTelemetrybasadas en opciones de instrumentación automática

  1. Uso de la AWS distribución para la instrumentación automática OpenTelemetry (ADOT) para .NET: para instrumentar automáticamente las aplicaciones.NET, consulte Seguimiento y métricas con la distribución para la AWS instrumentación automática de.NET. OpenTelemetry

    (Opcional) Habilite las señales de CloudWatch aplicación al instrumentar automáticamente sus aplicaciones AWS con la instrumentación automática de ADOT.NET para:

    • Supervise el estado actual de las aplicaciones

    • Realice un seguimiento del rendimiento de las aplicaciones a largo plazo en comparación con los

    • Obtenga una visión unificada y centrada en las aplicaciones de sus aplicaciones, servicios y dependencias

    • Supervise y clasifique el estado de las aplicaciones

    Para obtener más información, consulte Application Signals.

  2. Uso de la instrumentación automática de código cero de OpenTelemetry .Net: para instrumentar automáticamente con OpenTelemetry .Net, consulte Tracing and Metrics with the Distro para ver la AWS instrumentación automática de .NET. OpenTelemetry

Soluciones de instrumentación manual con el SDK

Tracing configuration with X-Ray SDK

Para las aplicaciones web.NET, el SDK de X-Ray se configura en la sección AppSettings del Web.config archivo.

Ejemplo: Web.config

<configuration> <appSettings> <add key="AWSXRayPlugins" value="EC2Plugin"/> </appSettings> </configuration>

En el caso de.NET Core, se utiliza un archivo denominado appsettings.json con una clave de nivel superior y, a continuación, XRay se crea un objeto de configuración para inicializar la grabadora de rayos X.

Ejemplo para .NET appsettings.json

{ "XRay": { "AWSXRayPlugins": "EC2Plugin" } }

Ejemplo de .NET Core Program.cs: configuración de grabadora

using Amazon.XRay.Recorder.Core; ... AWSXRayRecorder.InitializeInstance(configuration);
Tracing configuration with OpenTelemetry SDK

Agregue estas dependencias:

dotnet add package OpenTelemetry dotnet add package OpenTelemetry.Contrib.Extensions.AWSXRay dotnet add package OpenTelemetry.Sampler.AWS --prerelease dotnet add package OpenTelemetry.Resources.AWS dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol dotnet add package OpenTelemetry.Extensions.Hosting dotnet add package OpenTelemetry.Instrumentation.AspNetCore

Para su aplicación.NET, configure el OpenTelemetry SDK configurando el Global TracerProvider. El siguiente ejemplo de configuración también habilita la instrumentación paraASP.NET Core. Para instrumentarASP.NET, consulteRastreo de las solicitudes entrantes (instrumentación básica de ASP.NET y ASP.NET). Para usarlo OpenTelemetry con otros marcos, consulte el Registro para ver más bibliotecas de marcos compatibles.

Se recomienda configurar los siguientes componentes:

  • An OTLP Exporter— Necesario para exportar las trazas al CloudWatch OpenTelemetry agente/recopilador

  • Un propagador de AWS rayos X: necesario para propagar el contexto de rastreo a AWS los servicios integrados con X-Ray

  • Un muestreador remoto de AWS rayos X: necesario si necesita muestrear solicitudes utilizando las reglas de muestreo de rayos X

  • Resource Detectors(por ejemplo, Amazon EC2 Resource Detector): para detectar los metadatos del host que ejecuta la aplicación

using OpenTelemetry; using OpenTelemetry.Contrib.Extensions.AWSXRay.Trace; using OpenTelemetry.Sampler.AWS; using OpenTelemetry.Trace; using OpenTelemetry.Resources; var builder = WebApplication.CreateBuilder(args); var serviceName = "MyServiceName"; var serviceVersion = "1.0.0"; var resourceBuilder = ResourceBuilder .CreateDefault() .AddService(serviceName: serviceName) .AddAWSEC2Detector(); builder.Services.AddOpenTelemetry() .ConfigureResource(resource => resource .AddAWSEC2Detector() .AddService( serviceName: serviceName, serviceVersion: serviceVersion)) .WithTracing(tracing => tracing .AddSource(serviceName) .AddAspNetCoreInstrumentation() .AddOtlpExporter() .SetSampler(AWSXRayRemoteSampler.Builder(resourceBuilder.Build()) .SetEndpoint("http://localhost:2000") .Build())); Sdk.SetDefaultTextMapPropagator(new AWSXRayPropagator()); // configure X-Ray propagator

OpenTelemetry Para utilizarla en una aplicación de consola, añada la siguiente OpenTelemetry configuración al iniciar el programa.

using OpenTelemetry; using OpenTelemetry.Contrib.Extensions.AWSXRay.Trace; using OpenTelemetry.Trace; using OpenTelemetry.Resources; var serviceName = "MyServiceName"; var resourceBuilder = ResourceBuilder .CreateDefault() .AddService(serviceName: serviceName) .AddAWSEC2Detector(); var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddSource(serviceName) .ConfigureResource(resource => resource .AddAWSEC2Detector() .AddService( serviceName: serviceName, serviceVersion: serviceVersion ) ) .AddOtlpExporter() // default address localhost:4317 .SetSampler(new TraceIdRatioBasedSampler(1.00)) .Build(); Sdk.SetDefaultTextMapPropagator(new AWSXRayPropagator()); // configure X-Ray propagator

Creación manual de datos de rastreo

With X-Ray SDK

Con el SDK de X-Ray, se necesitaban BeginSubsegment los métodos BeginSegment y métodos para crear manualmente segmentos y subsegmentos de rayos X.

using Amazon.XRay.Recorder.Core; AWSXRayRecorder.Instance.BeginSegment("segment name"); // generates `TraceId` for you try { // Do something here // can create custom subsegments AWSXRayRecorder.Instance.BeginSubsegment("subsegment name"); try { DoSometing(); } catch (Exception e) { AWSXRayRecorder.Instance.AddException(e); } finally { AWSXRayRecorder.Instance.EndSubsegment(); } } catch (Exception e) { AWSXRayRecorder.Instance.AddException(e); } finally { AWSXRayRecorder.Instance.EndSegment(); }
With OpenTelemetry SDK

En .NET, puede usar la API de actividades para crear intervalos personalizados con el fin de supervisar el rendimiento de las actividades internas que no se capturan en las bibliotecas de instrumentación. Tenga en cuenta que solo los tramos del tipo Server se convierten en segmentos de rayos X, todos los demás tramos se convierten en subsegmentos de rayos X.

Puede crear tantas ActivitySource instancias como necesite, pero se recomienda tener solo una para toda la aplicación/servicio.

using System.Diagnostics; ActivitySource activitySource = new ActivitySource("ActivitySourceName", "ActivitySourceVersion"); ... using (var activity = activitySource.StartActivity("ActivityName", ActivityKind.Server)) // this will be translated to a X-Ray Segment { // Do something here using (var internalActivity = activitySource.StartActivity("ActivityName", ActivityKind.Internal)) // this will be translated to an X-Ray Subsegment { // Do something here } }

Añadir anotaciones y metadatos a los seguimientos con el SDK OpenTelemetry

También puedes añadir pares clave-valor personalizados como atributos a tus intervalos mediante el SetTag método de una actividad. Tenga en cuenta que, de forma predeterminada, todos los atributos del intervalo se convertirán en metadatos en los datos sin procesar de X-Ray. Para garantizar que un atributo se convierta en una anotación y no en metadatos, puede añadir la clave de ese atributo a la lista de aws.xray.annotations atributos.

using (var activity = activitySource.StartActivity("ActivityName", ActivityKind.Server)) // this will be translated to a X-Ray Segment { activity.SetTag("metadataKey", "metadataValue"); activity.SetTag("annotationKey", "annotationValue"); string[] annotationKeys = {"annotationKey"}; activity.SetTag("aws.xray.annotations", annotationKeys); // Do something here using (var internalActivity = activitySource.StartActivity("ActivityName", ActivityKind.Internal)) // this will be translated to an X-Ray Subsegment { // Do something here } }

Con instrumentación OpenTelemetry automática

Si utiliza una solución de instrumentación OpenTelemetry automática para.NET y necesita realizar instrumentación manual en su aplicación, por ejemplo, instrumentar código dentro de la propia aplicación para secciones que no están incluidas en ninguna biblioteca de autoinstrumentación.

Como solo puede haber una globalTracerProvider, la instrumentación manual no debe crear una instancia propia TracerProvider si se usa junto con la instrumentación automática. Cuando TracerProvider se usa, el rastreo manual personalizado funciona de la misma manera cuando se usa instrumentación automática o instrumentación manual a través del SDK. OpenTelemetry

Rastreo de las solicitudes entrantes (instrumentación básica de ASP.NET y ASP.NET)

With X-Ray SDK

Para instrumentar las solicitudes atendidas por la aplicación ASP.NET, consulte https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-dotnet-messagehandler.html para obtener información sobre cómo llamar RegisterXRay al Init método del archivo. global.asax

AWSXRayASPNET.RegisterXRay(this, "MyApp");

Para instrumentar las solicitudes atendidas por la aplicación principal de ASP.NET, se llama al UseXRay método antes que a cualquier otro middleware del Configure método de la clase Startup.

app.UseXRay("MyApp");
With OpenTelemetry SDK

OpenTelemetry también proporciona bibliotecas de instrumentación para recopilar las trazas de las solicitudes web entrantes para ASP.NET y ASP.NET core. En la siguiente sección se enumeran los pasos necesarios para agregar y habilitar estas instrumentaciones de biblioteca para su OpenTelemetry configuración, incluida la forma de agregar la instrumentación principal de ASP.NET o ASP.NET al crear el proveedor Tracer.

Para obtener información sobre cómo habilitar .Instrumentation. OpenTelemetry AspNet, consulte Pasos para habilitar OpenTelemetry .Instrumentation. AspNety para obtener información sobre cómo habilitar OpenTelemetry .Instrumentation. AspNetCore, consulte los pasos para habilitar OpenTelemetry .Instrumentation. AspNetCore.

AWS Instrumentación del SDK

With X-Ray SDK

Instala todos los clientes del AWS SDK llamandoRegisterXRayForAllServices().

using Amazon.XRay.Recorder.Handlers.AwsSdk; AWSSDKHandler.RegisterXRayForAllServices(); //place this before any instantiation of AmazonServiceClient AmazonDynamoDBClient client = new AmazonDynamoDBClient(RegionEndpoint.USWest2); // AmazonDynamoDBClient is automatically registered with X-Ray

Utilice uno de los siguientes métodos para la instrumentación específica AWS del cliente de servicio.

AWSSDKHandler.RegisterXRay<IAmazonDynamoDB>(); // Registers specific type of AmazonServiceClient : All instances of IAmazonDynamoDB created after this line are registered AWSSDKHandler.RegisterXRayManifest(String path); // To configure custom AWS Service Manifest file. This is optional, if you have followed "Configuration" section
With OpenTelemetry SDK

Para el siguiente ejemplo de código, necesitará la siguiente dependencia:

dotnet add package OpenTelemetry.Instrumentation.AWS

Para instrumentar el AWS SDK, actualiza la configuración del OpenTelemetry SDK donde TracerProvider está configurado el Global.

builder.Services.AddOpenTelemetry() ... .WithTracing(tracing => tracing .AddAWSInstrumentation() ...

Instrumentación de llamadas a HTTP salientes

With X-Ray SDK

El SDK.NET de X-Ray rastrea las llamadas HTTP salientes a través de los métodos de extensión GetResponseTraced() o GetAsyncResponseTraced() cuando se usaSystem.Net.HttpWebRequest, o mediante el HttpClientXRayTracingHandler controlador cuando se usaSystem.Net.Http.HttpClient.

With OpenTelemetry SDK

Para el siguiente ejemplo de código, necesitarás la siguiente dependencia:

dotnet add package OpenTelemetry.Instrumentation.Http

Para System.Net.Http.HttpClient instrumentar y System.Net.HttpWebRequest actualizar la configuración del OpenTelemetry SDK donde TracerProvider está configurado el Global.

builder.Services.AddOpenTelemetry() ... .WithTracing(tracing => tracing .AddHttpClientInstrumentation() ...

Soporte de instrumentación para otras bibliotecas

Puede buscar y filtrar el OpenTelemetry registro de bibliotecas de instrumentación.NET para averiguar si OpenTelemetry es compatible con la instrumentación de su biblioteca. Consulte el Registro para empezar a buscar.

Instrumentación Lambda

With X-Ray SDK

Se requirió el siguiente procedimiento para usar el SDK de X-Ray con Lambda:

  1. Habilite el rastreo activo en su función Lambda

  2. El servicio Lambda crea un segmento que representa la invocación del controlador.

  3. Cree subsegmentos o bibliotecas de instrumentos con el SDK de X-Ray

With OpenTelemetry-based solutions

Puede instrumentar automáticamente su Lambda con capas Lambda AWS vendidas. Hay dos soluciones:

OpenTelemetry instrumentación manual para Lambda AWS

A continuación se muestra el ejemplo del código de una función Lambda (sin instrumentación).

using System; using System.Text; using System.Threading.Tasks; using Amazon.Lambda.Core; using Amazon.S3; using Amazon.S3.Model; // Assembly attribute to enable Lambda function logging [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace ExampleLambda; public class ListBucketsHandler { private static readonly AmazonS3Client s3Client = new(); // new Lambda function handler passed in public async Task<string> HandleRequest(object input, ILambdaContext context) { try { var DoListBucketsAsyncResponse = await DoListBucketsAsync(); context.Logger.LogInformation($"Results: {DoListBucketsAsyncResponse.Buckets}"); context.Logger.LogInformation($"Successfully called ListBucketsAsync"); return "Success!"; } catch (Exception ex) { context.Logger.LogError($"Failed to call ListBucketsAsync: {ex.Message}"); throw; } } private async Task<ListBucketsResponse> DoListBucketsAsync() { try { var putRequest = new ListBucketsRequest { }; var response = await s3Client.ListBucketsAsync(putRequest); return response; } catch (AmazonS3Exception ex) { throw new Exception($"Failed to call ListBucketsAsync: {ex.Message}", ex); } } }

Para instrumentar manualmente el controlador de Lambda y el cliente Amazon S3, haga lo siguiente.

  1. Instanciar a TracerProvider : TracerProvider se recomienda configurar con unXrayUdpSpanExporter, un muestreador ParentBased Always On y un Resource con service.name establecido en el nombre de la función Lambda.

  2. Instrumente el cliente Amazon S3 con la instrumentación del OpenTemetry AWS SDK llamando AddAWSInstrumentation() para añadir la instrumentación AWS del cliente del SDK a TracerProvider

  3. Cree una función contenedora con la misma firma que la función Lambda original. Llame a AWSLambdaWrapper.Trace() API y paseTracerProvider, la función Lambda original y sus entradas como parámetros. Configure la función contenedora como entrada del controlador Lambda.

Para el siguiente ejemplo de código, necesitará las siguientes dependencias:

dotnet add package OpenTelemetry.Instrumentation.AWSLambda dotnet add package OpenTelemetry.Instrumentation.AWS dotnet add package OpenTelemetry.Resources.AWS dotnet add package AWS.Distro.OpenTelemetry.Exporter.Xray.Udp

El código siguiente muestra la función Lambda después de los cambios necesarios. Puede crear intervalos personalizados adicionales para complementar los intervalos que se proporcionan automáticamente.

using Amazon.Lambda.Core; using Amazon.S3; using Amazon.S3.Model; using OpenTelemetry; using OpenTelemetry.Instrumentation.AWSLambda; using OpenTelemetry.Trace; using AWS.Distro.OpenTelemetry.Exporter.Xray.Udp; using OpenTelemetry.Resources; // Assembly attribute to enable Lambda function logging [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace ExampleLambda; public class ListBucketsHandler { private static readonly AmazonS3Client s3Client = new(); TracerProvider tracerProvider = Sdk.CreateTracerProviderBuilder() .AddAWSLambdaConfigurations() .AddProcessor( new SimpleActivityExportProcessor( // AWS_LAMBDA_FUNCTION_NAME Environment Variable will be defined in AWS Lambda Environment new XrayUdpExporter(ResourceBuilder.CreateDefault().AddService(Environment.GetEnvironmentVariable("AWS_LAMBDA_FUNCTION_NAME")).Build()) ) ) .AddAWSInstrumentation() .SetSampler(new ParentBasedSampler(new AlwaysOnSampler())) .Build(); // new Lambda function handler passed in public async Task<string> HandleRequest(object input, ILambdaContext context) => await AWSLambdaWrapper.Trace(tracerProvider, OriginalHandleRequest, input, context); public async Task<string> OriginalHandleRequest(object input, ILambdaContext context) { try { var DoListBucketsAsyncResponse = await DoListBucketsAsync(); context.Logger.LogInformation($"Results: {DoListBucketsAsyncResponse.Buckets}"); context.Logger.LogInformation($"Successfully called ListBucketsAsync"); return "Success!"; } catch (Exception ex) { context.Logger.LogError($"Failed to call ListBucketsAsync: {ex.Message}"); throw; } } private async Task<ListBucketsResponse> DoListBucketsAsync() { try { var putRequest = new ListBucketsRequest { }; var response = await s3Client.ListBucketsAsync(putRequest); return response; } catch (AmazonS3Exception ex) { throw new Exception($"Failed to call ListBucketsAsync: {ex.Message}", ex); } } }

Al invocar esta Lambda, verá la siguiente traza en el mapa de trazas de la consola: CloudWatch

Trace el mapa en la CloudWatch consola para .Net