Megosztás a következőn keresztül:


.NET elosztott nyomkövetési fogalmak

Az elosztott nyomkövetés egy diagnosztikai technika, amely segít a mérnököknek az alkalmazások hibáinak és teljesítményproblémáinak honosításában, különösen azokban, amelyek több gépen vagy folyamaton keresztül terjeszthetők. Az elosztott nyomkövetési áttekintésben általános információkat talál arról, hogy hol hasznos az elosztott nyomkövetés.

Nyomkövetések és tevékenységek

Minden alkalommal, amikor egy alkalmazás új kérelmet fogad, nyomkövetéssel társítható. A .NET-ben írt alkalmazásösszetevőkben a nyomkövetési munkaegységeket példányok System.Diagnostics.Activity jelölik, és a nyomkövetés egésze ezeknek a tevékenységeknek a fáját képezi, ami számos különböző folyamatra terjed ki. Az új kéréshez létrehozott első tevékenység képezi a nyomkövetési fa gyökerét, és nyomon követi a kérés teljes időtartamát és sikerességét/sikertelenségét. A gyermektevékenységek igény szerint létrehozhatóak a munka különböző lépésekre való felosztásához, amelyek egyenként nyomon követhetők. Ha például egy tevékenység egy adott bejövő HTTP-kérést követett egy webkiszolgálón, gyermektevékenységek hozhatók létre a kérés végrehajtásához szükséges adatbázis-lekérdezések nyomon követéséhez. Ez lehetővé teszi az egyes lekérdezések időtartamának és sikerességének független rögzítését. A tevékenységek az egyes munkaegységek egyéb adatait is rögzíthetik, például OperationNamea név-érték párok neve Tagsés Eventsa . A név azonosítja az elvégzett munka típusát, a címkék rögzíthetik a munka leíró paramétereit, az események pedig egy egyszerű naplózási mechanizmus az időbélyegzett diagnosztikai üzenetek rögzítéséhez.

Feljegyzés

Az elosztott nyomkövetésben lévő munkaegységek másik gyakori iparági neve a "Spans". A .NET már évekkel ezelőtt elfogadta a "Tevékenység" kifejezést, mielőtt a "Span" neve jól bevált volna ehhez a fogalomhoz.

Tevékenységazonosítók

Az elosztott nyomkövetési fában lévő tevékenységek közötti szülő-gyermek kapcsolatok egyedi azonosítók használatával jönnek létre. . Az elosztott nyomkövetés NET-implementálása két azonosítós sémát támogat: a W3C standard TraceContextet, amely az alapértelmezett a .NET 5+-ban, és egy régebbi , hierarchikus nevű .NET-konvenciót, amely a visszamenőleges kompatibilitás érdekében érhető el. Activity.DefaultIdFormat azt határozza meg, hogy melyik azonosítósémát használja. A W3C TraceContext szabványban minden nyomkövetés globálisan egyedi, 16 bájtos nyomkövetési azonosítót (Activity.TraceId) kap, és a nyomkövetésen belüli összes tevékenységhez egyedi, 8 bájtos span-id (Activity.SpanId) van hozzárendelve. Minden tevékenység rögzíti a nyomkövetési azonosítót, a saját span-id azonosítóját és a szülő (Activity.ParentSpanId) span-id azonosítóját. Mivel az elosztott nyomkövetések nyomon követhetik a munkafolyamatok közötti munkát, előfordulhat, hogy a szülő- és gyermektevékenységek nem ugyanabban a folyamatban működnek. A nyomkövetési azonosító és a szülő span-id kombinációja globálisan egyedileg azonosíthatja a szülőtevékenységet, függetlenül attól, hogy milyen folyamaton belül található.

Activity.DefaultIdFormat Az új nyomkövetések indításához használt azonosítóformátumot szabályozza, de alapértelmezés szerint egy új tevékenység meglévő nyomkövetéshez való hozzáadása bármilyen formátumot használ, amelyet a szülőtevékenység használ. Az igaz értékre állítás Activity.ForceDefaultIdFormat felülírja ezt a viselkedést, és minden új tevékenységet létrehoz a DefaultIdFormattal, még akkor is, ha a szülő más azonosítóformátumot használ.

Tevékenységek indítása és leállítása

A folyamat minden szála rendelkezhet egy megfelelő tevékenységobjektummal, amely nyomon követi az adott szálon zajló munkát, és elérhető a folyamaton keresztül Activity.Current. Az aktuális tevékenység automatikusan végighalad egy szál összes szinkron hívásán, és követi a különböző szálakon feldolgozott aszinkron hívásokat. Ha az A tevékenység egy szál aktuális tevékenysége, és a kód egy új B tevékenységet indít el, akkor a B lesz az új aktuális tevékenység az adott szálon. Alapértelmezés szerint a B tevékenység az A tevékenységet is szülőként kezeli. Ha a B tevékenység később leáll, az A tevékenység a szál aktuális tevékenységeként lesz visszaállítva. Amikor egy tevékenység elindul, az aktuális időpontot rögzíti.Activity.StartTimeUtc Ha leáll, Activity.Duration a rendszer az aktuális és a kezdési időpont közötti különbségként számítja ki.

