User-Code nyomkövetések kibocsátása

Amellett, hogy lehetővé teszi a nyomkövetést a konfigurációban a Windows Communication Foundation (WCF) által létrehozott rendszerállapot-adatok gyűjtéséhez, programozott módon is kibocsáthat nyomkövetéseket a felhasználói kódban. Ily módon proaktív módon hozhat létre olyan rendszerállapot-adatokat, amelyeket később diagnosztikai célokra felhasználhat. Ez a témakör azt ismerteti, hogyan teheti meg ezt.

Emellett a Nyomkövetés kiterjesztése minta az alábbi szakaszokban bemutatott összes kódot tartalmazza.

Nyomkövetési forrás létrehozása

A következő kóddal létrehozhat egy felhasználói nyomkövetési forrást.

TraceSource ts = new TraceSource("myUserTraceSource");

Tevékenységek létrehozása

A tevékenységek a feldolgozás logikai egységei. Minden nagyobb feldolgozási egységhez létrehozhat egy tevékenységet, amelyben a nyomkövetéseket csoportosítani szeretné. Létrehozhat például egy tevékenységet a szolgáltatásnak küldött minden egyes kéréshez. Ehhez hajtsa végre a következő lépéseket.

  1. Mentse el a tevékenységazonosítót a hatókörben.

  2. Hozzon létre egy új tevékenységazonosítót.

  3. Átvitel a hatókörben lévő tevékenységről az újra, állítsa be az új tevékenységet a hatókörben, és adjon ki egy kezdő nyomkövetést az adott tevékenységhez.

Az alábbi kód bemutatja, hogyan teheti ezt meg.

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

Nyomkövetések kibocsátása egy felhasználói tevékenységen belül

Az alábbi kód nyomkövetéseket bocsát ki egy felhasználói tevékenységen belül.

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

A tevékenységek leállítása

A tevékenységek leállításához térjen vissza a régi tevékenységhez, állítsa le az aktuális tevékenységazonosítót, és állítsa alaphelyzetbe a régi tevékenységazonosítót a hatókörben.

Az alábbi kód bemutatja, hogyan teheti ezt meg.

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

A tevékenységazonosító propagálása egy szolgáltatásba

Ha a propagateActivity attribútumot true állítja be a System.ServiceModel nyomkövetési forráshoz mind az ügyfél-, mind a szolgáltatáskonfigurációs fájlokban, a hozzáadási kérés feldolgozása ugyanabban a tevékenységben történik, mint az ügyfélben definiált. Ha a szolgáltatás saját tevékenységeket és átviteleket határoz meg, a szolgáltatás nyomkövetései nem jelennek meg az ügyfél által propagált tevékenységben. Ehelyett egy olyan tevékenységben jelennek meg, amely átviteli nyomok által áll kapcsolatban azzal a tevékenységgel, amelynek azonosítóját az ügyfél terjeszti.

Megjegyzés:

Ha az propagateActivity attribútum az ügyfélen és a szolgáltatáson is be van állítva true , a szolgáltatás működési hatókörében a környezeti tevékenységet a WCF állítja be.

Az alábbi kód segítségével ellenőrizheti, hogy a WCF beállított-e egy tevékenységet a hatókörben.

// 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;

Kivételek nyomkövetése a kódban

Ha kivételt ad a kódban, a kivételt figyelmeztetési szinten vagy a következő kód használatával is nyomon követheti.

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

Felhasználói nyomkövetések megtekintése a Szolgáltatáskövetés-megjelenítő eszközben

Ez a szakasz képernyőképeket tartalmaz a Nyomkövetés kiterjesztése minta futtatásával létrehozott nyomkövetésekről, amikor a Service Trace Viewer tool (SvcTraceViewer.exe) használatával tekintik meg.

Az alábbi ábrán a korábban létrehozott "Kérelem hozzáadása" tevékenység van kiválasztva a bal oldali panelen. Az alkalmazás-ügyfélprogramot alkotó három további matematikai művelettel (Divide, Subtract, Multiply) együtt szerepel a listán. A felhasználói kód minden művelethez egy új tevékenységet határozott meg, hogy elkülönítse a különböző kérésekben előforduló lehetséges hibaeseményeket.

