Nome proprietà |
Descrizione |
Diagnostic-Id |
Identificatore univoco di una chiamata esterna alla coda effettuata dal producer. Fare riferimento all'intestazione traceparent del contesto di traccia W3C per il formato |
bus di servizio la traccia automatica del client .NET
La ServiceBusProcessor
classe del client di Messaggistica di Azure bus di servizio per .NET fornisce punti di strumentazione di traccia che possono essere agganciati da sistemi di traccia o da parti di codice client. La strumentazione consente di verificare tutte le chiamate al servizio di messaggistica del bus di servizio dal lato client. Se l'elaborazione dei messaggi viene eseguita utilizzando ProcessMessageAsync
ServiceBusProcessor
(modello di gestore messaggi), viene instrumentata anche l'elaborazione dei messaggi.
Verifica con Azure Application Insights
Microsoft Application Insights offre funzionalità avanzate di monitoraggio delle prestazioni, tra cui la verifica automatica delle richieste e delle dipendenze.
A seconda del tipo di progetto, installare Application Insights SDK:
- ASP.NET: installare la versione 2.5-beta2 o una versione successiva
- ASP.NET Core: installare la versione 2.2.0-beta2 o una versione successiva.
Questi collegamenti forniscono informazioni dettagliate su come installare l'SDK, creare risorse e, se necessario, configurare l'SDK. Per le applicazioni non ASP.NET, vedere l'articolo Azure Application Insights for Console Applications (Azure Application Insights per applicazioni console).
Se si usa ProcessMessageAsync
(modello di ServiceBusProcessor
gestore messaggi) per elaborare i messaggi, viene instrumentata anche l'elaborazione dei messaggi. Tutte le chiamate bus di servizio eseguite dal servizio vengono rilevate automaticamente e correlate ad altri elementi di telemetria. In caso contrario vedere l'esempio seguente per la verifica manuale delle operazioni di elaborazione dei messaggi.
Analizzare l'elaborazione dei messaggi
async Task ProcessAsync(ProcessMessageEventArgs args)
{
ServiceBusReceivedMessage message = args.Message;
if (message.ApplicationProperties.TryGetValue("Diagnostic-Id", out var objectId) && objectId is string diagnosticId)
{
var activity = new Activity("ServiceBusProcessor.ProcessMessage");
activity.SetParentId(diagnosticId);
// If you're using Microsoft.ApplicationInsights package version 2.6-beta or higher, you should call StartOperation<RequestTelemetry>(activity) instead
using (var operation = telemetryClient.StartOperation<RequestTelemetry>("Process", activity.RootId, activity.ParentId))
{
telemetryClient.TrackTrace("Received message");
try
{
// process message
}
catch (Exception ex)
{
telemetryClient.TrackException(ex);
operation.Telemetry.Success = false;
throw;
}
telemetryClient.TrackTrace("Done");
}
}
}
In questo esempio, i dati di telemetria delle richieste vengono segnalati per ogni messaggio elaborato, con un timestamp, una durata e un risultato (esito positivo). La telemetria include anche un set di proprietà di correlazione. Alle eccezioni e alle analisi nidificate restituite durante l'elaborazione dei messaggi vengono inoltre assegnate proprietà di correlazione in modo che vengano rappresentate come elementi figlio di RequestTelemetry
.
Se si effettuano chiamate a componenti esterni supportati durante l'elaborazione dei messaggi, vengono rilevati e correlati automaticamente. Per informazioni sulla verifica e la correlazione manuale, vedere Verifica delle operazioni personalizzate con Application Insights .NET SDK.
Se si esegue codice esterno oltre all'SDK di Application Insights, si prevede di visualizzare una durata più lunga quando si visualizzano i log di Application Insights.
Non significa che si sia verificato un ritardo nella ricezione del messaggio. In questo scenario, il messaggio è già stato ricevuto perché il messaggio viene passato come parametro al codice DELL'SDK. Il tag del nome nei log di App Insights (Processo) indica inoltre che il messaggio viene ora elaborato dal codice di elaborazione eventi esterno. Questo problema non è correlato ad Azure. Queste metriche fanno invece riferimento all'efficienza del codice esterno, dato che il messaggio è già stato ricevuto da bus di servizio.
Rilevamento con OpenTelemetry
bus di servizio libreria client .NET versione 7.5.0 e successive supporta OpenTelemetry in modalità sperimentale. Per altre informazioni, vedere Traccia distribuita in .NET SDK.
Verifica senza sistema di analisi
Nel caso in cui il sistema di traccia non supporti il rilevamento automatico delle chiamate bus di servizio potrebbe essere necessario aggiungere tale supporto in un sistema di traccia o nell'applicazione. Questa sezione illustra gli eventi di diagnostica inviati dal client .NET del bus di servizio.
Per instrumentare il client .NET del bus di servizio, si usano le primitive di analisi .NET System.Diagnostics.Activity e System.Diagnostics.DiagnosticSource.
Activity
funge da un contesto di analisi mentre DiagnosticSource
è un meccanismo di notifica.
Se non è presente alcun listener per gli eventi DiagnosticSource, la strumentazione è disattivata, mantenendo zero costi di strumentazione. DiagnosticSource cede il controllo completo al listener:
- il listener controlla le origini e gli eventi di cui rimanere in ascolto
- il listener controlla il campionamento e la frequenza degli eventi
- gli eventi vengono inviati con un payload che fornisce il contesto completo, in modo che sia possibile accedere e modificare l'oggetto Message durante l'evento
Prima di procedere con l'implementazione, è consigliabile leggere il manuale dell'utente di DiagnosticSource.
Nel codice seguente verrà creato un listener per eventi del bus di servizio nell'app ASP.NET Core che scrive i log con Microsoft.Extension.Logger.
Il listener usa la libreria System.Reactive.Core per eseguire la sottoscrizione a DiagnosticSource. È comunque possibile eseguire facilmente la sottoscrizione a DiagnosticSource anche senza la libreria.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory factory, IApplicationLifetime applicationLifetime)
{
// configuration...
var serviceBusLogger = factory.CreateLogger("Azure.Messaging.ServiceBus");
IDisposable innerSubscription = null;
IDisposable outerSubscription = DiagnosticListener.AllListeners.Subscribe(delegate (DiagnosticListener listener)
{
// subscribe to the Service Bus DiagnosticSource
if (listener.Name == "Azure.Messaging.ServiceBus")
{
// receive event from Service Bus DiagnosticSource
innerSubscription = listener.Subscribe(delegate (KeyValuePair<string, object> evnt)
{
// Log operation details once it's done
if (evnt.Key.EndsWith("Stop"))
{
Activity currentActivity = Activity.Current;
serviceBusLogger.LogInformation($"Operation {currentActivity.OperationName} is finished, Duration={currentActivity.Duration}, Id={currentActivity.Id}, StartTime={currentActivity.StartTimeUtc}");
}
});
}
});
applicationLifetime.ApplicationStopping.Register(() =>
{
outerSubscription?.Dispose();
innerSubscription?.Dispose();
});
}
In questo esempio il listener registra durata, risultato, identificatore univoco e ora di inizio di ogni operazione del bus di servizio.
evento
Tutti gli eventi avranno le proprietà seguenti conformi alla specifica di telemetria aperta: https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/api.md.
message_bus.destination
: percorso coda/argomento/sottoscrizione
peer.address
- spazio dei nomi completo
kind
: producer, consumer o client. Il producer viene usato durante l'invio di messaggi, consumer durante la ricezione e il client durante la risoluzione.
component
– servicebus
Tutti gli eventi hanno Entity
anche proprietà e Endpoint
.
Entity
- - Nome dell'entità (coda, argomento e così via).
Endpoint
: URL dell'endpoint del bus di servizio
Operazioni instrumentate
Ecco l'elenco completo delle operazioni instrumentate:
Nome operazione |
API verificata |
ServiceBusSender.Send |
ServiceBusSender.SendMessageAsync ServiceBusSender.SendMessagesAsync |
ServiceBusSender.Schedule |
ServiceBusSender.ScheduleMessageAsync ServiceBusSender.ScheduleMessagesAsync |
ServiceBusSender.Cancel |
ServiceBusSender.CancelScheduledMessageAsync ServiceBusSender.CancelScheduledMessagesAsync |
ServiceBusReceiver.Receive |
ServiceBusReceiver.ReceiveMessageAsync ServiceBusReceiver.ReceiveMessagesAsync |
ServiceBusReceiver.ReceiveDeferred |
ServiceBusReceiver.ReceiveDeferredMessagesAsync |
ServiceBusReceiver.Peek |
ServiceBusReceiver.PeekMessageAsync ServiceBusReceiver.PeekMessagesAsync |
ServiceBusReceiver.Abandon |
ServiceBusReceiver.AbandonMessagesAsync |
ServiceBusReceiver.Complete |
ServiceBusReceiver.CompleteMessagesAsync |
ServiceBusReceiver.DeadLetter |
ServiceBusReceiver.DeadLetterMessagesAsync |
ServiceBusReceiver.Defer |
ServiceBusReceiver.DeferMessagesAsync |
ServiceBusReceiver.RenewMessageLock |
ServiceBusReceiver.RenewMessageLockAsync |
ServiceBusSessionReceiver.RenewSessionLock |
ServiceBusSessionReceiver.RenewSessionLockAsync |
ServiceBusSessionReceiver.GetSessionState |
ServiceBusSessionReceiver.GetSessionStateAsync |
ServiceBusSessionReceiver.SetSessionState |
ServiceBusSessionReceiver.SetSessionStateAsync |
ServiceBusProcessor.ProcessMessage |
Callback del processore impostato su ServiceBusProcessor. ProcessMessageAsync - proprietà |
ServiceBusSessionProcessor.ProcessSessionMessage |
Callback del processore impostato su ServiceBusSessionProcessor. ProcessMessageAsync - proprietà |
Filtro e campionamento
In alcuni casi è consigliabile registrare solo parte degli eventi per ridurre il consumo dello spazio di archiviazione o il sovraccarico delle prestazioni. È possibile registrare solo gli eventi di tipo 'Stop' (come nell'esempio precedente) o una percentuale campione degli eventi.
A questo scopo, è possibile usare DiagnosticSource
con il predicato IsEnabled
. Per altre informazioni, vedere Context-Based Filtering in DiagnosticSource (Filtro in base al contesto in DiagnosticSource).
Per ridurre al minimo l'impatto sulle prestazioni, è possibile chiamare IsEnabled
più volte per una singola operazione.
IsEnabled
viene chiamato nella sequenza seguente:
IsEnabled(<OperationName>, string entity, null)
ad esempio, IsEnabled("ServiceBusSender.Send", "MyQueue1")
. Si noti che non c'è "Start" o "Stop" alla fine. Usarlo per escludere determinate operazioni o code. Se il metodo di callback restituisce false
, gli eventi per l'operazione non vengono inviati.
- Per le operazioni di tipo 'Process' e 'ProcessSession' viene ricevuto anche il callback
IsEnabled(<OperationName>, string entity, Activity activity)
. Usarlo per filtrare gli eventi in base alle proprietà activity.Id
o Tags.
IsEnabled(<OperationName>.Start)
ad esempio, IsEnabled("ServiceBusSender.Send.Start")
. Controlla se deve essere attivato l'evento 'Start'. Il risultato influisce solo sull'evento "Start", ma non dipende da altri strumenti.
Non esiste alcun IsEnabled
evento "Stop".
Se il risultato di alcune operazioni è un'eccezione, viene chiamato IsEnabled("ServiceBusSender.Send.Exception")
. È possibile eseguire la sottoscrizione solo di eventi 'Exception' e impedire il resto della strumentazione. In questo caso sarà comunque necessario gestire tali eccezioni. Poiché altre strumentazioni sono disabilitate, non è consigliabile prevedere il flusso del contesto di traccia con i messaggi dal consumer al producer.
È possibile usare IsEnabled
anche per implementare strategie di campionamento. Il campionamento basato su Activity.Id
o Activity.RootId
garantisce un campionamento coerente tra tutti i pneumatici (purché venga propagato dal sistema di traccia o dal proprio codice).
In presenza di più DiagnosticSource
listener per la stessa origine, è sufficiente che un solo listener accetti l'evento, quindi non esiste alcuna garanzia che IsEnabled
venga chiamata.
Il 30 settembre 2026 verranno ritirati le librerie bus di servizio di Azure SDK WindowsAzure.ServiceBus, Microsoft.Azure.ServiceBus e com.microsoft.azure.servicebus, che non sono conformi alle linee guida di Azure SDK. Il supporto del protocollo SBMP verrà terminato, quindi non sarà più possibile usare questo protocollo dopo il 30 settembre 2026. Eseguire la migrazione alle librerie più recenti di Azure SDK, che offrono aggiornamenti critici della sicurezza e funzionalità migliorate, prima di tale data.
Anche se le librerie precedenti possono ancora essere usate oltre il 30 settembre 2026, non riceveranno più il supporto e gli aggiornamenti ufficiali da Microsoft. Per altre informazioni, vedere l'annuncio di ritiro del supporto.
Nome proprietà |
Descrizione |
Diagnostic-Id |
Identificatore univoco di una chiamata esterna alla coda effettuata dal producer. Per la logica, le considerazioni e il formato, vedere Request-Id in HTTP protocol (Request-Id nel protocollo HTTP). |
Correlation-Context |
Contesto dell'operazione, che viene propagato in tutti i servizi coinvolti nell'elaborazione dell'operazione. Per altre informazioni, vedere Correlation-Context in HTTP protocol (Correlation-Context nel protocollo HTTP). |
bus di servizio la traccia automatica del client .NET
A partire dalla versione 3.0.0, il client del bus di servizio di Microsoft Azure per .NET fornisce punti di strumentazione di analisi a cui possono agganciarsi sistemi di analisi o parti del codice client.
La strumentazione consente di verificare tutte le chiamate al servizio di messaggistica del bus di servizio dal lato client. Se per l'elaborazione dei messaggi si usa il criterio del gestore di messaggi, anche tale operazione viene instrumentata.
Verifica con Azure Application Insights
Microsoft Application Insights offre funzionalità avanzate di monitoraggio delle prestazioni, tra cui la verifica automatica delle richieste e delle dipendenze.
A seconda del tipo di progetto, installare Application Insights SDK:
- ASP.NET: installare la versione 2.5-beta2 o una versione successiva
- ASP.NET Core: installare la versione 2.2.0-beta2 o una versione successiva.
Questi collegamenti forniscono informazioni dettagliate su come installare l'SDK, creare risorse e, se necessario, configurare l'SDK. Per le applicazioni non ASP.NET, vedere l'articolo Azure Application Insights for Console Applications (Azure Application Insights per applicazioni console).
Se si usa il modello del gestore di messaggi per elaborare i messaggi, è necessario eseguire tutte le chiamate bus di servizio eseguite dal servizio automaticamente e correlate ad altri elementi di telemetria. In caso contrario vedere l'esempio seguente per la verifica manuale delle operazioni di elaborazione dei messaggi.
Analizzare l'elaborazione dei messaggi
private readonly TelemetryClient telemetryClient;
async Task ProcessAsync(Message message)
{
var activity = message.ExtractActivity();
// If you're using Microsoft.ApplicationInsights package version 2.6-beta or higher, you should call StartOperation<RequestTelemetry>(activity) instead
using (var operation = telemetryClient.StartOperation<RequestTelemetry>("Process", activity.RootId, activity.ParentId))
{
telemetryClient.TrackTrace("Received message");
try
{
// process message
}
catch (Exception ex)
{
telemetryClient.TrackException(ex);
operation.Telemetry.Success = false;
throw;
}
telemetryClient.TrackTrace("Done");
}
}
In questo esempio, per ogni messaggio elaborato viene restituito RequestTelemetry
, che include un timestamp, la durata e il risultato (esito positivo). La telemetria include anche un set di proprietà di correlazione.
Alle eccezioni e alle analisi nidificate restituite durante l'elaborazione dei messaggi vengono inoltre assegnate proprietà di correlazione in modo che vengano rappresentate come elementi figlio di RequestTelemetry
.
Se si effettuano chiamate a componenti esterni supportati durante l'elaborazione dei messaggi, vengono rilevati e correlati automaticamente. Per informazioni sulla verifica e la correlazione manuale, vedere Verifica delle operazioni personalizzate con Application Insights .NET SDK.
Se si esegue codice esterno oltre all'SDK di Application Insights, si prevede di visualizzare una durata più lunga quando si visualizzano i log di Application Insights.
Non significa che si sia verificato un ritardo nella ricezione del messaggio. In questo scenario, il messaggio è già stato ricevuto perché il messaggio viene passato come parametro al codice DELL'SDK. Il tag del nome nei log di App Insights (Processo) indica inoltre che il messaggio viene ora elaborato dal codice di elaborazione eventi esterno. Questo problema non è correlato ad Azure. Queste metriche fanno invece riferimento all'efficienza del codice esterno, dato che il messaggio è già stato ricevuto da bus di servizio. Vedere questo file in GitHub per vedere dove viene generato il tag Process e assegnato dopo che il messaggio è stato ricevuto da bus di servizio.
Verifica senza sistema di analisi
Nel caso in cui il sistema di traccia non supporti il rilevamento automatico delle chiamate bus di servizio potrebbe essere necessario aggiungere tale supporto in un sistema di traccia o nell'applicazione. Questa sezione illustra gli eventi di diagnostica inviati dal client .NET del bus di servizio.
Per instrumentare il client .NET del bus di servizio, si usano le primitive di analisi .NET System.Diagnostics.Activity e System.Diagnostics.DiagnosticSource.
Activity
funge da un contesto di analisi mentre DiagnosticSource
è un meccanismo di notifica.
Se non è presente alcun listener per gli eventi DiagnosticSource, la strumentazione è disattivata, mantenendo zero costi di strumentazione. DiagnosticSource cede il controllo completo al listener:
- il listener controlla le origini e gli eventi di cui rimanere in ascolto
- il listener controlla il campionamento e la frequenza degli eventi
- gli eventi vengono inviati con un payload che fornisce il contesto completo, in modo che sia possibile accedere e modificare l'oggetto Message durante l'evento
Prima di procedere con l'implementazione, è consigliabile leggere il manuale dell'utente di DiagnosticSource.
Nel codice seguente verrà creato un listener per eventi del bus di servizio nell'app ASP.NET Core che scrive i log con Microsoft.Extension.Logger.
Il listener usa la libreria System.Reactive.Core per eseguire la sottoscrizione a DiagnosticSource. È comunque possibile eseguire facilmente la sottoscrizione a DiagnosticSource anche senza la libreria.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory factory, IApplicationLifetime applicationLifetime)
{
// configuration...
var serviceBusLogger = factory.CreateLogger("Microsoft.Azure.ServiceBus");
IDisposable innerSubscription = null;
IDisposable outerSubscription = DiagnosticListener.AllListeners.Subscribe(delegate (DiagnosticListener listener)
{
// subscribe to the Service Bus DiagnosticSource
if (listener.Name == "Microsoft.Azure.ServiceBus")
{
// receive event from Service Bus DiagnosticSource
innerSubscription = listener.Subscribe(delegate (KeyValuePair<string, object> evnt)
{
// Log operation details once it's done
if (evnt.Key.EndsWith("Stop"))
{
Activity currentActivity = Activity.Current;
TaskStatus status = (TaskStatus)evnt.Value.GetProperty("Status");
serviceBusLogger.LogInformation($"Operation {currentActivity.OperationName} is finished, Duration={currentActivity.Duration}, Status={status}, Id={currentActivity.Id}, StartTime={currentActivity.StartTimeUtc}");
}
});
}
});
applicationLifetime.ApplicationStopping.Register(() =>
{
outerSubscription?.Dispose();
innerSubscription?.Dispose();
});
}
In questo esempio il listener registra durata, risultato, identificatore univoco e ora di inizio di ogni operazione del bus di servizio.
evento
Per ogni operazione vengono inviati due eventi, ovvero 'Start' e 'Stop'.
Probabilmente, sei interessato solo agli eventi 'Stop'. Forniscono il risultato dell'operazione e l'ora di inizio e la durata come proprietà dell'attività.
Il payload dell'evento fornisce a un listener con il contesto dell'operazione, replicando il valore restituito e i parametri in arrivo dell'API. Il payload dell'evento 'Stop' contiene tutte le proprietà del payload dell'evento 'Start', di conseguenza è possibile ignorare completamente l'evento 'Start'.
Tutti gli eventi hanno anche proprietà 'Entity' e 'Endpoint'.
string Entity
: nome dell'entità (coda, argomento e così via)
Uri Endpoint
: URL dell'endpoint del bus di servizio
Per ogni evento 'Stop' esiste una proprietà Status
con l'operazione asincrona TaskStatus
con cui è stata completata. Per semplicità anche tale proprietà non figura nella tabella seguente.
Ecco l'elenco completo delle operazioni instrumentate:
Nome operazione |
API verificata |
Proprietà del payload specifiche |
Microsoft.Azure.ServiceBus.Send |
MessageSender.SendAsync |
IList<Message> Messages : elenco dei messaggi da inviare |
Microsoft.Azure.ServiceBus.ScheduleMessage |
MessageSender.ScheduleMessageAsync |
Message Message : messaggio in fase di elaborazione
DateTimeOffset ScheduleEnqueueTimeUtc : differenza di ora dei messaggi pianificati
long SequenceNumber : numero di sequenza del messaggio pianificato (payload dell'evento 'Stop') |
Microsoft.Azure.ServiceBus.Cancel |
MessageSender.CancelScheduledMessageAsync |
long SequenceNumber - Numero di sequenza del messaggio da annullare |
Microsoft.Azure.ServiceBus.Receive |
MessageReceiver.ReceiveAsync |
int RequestedMessageCount : numero massimo di messaggi che è possibile ricevere.
IList<Message> Messages : elenco dei messaggi ricevuti (payload dell'evento 'Stop') |
Microsoft.Azure.ServiceBus.Peek |
MessageReceiver.PeekAsync |
int FromSequenceNumber : punto di partenza da cui sfogliare un batch di messaggi.
int RequestedMessageCount : numero massimo di messaggi da recuperare.
IList<Message> Messages : elenco dei messaggi ricevuti (payload dell'evento 'Stop') |
Microsoft.Azure.ServiceBus.ReceiveDeferred |
MessageReceiver.ReceiveDeferredMessageAsync |
IEnumerable<long> SequenceNumbers : elenco contenente i numeri di sequenza da ricevere.
IList<Message> Messages : elenco dei messaggi ricevuti (payload dell'evento 'Stop') |
Microsoft.Azure.ServiceBus.Complete |
MessageReceiver.CompleteAsync |
IList<string> LockTokens : elenco contenente i token di blocco dei messaggi corrispondenti da completare. |
Microsoft.Azure.ServiceBus.Abandon |
MessageReceiver.AbandonAsync |
string LockToken : token di blocco del messaggio corrispondente da abbandonare. |
Microsoft.Azure.ServiceBus.Defer |
MessageReceiver.DeferAsync |
string LockToken : token di blocco del messaggio corrispondente da rinviare. |
Microsoft.Azure.ServiceBus.DeadLetter |
MessageReceiver.DeadLetterAsync |
string LockToken : token di blocco del messaggio corrispondente da inserire nella coda di messaggi non recapitabili. |
Microsoft.Azure.ServiceBus.RenewLock |
MessageReceiver.RenewLockAsync |
string LockToken : token di blocco del messaggio corrispondente da inserire per cui rinnovare il blocco.
DateTime LockedUntilUtc : nuova data e ora di scadenza del token di blocco in formato UTC. (payload dell'evento 'Stop') |
Microsoft.Azure.ServiceBus.Process |
Funzione lambda del gestore di messaggi fornita in IReceiverClient.RegisterMessageHandler |
Message Message : messaggio in fase di elaborazione. |
Microsoft.Azure.ServiceBus.ProcessSession |
Funzione lambda del gestore della sessione di messaggi fornita in IQueueClient.RegisterSessionHandler |
Message Message : messaggio in fase di elaborazione.
IMessageSession Session : sessione in fase di elaborazione |
Microsoft.Azure.ServiceBus.AddRule |
SubscriptionClient.AddRuleAsync |
RuleDescription Rule : descrizione della regola che specifica la regola da aggiungere. |
Microsoft.Azure.ServiceBus.RemoveRule |
SubscriptionClient.RemoveRuleAsync |
string RuleName : nome della regola da rimuovere. |
Microsoft.Azure.ServiceBus.GetRules |
SubscriptionClient.GetRulesAsync |
IEnumerable<RuleDescription> Rules : tutte le regole associate alla sottoscrizione. (solo payload di 'Stop') |
Microsoft.Azure.ServiceBus.AcceptMessageSession |
ISessionClient.AcceptMessageSessionAsync |
string SessionId : elemento sessionId presente nei messaggi. |
Microsoft.Azure.ServiceBus.GetSessionState |
IMessageSession.GetStateAsync |
string SessionId : elemento sessionId presente nei messaggi.
byte [] State : stato della sessione (payload dell'evento 'Stop') |
Microsoft.Azure.ServiceBus.SetSessionState |
IMessageSession.SetStateAsync |
string SessionId : elemento sessionId presente nei messaggi.
byte [] State : stato della sessione |
Microsoft.Azure.ServiceBus.RenewSessionLock |
IMessageSession.RenewSessionLockAsync |
string SessionId : elemento sessionId presente nei messaggi. |
Microsoft.Azure.ServiceBus.Exception |
qualsiasi API instrumentata |
Exception Exception : istanza di eccezione |
In ogni evento è possibile accedere a Activity.Current
che contiene il contesto dell'operazione
Registrazione di altre proprietà
Activity.Current
fornisce il contesto dettagliato dell'operazione corrente e i relativi elementi padre. Per altre informazioni, vedere la documentazione sulle attività.
bus di servizio strumentazione fornisce altre informazioni in Activity.Current.Tags
, che contengono MessageId
e SessionId
ogni volta che sono disponibili.
Anche le attività che verificano gli eventi 'Receive', 'Peek' e 'ReceiveDeferred' possono contenere il tag RelatedTo
. Tale tag contiene un elenco distinto di elementi Diagnostic-Id
di messaggi che sono stati ricevuti come risultato.
Tale operazione può causare la ricezione di numerosi messaggi non correlati. Inoltre, Diagnostic-Id
non è noto all'avvio dell'operazione, quindi le operazioni "Receive" potrebbero essere correlate alle operazioni "Process" usando solo questo tag. Il tag è utile quando si analizzano problemi di prestazioni per verificare il tempo impiegato per la ricezione del messaggio.
Un modo efficiente per registrare i tag consiste nell'eseguire l'iterazione su di essi. Ecco come aggiungere i tag all'esempio precedente
Activity currentActivity = Activity.Current;
TaskStatus status = (TaskStatus)evnt.Value.GetProperty("Status");
var tagsList = new StringBuilder();
foreach (var tags in currentActivity.Tags)
{
tagsList.Append($", {tags.Key}={tags.Value}");
}
serviceBusLogger.LogInformation($"{currentActivity.OperationName} is finished, Duration={currentActivity.Duration}, Status={status}, Id={currentActivity.Id}, StartTime={currentActivity.StartTimeUtc}{tagsList}");
Filtro e campionamento
In alcuni casi è consigliabile registrare solo parte degli eventi per ridurre il consumo dello spazio di archiviazione o il sovraccarico delle prestazioni. È possibile registrare solo gli eventi di tipo 'Stop' (come nell'esempio precedente) o una percentuale campione degli eventi.
A questo scopo, è possibile usare DiagnosticSource
con il predicato IsEnabled
. Per altre informazioni, vedere Context-Based Filtering in DiagnosticSource (Filtro in base al contesto in DiagnosticSource).
Per ridurre al minimo l'impatto sulle prestazioni, è possibile chiamare IsEnabled
più volte per una singola operazione.
IsEnabled
viene chiamato nella sequenza seguente:
IsEnabled(<OperationName>, string entity, null)
ad esempio, IsEnabled("Microsoft.Azure.ServiceBus.Send", "MyQueue1")
. Si noti che non c'è "Start" o "Stop" alla fine. Usarlo per escludere determinate operazioni o code. Se il metodo di callback restituisce false
, gli eventi per l'operazione non vengono inviati
- Per le operazioni di tipo 'Process' e 'ProcessSession' viene ricevuto anche il callback
IsEnabled(<OperationName>, string entity, Activity activity)
. Usarlo per filtrare gli eventi in base alle proprietà activity.Id
o Tags.
IsEnabled(<OperationName>.Start)
ad esempio, IsEnabled("Microsoft.Azure.ServiceBus.Send.Start")
. Controlla se deve essere attivato l'evento 'Start'. Il risultato influisce solo sull'evento "Start", ma non dipende da altri strumenti.
Non esiste alcun IsEnabled
evento "Stop".
Se il risultato di alcune operazioni è un'eccezione, viene chiamato IsEnabled("Microsoft.Azure.ServiceBus.Exception")
. È possibile eseguire la sottoscrizione solo di eventi 'Exception' e impedire il resto della strumentazione. In questo caso sarà comunque necessario gestire tali eccezioni. Poiché altre strumentazioni sono disabilitate, non è consigliabile prevedere il flusso del contesto di traccia con i messaggi dal consumer al producer.
È possibile usare IsEnabled
anche per implementare strategie di campionamento. Il campionamento basato su Activity.Id
o Activity.RootId
garantisce un campionamento coerente tra tutti i pneumatici (purché venga propagato dal sistema di traccia o dal proprio codice).
In presenza di più DiagnosticSource
listener per la stessa origine, è sufficiente che un solo listener accetti l'evento, quindi non esiste alcuna garanzia che IsEnabled
venga chiamata.