Folyamathatárok közötti koordináta

A folyamathatárok közötti munka nyomon követéséhez a tevékenység szülőazonosítóit a hálózaton keresztül kell továbbítani, hogy a fogadó folyamat létre tudja hozni azokra hivatkozó tevékenységeket. A W3C TraceContext ID formátum használatakor a .NET a szabvány által ajánlott HTTP-fejléceket is használja az információk továbbításához. Az azonosítóformátum használatakor a Hierarchical .NET egy egyéni kérelemazonosítós HTTP-fejlécet használ az azonosító továbbításához. Sok más nyelvi futtatókörnyezettől eltérően a .NET beépített kódtárak, például a ASP.NET webkiszolgáló és a System.Net.Http natív módon értelmezik, hogyan kódolhatók és kódolhatók a http-üzenetek tevékenységazonosítói. A futtatókörnyezet azt is megérti, hogyan lehet az azonosítót szinkron és aszinkron hívásokon keresztül áramlani. Ez azt jelenti, hogy azok a .NET-alkalmazások, amelyek HTTP-üzeneteket fogadnak és bocsátanak ki, automatikusan részt vesznek az elosztott nyomkövetési azonosítók áramlásában, és az alkalmazás fejlesztője vagy harmadik féltől származó kódtár-függőségek nem használnak speciális kódolást. A külső kódtárak támogathatják az azonosítók nem HTTP-üzenet protokollokon keresztüli továbbítását, vagy támogathatják a HTTP egyéni kódolási konvencióit.

Nyomkövetések gyűjtése

A rendszerezett kód képes objektumokat létrehozni Activity egy elosztott nyomkövetés részeként, de az ezekben az objektumokban lévő információkat egy központosított állandó tárolóban kell továbbítani és szerializálni, hogy a teljes nyomkövetés később hasznosan áttekinthető legyen. Számos telemetriai gyűjteménytár képes erre a feladatra, például az Alkalmazás Elemzések, az OpenTelemetria vagy egy külső telemetria- vagy APM-szállító által biztosított kódtár. Másik lehetőségként a fejlesztők saját egyéni tevékenység telemetriai gyűjteményt is létrehozhatnak a használatával vagy System.Diagnostics.DiagnosticListenerhasználatávalSystem.Diagnostics.ActivityListener. Az ActivityListener bármilyen tevékenység megfigyelését támogatja, függetlenül attól, hogy a fejlesztő rendelkezik-e előzetes ismeretekkel. Így az ActivityListener egyszerű és rugalmas általános célú megoldássá válik. Ezzel szemben a DiagnosticListener használata egy összetettebb forgatókönyv, amely megköveteli, hogy a rendszerállapot-kód a meghívással DiagnosticSource.StartActivity engedélyezze az engedélyezést, és a gyűjteménytárnak ismernie kell azokat a pontos elnevezési információkat, amelyeket a rendszerállapot-kód használt az indításkor. A DiagnosticSource és a DiagnosticListener használatával a létrehozó és a figyelő tetszőleges .NET-objektumokat cserélhet le, és testre szabott információátadási konvenciót hozhat létre.

Mintavételezés

A nagy átviteli sebességű alkalmazások jobb teljesítménye érdekében a .NET-en az elosztott nyomkövetés csak a nyomkövetések egy részhalmazát támogatja ahelyett, hogy az összeset rögzítenék. Az ajánlott ActivitySource.StartActivity API-val létrehozott tevékenységek esetében a telemetriai gyűjteménytárak szabályozhatják a mintavételezést a ActivityListener.Sample visszahívással. A naplózási kódtár dönthet úgy, hogy egyáltalán nem hozza létre a tevékenységet, hogy minimális információval hozza létre a nyomkövetési azonosítók terjesztésének propagálásához vagy teljes diagnosztikai adatokkal való feltöltéséhez. Ezek a választási lehetőségek a diagnosztikai segédprogram növelésének teljesítménybeli többletterhelését növelik. Azok a tevékenységek, amelyek a korábbi invokálási Activity.Activity mintát használják, és DiagnosticSource.StartActivity a DiagnosticListener mintavételezését is támogathatják az első hívással DiagnosticSource.IsEnabled. A .NET-implementációt még a teljes diagnosztikai adatok rögzítésekor is úgy tervezték, hogy gyors legyen – hatékony gyűjtővel párosítva, egy tevékenység körülbelül mikroszekundumban, modern hardveren hozható létre, tölthető fel és továbbítható. A mintavételezés 100 nanoszekundumnál kisebbre csökkentheti a rendszerállapot költségeit minden olyan tevékenység esetében, amely nincs rögzítve.

Következő lépések

Az elosztott nyomkövetés .NET-alkalmazásokban való használatának megkezdéséhez például tekintse meg az Elosztott nyomkövetési rendszerállapot című témakört.