A nyomkövetés kiterjesztése mintában az átvitelek használatának bemutatásához létrejön egy számológép-tevékenység is, amely a négy műveleti kérést foglalja magában. Minden egyes kérés esetében a Számológép tevékenységről oda-vissza átvitel történik a kérelemtevékenységre (a nyomkövetés a jobb felső panelen van kiemelve az ábrán).

Amikor kiválaszt egy tevékenységet a bal oldali panelen, a tevékenységhez tartozó nyomkövetések a jobb felső panelen jelennek meg. Ha propagateActivity a kérelem útvonalának minden végpontján található true , a kérelemtevékenység nyomkövetései a kérelemben részt vevő összes folyamatból származnak. Ebben a példában a panel 4. oszlopában látható mind az ügyfél, mind a szolgáltatás nyomkövetése.

Ez a tevékenység a következő feldolgozási sorrendet mutatja:

  1. Az ügyfél üzenetet küld a Hozzáadás parancsnak.

  2. A szolgáltatás fogadja a Kérelem hozzáadása üzenetet.

  3. A szolgáltatás küld egy "Hozzáadás" választ.

  4. Az ügyfél kiegészítési választ kap.

Ezek a lenyomatok információ szinten lettek generálva. Ha a jobb felső panelen egy nyomkövetésre kattint, a nyomkövetés részletei láthatók a jobb alsó panelen.

Az alábbi ábrán a Kalkulátor tevékenységből és a Kalkulátor tevékenységbe irányuló átviteli nyomkövetéseket is láthatjuk, valamint minden kérelemtevékenységhez két pár Indítási és Leállítási nyomkövetést: egyet az ügyfélhez és egyet a szolgáltatáshoz (mindkét nyomkövetési forráshoz külön-külön).

Trace Viewer: Felhasználói kód nyomkövetéseinek kibocsátása Tevékenységek listája létrehozási idő szerint (bal panel) és a beágyazott tevékenységeik (jobb felső panel)

Ha a szolgáltatáskód olyan kivételt dob, amely miatt az ügyfél is kivételt dob (például amikor az ügyfél nem kapja meg a választ a kérésére), a szolgáltatás és az ügyfél hiba- vagy figyelmeztető üzenetei ugyanazon tevékenységben jelennek meg közvetlen korreláció céljából. Az alábbi képen a szolgáltatás kivételt jelez: "A szolgáltatás nem hajlandó feldolgozni ezt a kérést a felhasználói kódban". Az ügyfél kivételt is jelez, amely szerint "A kiszolgáló belső hiba miatt nem tudta feldolgozni a kérést".

Az alábbi képek azt mutatják, hogy az adott kérés végpontjai közötti hibák ugyanabban a tevékenységben jelennek meg, ha a kérelem tevékenységazonosítóját propagálták:

Képernyőkép egy adott kérés végpontjai közötti hibákról.

A bal oldali panelen a Szorzás tevékenységre duplán kattintva az alábbi grafikon látható, amelyen az egyes folyamatok szorzási tevékenységének nyomkövetései láthatók. Először figyelmeztetés jelenik meg a szolgáltatásban (kivétel történt), amelyet figyelmeztetések és hibák követnek az ügyfélen, mert a kérést nem sikerült feldolgozni. Ezért utalhatunk a végpontok közötti oksági hiba kapcsolatára, és levezethetjük a hiba kiváltó okát.

Az alábbi képen a hiba korrelációjának gráfnézete látható:

Képernyőkép a hibakorreláció gráfnézetéről.

Az előző nyomkövetések beszerzéséhez meg kell adni ActivityTracing a felhasználói nyomkövetési forrásokat és propagateActivity=true a nyomkövetési System.ServiceModel forrást. Nem állítottuk be a ActivityTracing-t a System.ServiceModel nyomkövetési forráshoz, hogy lehetővé tegyük a felhasználói kódok közötti tevékenység propagálását. (Ha a ServiceModel-tevékenység nyomkövetése be van kapcsolva, az ügyfélben definiált tevékenységazonosítót a rendszer nem propagálja egészen a szolgáltatásfelhasználói kódig; Az átvitelek azonban korrelálják az ügyfél- és szolgáltatásfelhasználói kódtevékenységeket a köztes WCF-tevékenységekhez.)

A tevékenységek definiálása és a tevékenységazonosító propagálása lehetővé teszi a végpontok közötti közvetlen hibakorrelációt. Így gyorsabban megtalálhatjuk a hiba kiváltó okát.

Lásd még