Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Migrare a.NET OpenTelemetry
Quando si utilizza X-Ray Tracing nelle applicazioni.NET, per la strumentazione viene utilizzato l'SDK X-Ray .NET con operazioni manuali.
Questa sezione fornisce esempi di codice nella Soluzioni di strumentazione manuale con SDK sezione per la migrazione dalla soluzione di strumentazione manuale X-Ray OpenTelemetry alle soluzioni di strumentazione manuale per.NET. In alternativa, è possibile migrare dalla strumentazione manuale X-Ray alle soluzioni di strumentazione automatica OpenTelemetry alle applicazioni.NET dello strumento senza dover modificare il codice sorgente dell'applicazione nella sezione. Soluzioni di strumentazione automatica a codice zero
Soluzioni di strumentazione automatica a codice zero
OpenTelemetry fornisce soluzioni di strumentazione automatica a codice zero. Queste soluzioni tracciano le richieste senza richiedere modifiche al codice dell'applicazione.
OpenTelemetryopzioni di strumentazione automatica basate su
-
Utilizzo della strumentazione automatica AWS Distro for OpenTelemetry (ADOT) per .NET: per strumentare automaticamente le applicazioni.NET, vedere Tracciamento e metriche con la distribuzione per strumentazione automatica.NET. AWS OpenTelemetry
(Facoltativo) Abilita i segnali CloudWatch applicativi durante la strumentazione automatica delle applicazioni AWS con la strumentazione automatica ADOT .NET per:
Monitora lo stato attuale delle applicazioni
Monitora le prestazioni delle applicazioni a lungo termine rispetto agli obiettivi aziendali
Ottieni una visione unificata e incentrata sulle applicazioni delle tue applicazioni, servizi e dipendenze
Monitora e valuta lo stato delle applicazioni
Per ulteriori informazioni, consulta Application Signals.
-
Utilizzo della strumentazione OpenTelemetry automatica.Net a codice zero: per la strumentazione automatica con OpenTelemetry .Net, consulta Tracciamento e metriche con la distribuzione per la strumentazione automatica.NET. AWS OpenTelemetry
Soluzioni di strumentazione manuale con SDK
- Tracing configuration with X-Ray SDK
-
Per le applicazioni Web.NET, l'SDK X-Ray è configurato nella sezione AppSettings del file. Web.config
Esempio Web.config
<configuration>
<appSettings>
<add key="AWSXRayPlugins" value="EC2Plugin"/>
</appSettings>
</configuration>
Per .NET Core, viene utilizzato un file denominato appsettings.json
con una chiave di primo livello denominataXRay
, quindi viene creato un oggetto di configurazione per inizializzare il registratore X-Ray.
Esempio per.NET appsettings.json
{
"XRay": {
"AWSXRayPlugins": "EC2Plugin"
}
}
Esempio di configurazione di.NET Core Program.cs — Recorder
using Amazon.XRay.Recorder.Core;
...
AWSXRayRecorder.InitializeInstance(configuration);
- Tracing configuration with OpenTelemetry SDK
-
Aggiungi queste dipendenze:
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
Per la tua applicazione.NET, configura l' OpenTelemetry SDK configurando Global. TracerProvider La configurazione di esempio seguente abilita anche la strumentazione per. ASP.NET Core
Per lo strumentoASP.NET
, vedere. Tracciamento delle richieste in arrivo (strumentazione di base ASP.NET e ASP.NET) Per utilizzarlo OpenTelemetry con altri framework, consulta Registry per ulteriori librerie per i framework supportati.
Si consiglia di configurare i seguenti componenti:
-
An OTLP Exporter
— Necessario per esportare le tracce nell' CloudWatch OpenTelemetry Agent/ Collector
-
Un propagatore AWS a raggi X: necessario per propagare il Trace Context ai AWS servizi integrati con X-Ray
-
Un campionatore remoto AWS a raggi X: necessario se è necessario campionare le richieste utilizzando le regole di campionamento a raggi X
-
Resource Detectors
(ad esempio, Amazon EC2 Resource Detector): per rilevare i metadati dell'host che esegue l'applicazione
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
Da utilizzare OpenTelemetry per un'app per console, aggiungi la seguente OpenTelemetry configurazione all'avvio del programma.
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
Creazione manuale di dati di traccia
- With X-Ray SDK
-
Con X-Ray SDK, erano necessari i BeginSubsegment
metodi BeginSegment
and per creare manualmente segmenti e sottosegmenti X-Ray.
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
-
In .NET, è possibile utilizzare l'API Activity per creare intervalli personalizzati per monitorare le prestazioni delle attività interne che non vengono acquisite dalle librerie di strumentazione. Nota che solo gli intervalli di tipo Server vengono convertiti in segmenti X-Ray, tutti gli altri intervalli vengono convertiti in sotto-segmenti X-Ray.
È possibile creare tutte ActivitySource
le istanze necessarie, ma si consiglia di averne solo una per un'intera applicazione/servizio.
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
}
}
Aggiungere annotazioni e metadati alle tracce con SDK OpenTelemetry
Puoi anche aggiungere coppie chiave-valore personalizzate come attributi agli intervalli utilizzando il metodo su un'attività. SetTag
Nota che per impostazione predefinita, tutti gli attributi span verranno convertiti in metadati nei dati grezzi di X-Ray. Per garantire che un attributo venga convertito in un'annotazione e non in metadati, puoi aggiungere la chiave di quell'attributo all'elenco degli attributi. aws.xray.annotations
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 OpenTelemetry strumentazione automatica
Se si utilizza una soluzione di strumentazione OpenTelemetry automatica per.NET e se è necessario eseguire la strumentazione manuale nell'applicazione, ad esempio, per codificare lo strumento all'interno dell'applicazione stessa per sezioni che non sono coperte da alcuna libreria di strumentazione automatica.
Poiché può esserci solo una strumentazione globaleTracerProvider
, la strumentazione manuale non dovrebbe istanziare la propria TracerProvider
se utilizzata insieme alla strumentazione automatica. Quando TracerProvider
viene utilizzato, il tracciamento manuale personalizzato funziona allo stesso modo quando si utilizza la strumentazione automatica o la strumentazione manuale tramite l'SDK. OpenTelemetry
Tracciamento delle richieste in arrivo (strumentazione di base ASP.NET e ASP.NET)
- With X-Ray SDK
-
Per informazioni sulle richieste di strumenti servite dall'applicazione ASP.NET, consulta https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-dotnet-messagehandler.html per informazioni su come RegisterXRay
richiamare il Init
metodo del file. global.asax
AWSXRayASPNET.RegisterXRay(this, "MyApp");
Per le richieste di strumenti servite dall'applicazione principale ASP.NET, il UseXRay
metodo viene chiamato prima di qualsiasi altro middleware nel Configure
metodo della classe Startup.
app.UseXRay("MyApp");
- With OpenTelemetry SDK
OpenTelemetry fornisce inoltre librerie di strumentazione per raccogliere tracce per le richieste Web in entrata per ASP.NET e ASP.NET core. La sezione seguente elenca i passaggi necessari per aggiungere e abilitare questi strumenti di libreria per la OpenTelemetry configurazione, incluso come aggiungere la strumentazione di base ASP.NET o ASP.NET durante la creazione del Tracer Provider.
Per informazioni su come abilitare .Instrumentation. OpenTelemetry AspNet, vedi Passaggi per abilitare .Instrumentation. OpenTelemetry AspNete per informazioni su come abilitare .Instrumentation. OpenTelemetry AspNetCore, vedi Passaggi per abilitare .Instrumentation. OpenTelemetry AspNetCore.
AWS Strumentazione SDK
- With X-Ray SDK
-
Installa tutti i client AWS SDK chiamando. RegisterXRayForAllServices()
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
Utilizzate uno dei seguenti metodi per la strumentazione specifica del client AWS di servizio.
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
Per il seguente esempio di codice, è necessaria la seguente dipendenza:
dotnet add package OpenTelemetry.Instrumentation.AWS
Per strumentare l' AWS SDK, aggiorna la configurazione OpenTelemetry SDK in cui è configurato il Global TracerProvider .
builder.Services.AddOpenTelemetry()
...
.WithTracing(tracing => tracing
.AddAWSInstrumentation()
...
Analisi delle chiamate HTTP in uscita
- With X-Ray SDK
-
X-Ray .NET SDK traccia le chiamate HTTP in uscita tramite i metodi di estensione GetResponseTraced()
o GetAsyncResponseTraced()
durante l'utilizzo o utilizzando System.Net.HttpWebRequest
il gestore durante l'HttpClientXRayTracingHandler
utilizzo. System.Net.Http.HttpClient
- With OpenTelemetry SDK
-
Per il seguente esempio di codice, è necessaria la seguente dipendenza:
dotnet add package OpenTelemetry.Instrumentation.Http
Per strumentare System.Net.Http.HttpClient
eSystem.Net.HttpWebRequest
, aggiorna la configurazione dell' OpenTelemetry SDK in cui TracerProvider è configurato il Global.
builder.Services.AddOpenTelemetry()
...
.WithTracing(tracing => tracing
.AddHttpClientInstrumentation()
...
Supporto alla strumentazione per altre librerie
Puoi cercare e filtrare OpenTelemetry nel Registro le librerie di strumentazione.NET per scoprire se OpenTelemetry supporta la strumentazione per la tua libreria. Consulta il Registro per iniziare la ricerca.
Strumentazione Lambda
- With X-Ray SDK
-
Per utilizzare l'SDK X-Ray con Lambda era necessaria la seguente procedura:
-
Abilita Active Tracing sulla tua funzione Lambda
-
Il servizio Lambda crea un segmento che rappresenta la chiamata del gestore
-
Crea sottosegmenti o librerie di strumenti utilizzando l'SDK X-Ray
- With OpenTelemetry-based solutions
-
Puoi strumentare automaticamente la tua Lambda con livelli Lambda AWS venduti. Esistono due soluzioni:
-
(Consigliato) Strato lambda di CloudWatch Application Signals
-
Per prestazioni migliori, potresti prendere in considerazione l'idea di utilizzare per OpenTelemetry Manual Instrumentation
generare OpenTelemetry tracce per la tua funzione Lambda.
OpenTelemetry strumentazione manuale per Lambda AWS
Di seguito è riportato l'esempio del codice della funzione Lambda (senza strumentazione).
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);
}
}
}
Per strumentare manualmente il tuo gestore Lambda e il client Amazon S3, procedi come segue.
-
Istanzia a TracerProvider : si TracerProvider consiglia di configurarlo con un XrayUdpSpanExporter
campionatore ParentBased Always On e un Resource
valore impostato sul nome della funzione service.name
Lambda.
-
Strumenta il client Amazon S3 con la strumentazione OpenTemetry AWS SDK chiamando per aggiungere la strumentazione client SDK AddAWSInstrumentation()
a AWS TracerProvider
-
Crea una funzione wrapper con la stessa firma della funzione Lambda originale. Chiama AWSLambdaWrapper.Trace()
l'API e passaTracerProvider
, la funzione Lambda originale e i suoi input come parametri. Imposta la funzione wrapper come input del gestore Lambda.
Per il seguente esempio di codice, sono necessarie le seguenti dipendenze:
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
Il codice seguente illustra la funzione Lambda dopo le modifiche richieste. È possibile creare intervalli personalizzati aggiuntivi per completare gli intervalli forniti automaticamente.
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);
}
}
}
Quando richiami questa Lambda, vedrai la seguente traccia nella Trace Map della console: CloudWatch