Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Oltre ad abilitare la traccia nella configurazione per raccogliere i dati di strumentazione generati da Windows Communication Foundation (WCF), è anche possibile generare tracce a livello di codice nel codice utente. In questo modo, è possibile creare in modo proattivo i dati di strumentazione che è possibile usare in un secondo momento a scopo diagnostico. In questo argomento viene illustrato come eseguire questa operazione.
Inoltre, l'esempio extending tracing include tutto il codice illustrato nelle sezioni seguenti.
Creazione di un'origine di traccia
È possibile usare il codice seguente per creare un'origine di traccia utente.
TraceSource ts = new TraceSource("myUserTraceSource");
Creazione di attività
Le attività sono unità logiche di elaborazione. È possibile creare un'attività per ogni unità di elaborazione principale in cui si desidera raggruppare le tracce. Ad esempio, è possibile creare un'attività per ogni richiesta al servizio. A tale scopo, seguire questa procedura.
Salva l'ID dell'attività nel contesto.
Creare un nuovo ID attività.
Trasferire dall'attività in ambito a quella nuova, impostare la nuova attività in ambito e emettere una traccia di avvio per tale attività.
Il codice seguente illustra come eseguire questa operazione.
Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");
Emissione di tracce all'interno di un'attività utente
Il codice seguente genera tracce all'interno di un'attività utente.
double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + result + "'");
Arresto delle attività
Per arrestare le attività, tornare all'attività precedente, arrestare l'ID dell'attività corrente e ripristinare l'ID dell'attività precedente nell'ambito.
Il codice seguente illustra come eseguire questa operazione.
ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;
Propagazione dell'ID attività a un servizio
Se imposti l'attributo propagateActivity su true per l'origine di traccia System.ServiceModel nei file di configurazione del client e del servizio, l'elaborazione del servizio per la richiesta Aggiungi avviene nella stessa attività definita nel client. Se il servizio definisce le proprie attività e trasferimenti, le tracce del servizio non vengono visualizzate nell'attività propagata dal client. Vengono invece visualizzati in un'attività correlata tramite il trasferimento di tracce all'attività il cui ID viene propagato dal client.
Annotazioni
Se l'attributo propagateActivity è impostato su true sia sul client che sul servizio, l'attività di ambiente nell'ambito dell'operazione del servizio viene impostata da WCF.
È possibile usare il codice seguente per verificare se un'attività è stata impostata nell'ambito da WCF.
// Check if an activity was set in scope by WCF, if it was
// propagated from the client. If not, ( ambient activity is
// equal to Guid.Empty), create a new one.
if(Trace.CorrelationManager.ActivityId == Guid.Empty)
{
Guid newGuid = Guid.NewGuid();
Trace.CorrelationManager.ActivityId = newGuid;
}
// Emit your Start trace.
ts.TraceEvent(TraceEventType.Start, 0, "Add Activity");
// Emit the processing traces for that request.
serviceTs.TraceInformation("Service receives Add "
+ n1 + ", " + n2);
// double result = n1 + n2;
serviceTs.TraceInformation("Service sends Add result" + result);
// Emit the Stop trace and exit the method scope.
ts.TraceEvent(TraceEventType.Stop, 0, "Add Activity");
// return result;
Tracciamento delle eccezioni lanciate nel codice
Quando si genera un'eccezione nel codice, è anche possibile tracciare l'eccezione a livello di avviso o superiore usando il codice seguente.
ts.TraceEvent(TraceEventType.Warning, 0, "Throwing exception " + "exceptionMessage");
Visualizzazione delle tracce utente nello strumento Visualizzatore delle tracce di servizio
Questa sezione contiene screenshot delle tracce generate eseguendo l'esempio Extending Tracing, quando vengono visualizzate usando lo strumento Visualizzatore di tracce del servizio (SvcTraceViewer.exe).
Nel diagramma seguente, l'attività "Aggiungi richiesta" creata in precedenza è selezionata nel pannello sinistro. Viene elencato con altre tre attività operative matematiche (Divide, Sottrazione, Moltiplicazione) che costituiscono il programma client dell'applicazione. Il codice utente ha definito una nuova attività per ogni operazione per isolare potenziali occorrenze di errore in richieste diverse.
Per illustrare l'uso dei trasferimenti nell'esempio extending tracing , viene creata anche un'attività calcolatrice che incapsula le quattro richieste di operazione. Per ogni richiesta, è presente un trasferimento dall'attività Calcolatrice all'attività della richiesta (la traccia è evidenziata nel pannello superiore destro nella figura).
Quando si seleziona un'attività nel pannello sinistro, le tracce incluse in questa attività vengono visualizzate nel pannello in alto a destra. Se propagateActivity si trova true in ogni endpoint nel percorso della richiesta, le tracce nell'attività della richiesta provengono da tutti i processi che partecipano alla richiesta. In questo esempio è possibile visualizzare tracce sia dal client che dal servizio nella 4a colonna del pannello.
Questa attività mostra l'ordine di elaborazione seguente:
Il client invia un messaggio a Aggiungi.
Il servizio riceve il messaggio Aggiungi richiesta.
Il servizio invia la risposta Aggiungi.
Il client riceve la risposta Add.
Tutte queste tracce sono state generate a livello di informazioni. Facendo clic su una traccia nel pannello in alto a destra vengono visualizzati i dettagli di tale traccia nel pannello in basso a destra.
Nel diagramma seguente vengono inoltre visualizzate le tracce di trasferimento da e all'attività Calculator, nonché due coppie di tracce Start e Stop per ogni attività di richiesta, una per il client e una per il servizio (una per ogni origine di traccia).
Elenco delle attività in base all'ora di creazione (pannello sinistro) e alle relative attività annidate (pannello in alto a destra)
Se il codice del servizio genera un'eccezione che fa sì che il client generi anche un'eccezione (ad esempio, quando il client non ha ricevuto la risposta alla propria richiesta), sia i messaggi di avviso o di errore del servizio e del client si verificano nella stessa attività per la correlazione diretta. Nell'immagine seguente il servizio genera un'eccezione che indica che il servizio rifiuta di elaborare questa richiesta nel codice utente. Il client genera anche un'eccezione che indica che il server non è riuscito a elaborare la richiesta a causa di un errore interno.
Le immagini seguenti mostrano che gli errori tra endpoint per una determinata richiesta vengono visualizzati nella stessa attività se l'ID attività della richiesta è stato propagato:
Facendo doppio clic sull'attività Moltiplica nel pannello sinistro viene visualizzato il grafico seguente, con le tracce per l'attività Moltiplica per ogni processo coinvolto. È possibile visualizzare un avviso prima che si sia verificato nel servizio (eccezione generata), seguito da avvisi ed errori nel client perché non è stato possibile elaborare la richiesta. È pertanto possibile implicare la relazione di errore causale tra endpoint e derivare la causa radice dell'errore.
L'immagine seguente mostra una visualizzazione a grafo della correlazione degli errori:
Per ottenere le tracce precedenti, è necessario utilizzare ActivityTracing per le origini di traccia utente e propagateActivity=true per l'origine di traccia System.ServiceModel. Non è stato impostato ActivityTracing per l'origine della traccia per abilitare la propagazione dell'attività tra codici utente. Quando la traccia dell'attività ServiceModel è attivata, l'ID attività definito nel client non viene propagato fino al codice utente del servizio; I trasferimenti, tuttavia, correlano le attività del codice utente client e del servizio alle attività WCF intermedie.
La definizione delle attività e la propagazione dell'ID attività consente di eseguire la correlazione diretta degli errori tra gli endpoint. In questo modo, è possibile individuare la causa radice di un errore più rapidamente.