Sdílet prostřednictvím


Generování trasování v uživatelském kódu

Kromě povolení trasování v konfiguraci ke shromažďování dat instrumentace generovaných službou Windows Communication Foundation (WCF) můžete trasování generovat také programově v uživatelském kódu. Tímto způsobem můžete proaktivně vytvářet data instrumentace, která můžete později pro diagnostické účely využít. Toto téma popisuje, jak to můžete udělat.

Kromě toho ukázka rozšíření trasování zahrnuje veškerý kód ukázaný v následujících částech.

Vytvoření zdroje trasování

K vytvoření zdroje trasování uživatele můžete použít následující kód.

TraceSource ts = new TraceSource("myUserTraceSource");

Vytváření aktivit

Aktivity jsou logická jednotka zpracování. Pro každou hlavní jednotku zpracování, ve které chcete seskupit trasování, můžete vytvořit jednu aktivitu. Můžete například vytvořit jednu aktivitu pro každou žádost o službu. Provedete to pomocí následujících kroků.

  1. Uložte ID aktivity v oboru.

  2. Vytvořte nové ID aktivity.

  3. Přeneste z aktivity v oboru na novou, nastavte novou aktivitu v oboru a vygenerujte pro danou aktivitu počáteční trasování.

Následující kód ukazuje, jak to provést.

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");

Generování trasování v rámci aktivity uživatele

Následující kód generuje trasování v rámci aktivity uživatele.

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 + "'");

Zastavení aktivit

Pokud chcete aktivity zastavit, přeneste zpět na starou aktivitu, zastavte ID aktuální aktivity a resetujte původní ID aktivity v oboru.

Následující kód ukazuje, jak to provést.

ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;

Šíření ID aktivity do služby

Pokud nastavíte propagateActivity atribut true pro System.ServiceModel zdroj trasování v konfiguračních souborech klienta i služby, zpracování služby pro požadavek Přidat proběhne ve stejné aktivitě jako ta, která je definovaná v klientovi. Pokud služba definuje vlastní aktivity a přenosy, trasování služby se nezobrazí v aktivitě šířené klientem. Místo toho se zobrazují v aktivitě korelované přenosem trasování do aktivity, jejíž ID se šíří klientem.

Poznámka:

propagateActivity Pokud je atribut nastaven na true klienta i služby, okolí aktivity v oboru operace služby je nastaven wcf.

Pomocí následujícího kódu můžete zkontrolovat, jestli byla aktivita nastavena v oboru 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;

Výjimky trasování vyvolané v kódu

Při vyvolání výjimky v kódu můžete také trasovat výjimku na úrovni upozornění nebo nahoru pomocí následujícího kódu.

ts.TraceEvent(TraceEventType.Warning, 0, "Throwing exception " + "exceptionMessage");

Zobrazení trasování uživatelů v nástroji Service Trace Viewer

Tato část obsahuje snímky obrazovek trasování vygenerovaných spuštěním ukázky rozšíření trasování při zobrazení pomocí nástroje Service Trace Viewer (SvcTraceViewer.exe).

V následujícím diagramu je na levém panelu vybrána dříve vytvořená aktivita Přidat žádost. Je uveden se třemi dalšími aktivitami matematické operace (Divide, Subtract, Multipli), které tvoří klientský program aplikace. Uživatelský kód definoval jednu novou aktivitu pro každou operaci, aby izoloval potenciální výskyty chyb v různých požadavcích.

K předvedení použití přenosů v ukázce rozšíření trasování se vytvoří také aktivita kalkulačky, která zapouzdřuje čtyři požadavky na operace. Pro každou žádost existuje přenos zpět z aktivity kalkulačky na aktivitu žádosti (trasování je zvýrazněno na pravém horním panelu na obrázku).

Když vyberete aktivitu na levém panelu, zobrazí se na pravém horním panelu trasování zahrnutá touto aktivitou. Pokud propagateActivity je true na každém koncovém bodu v cestě požadavku, trasování v aktivitě požadavku pocházejí ze všech procesů, které se účastní požadavku. V tomto příkladu vidíte trasování z klienta i služby v 4. sloupci na panelu.

Tato aktivita zobrazuje následující pořadí zpracování:

  1. Klient odešle zprávu k přidání.

  2. Služba obdrží zprávu o přidání žádosti.

  3. Služba odešle odpověď Přidat.

  4. Klient obdrží odpověď Přidat.

Všechna tato trasování se vygenerovala na úrovni Informací. Kliknutím na trasování v pravém horním panelu se zobrazí podrobnosti o tomto trasování v pravém dolním panelu.

V následujícím diagramu vidíme také trasování přenosu z aktivity kalkulačky a do nich a také dva páry trasování Start a Stop na aktivitu požadavku, jednu pro klienta a jednu pro službu (jednu pro každý zdroj trasování).

Trace Viewer: Emitting User-code traces Seznam aktivit podle času vytvoření (levý panel) a jejich vnořených aktivit (pravý horní panel)

Pokud kód služby vyvolá výjimku, která způsobí, že se klient vyvolá také (například když klient nedostal odpověď na svůj požadavek), dojde k upozornění služby i klientovi nebo chybové zprávy ve stejné aktivitě pro přímou korelaci. Na následujícím obrázku služba vyvolá výjimku, která uvádí, že služba odmítá zpracovat tento požadavek v uživatelském kódu. Klient také vyvolá výjimku, která uvádí, že server nemohl zpracovat požadavek z důvodu vnitřní chyby.

Následující obrázky ukazují, že chyby napříč koncovými body pro daný požadavek se zobrazují ve stejné aktivitě, pokud se ID aktivity požadavku rozšířilo:

Screenshot that shows errors across endpoints for a given request.

Poklikáním na aktivitu Násobit na levém panelu se zobrazí následující graf s trasováním aktivity Násobit pro každý zahrnutý proces. V rámci služby (vyvolán výjimka) vidíme upozornění, za kterým následuje upozornění a chyby v klientovi, protože požadavek nebylo možné zpracovat. Proto můžeme znamenat kauzální vztah chyb mezi koncovými body a odvodit původní příčinu chyby.

Následující obrázek znázorňuje zobrazení grafu korelace chyb:

Screenshot that shows the graph view of error correlation.

Abychom získali předchozí trasování, nastavili ActivityTracing jsme pro zdroje trasování uživatele a propagateActivity=true pro System.ServiceModel zdroj trasování. Pro zdroj trasování jsme nenastavili ActivityTracingSystem.ServiceModel , aby se šíření aktivity uživatelského kódu do kódu uživatele povolilo. (Pokud je zapnuté trasování aktivity ServiceModel, ID aktivity definované v klientovi se nerozšířuje až do uživatelského kódu služby; Přenese však korelaci aktivit uživatelského kódu klienta a služby s mezilehlých aktivit WCF.)

Definování aktivit a šíření ID aktivity nám umožňuje provádět přímou korelaci chyb napříč koncovými body. Tímto způsobem můžeme rychleji najít původní příčinu chyby.

Viz také