Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 skupit stopy, můžete vytvořit jednu aktivitu. Můžete například vytvořit jednu aktivitu pro každou žádost o službu. Provedete to následujícím postupem.
Uložte ID aktivity v oboru.
Vytvořte nové ID aktivity.
Přesuňte aktivitu z aktuálního rozsahu na novou, nastavte novou aktivitu do rozsahu a vygenerujte počáteční trasu pro danou aktivitu.
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");
Vydávání stop v rámci aktivity uživatele
Následující kód vytváří záznamy 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řejděte zpět na starou aktivitu, zastavte ID aktuální aktivity a resetujte ID původní aktivity v rámci rozsahu.
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 sledování v konfiguračních souborech klienta i služby, zpracování požadavku Přidat službou proběhne ve stejné aktivitě jako ta, která je definována v klientovi. Pokud služba definuje vlastní aktivity a přenosy, sledování služby se nezobrazí v aktivitě propagované klientem. Místo toho se zobrazují v aktivitě spojené stopami přenosu s aktivitou, jejíž ID je rozšiřováno klientem.
Poznámka:
Pokud je atribut nastaven jak na klientovi, tak na službě, okolní aktivitu v kontextu operace služby nastavuje 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;
Trasování vyvolaných výjimek v kódu
Při vyvolání výjimky v kódu můžete také sledovat výjimku na úrovni upozornění nebo vyšší 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 tam a zpět z aktivity Kalkulačky k aktivitě žádosti (trasování je zvýrazněno v 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 je propagateActivitytrue na každém koncovém bodu v cestě požadavku, sledová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í:
Klient odešle zprávu k přidání.
Služba obdrží zprávu o přidání žádosti.
Služba odešle odpověď na přidání.
Klient obdrží odpověď na přidání.
Všechny tyto záznamy byly vydány na úrovni informací. Kliknutím na stopu v pravém horním okně se zobrazí podrobnosti o této stopě v pravém dolním okně.
V následujícím diagramu také vidíme přenosové stopy z a do aktivity Kalkulačky, stejně jako dva páry Stop a Start stop pro každou aktivitu požadavku, jeden pro klienta a jeden pro službu (jeden pro každý zdroj stop).
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 klient také vyvolá výjimku (například když klient nedostal odpověď na svůj požadavek), dojde k upozornění nebo chybové zprávě služby i klienta ve stejné aktivitě, což umožňuje 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:
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. Ve službě (vyvolána výjimka) vidíme upozornění, za nimiž následují další upozornění a chyby na straně klienta, protože nebylo možné zpracovat požadavek. 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:
Abychom získali předchozí trasování, nastavili jsme ActivityTracing pro zdroje uživatelského trasování 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é u klienta se nerozšíří až do uživatelského kódu služby. Přenosy však umožňují korelovat aktivity klientského a uživatelského kódu služby s prostředními aktivitami 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.