Distribuované trasování a korelace prostřednictvím Service Bus zasílání zpráv
Jedním z běžných problémů vývoje mikroslužeb je schopnost sledovat operace od klienta přes všechny služby, které jsou součástí zpracování. Je užitečné pro ladění, analýzu výkonu, testování a/B a další typické scénáře diagnostiky. Jednou z těchto potíží je sledování logických částí práce. Zahrnuje výsledky zpracování zpráv a latence a externí volání závislostí. Další část je korelace těchto událostí diagnostiky za hranice procesu.
Když producent pošle zprávu přes frontu, obvykle se děje v rozsahu některé jiné logické operace iniciované nějakým jiným klientem nebo službou. Stejná operace pokračuje příjemcem, jakmile obdrží zprávu. Producent i příjemce (a další služby, které zpracovávají operaci), předpokládané vysílat události telemetrie pro trasování toku a výsledku operace. Aby bylo možné tyto události a trasovací operace vzájemně sladit, musí každá služba, která hlásí telemetrii, vyplnit každou událost pomocí kontextu trasování.
Microsoft Azure Service Bus zasílání zpráv má definované vlastnosti datové části, které by producenti a spotřebitelé měli použít k předání takového kontextu trasování. Protokol je založený na protokolu korelace http.
| Název vlastnosti | Description |
|---|---|
| Diagnostic-Id | Jedinečný identifikátor externího volání od producenta do fronty. Odůvodnění, požadavky a formát najdete v protokolu HTTP pro žádosti o ID . |
Service Bus autotracing klienta .NET
ServiceBusProcessorTřída služby Azure Messaging Service Bus Client for .NET poskytuje trasovací body instrumentace, které mohou být zapojeny do trasovacích systémů nebo z kódu klienta. Instrumentace umožňuje sledování všech volání služby Service Bus Messaging Service ze strany klienta. Pokud je zpracování zpráv provedeno ProcessMessageAsync ServiceBusProcessor pomocí (vzoru obslužné rutiny zpráv), je rovněž instrumentované zpracování zprávy.
Sledování s využitím Azure Application Insights
Microsoft Application Insights poskytuje bohatě výkonné možnosti monitorování, včetně automagic Request a sledování závislostí.
V závislosti na typu projektu nainstalujte Application Insights SDK:
- ASP.NET – instalace verze 2,5-beta2 nebo vyšší
- ASP.NET Core – instalace verze 2.2.0-beta2 nebo vyšší. Tyto odkazy poskytují podrobné informace o instalaci sady SDK, vytváření prostředků a konfiguraci sady SDK (v případě potřeby). Informace o aplikacích non-ASP.NET najdete v článku o konzolových aplikacích Azure Application Insights .
Použijete-li pro zpracování zpráv (vzorek ProcessMessageAsync ServiceBusProcessor obslužné rutiny zpráv), je zpracování zprávy rovněž instrumentované. Všechna Service Bus volání prováděná službou jsou automaticky sledována a koreluje s ostatními položkami telemetrie. Jinak v případě ručního sledování zpracování zpráv použijte následující příklad.
Trasování zpracování zpráv
async Task ProcessAsync(ProcessMessageEventArgs args)
{
ServiceBusReceivedMessage message = args.Message;
if (message.ApplicationProperties.TryGetValue("Diagnostic-Id", out var objectId) && objectId is string diagnosticId)
{
var activity = new Activity("ServiceBusProcessor.ProcessMessage");
activity.SetParentId(diagnosticId);
// If you're using Microsoft.ApplicationInsights package version 2.6-beta or higher, you should call StartOperation<RequestTelemetry>(activity) instead
using (var operation = telemetryClient.StartOperation<RequestTelemetry>("Process", activity.RootId, activity.ParentId))
{
telemetryClient.TrackTrace("Received message");
try
{
// process message
}
catch (Exception ex)
{
telemetryClient.TrackException(ex);
operation.Telemetry.Success = false;
throw;
}
telemetryClient.TrackTrace("Done");
}
}
}
V tomto příkladu je pro každou zpracovávanou zprávu hlášena telemetrie požadavků, která má časové razítko, dobu trvání a výsledek (úspěch). Telemetrie má také sadu vlastností korelace. Vnořená trasování a výjimky hlášené během zpracování zprávy jsou také označeny vlastnostmi korelace, které je představují jako podřízené položky RequestTelemetry .
V případě, že během zpracování zprávy provedete volání podporovaných externích komponent, jsou také automaticky sledovány a korelace. Informace o ručním sledování a korelaci najdete v tématu sledování vlastních operací pomocí Application Insights .NET SDK .
Pokud kromě Application Insights SDK používáte i nějaký externí kód, při zobrazení protokolů Application Insights se očekává, že se zobrazí delší Doba trvání .

Neznamená to, že při přijímání zprávy došlo k prodlevě. V tomto scénáři již byla zpráva přijata, protože zpráva je předána jako parametr kódu sady SDK. A značka Name v protokolech App Insights (Process) označuje, že zpráva se teď zpracovává vaším kódem pro zpracování externích událostí. Tento problém se netýká Azure. Místo toho tyto metriky odkazují na efektivitu vašeho externího kódu, protože zpráva již byla přijata z Service Bus.
Sledování bez trasování systému
V případě, že váš sledovací systém nepodporuje sledování volání automatických Service Bus, může se stát, že budete chtít přidat takovou podporu do trasovacího systému nebo do aplikace. Tato část popisuje diagnostické události odesílané Service Bus klienta .NET.
Service Bus klient .NET instrumentuje pomocí primitivních primitiv rozhraní .NET System. Diagnostics. Activity a System. Diagnostics. DiagnosticSource.
Activity slouží jako kontext trasování, zatímco DiagnosticSource je mechanismus oznámení.
Pokud není k dispozici naslouchací proces pro události DiagnosticSource, instrumentace se vypne a zachová nulové náklady instrumentace. DiagnosticSource poskytuje všem ovládacím prvkům naslouchací proces:
- naslouchací proces řídí, se kterými zdroji a událostmi naslouchá
- frekvence a vzorkování událostí ovládacích prvků naslouchacího procesu
- události se odesílají s datovou částí, která poskytuje úplný kontext, takže můžete přistupovat k objektu zprávy a upravovat ho během události.
Než budete pokračovat v implementaci, Seznamte se s DiagnosticSource User Guide .
Pojďme vytvořit naslouchací proces pro Service Bus události v aplikaci ASP.NET Core, která zapisuje protokoly do Microsoft. extension. protokolovacího nástroje. Pomocí knihovny System. Reactive. Core se přihlásí k odběru DiagnosticSource (můžete se taky snadno přihlásit k odběru DiagnosticSource bez něj).
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory factory, IApplicationLifetime applicationLifetime)
{
// configuration...
var serviceBusLogger = factory.CreateLogger("Azure.Messaging.ServiceBus");
IDisposable innerSubscription = null;
IDisposable outerSubscription = DiagnosticListener.AllListeners.Subscribe(delegate (DiagnosticListener listener)
{
// subscribe to the Service Bus DiagnosticSource
if (listener.Name == "Azure.Messaging.ServiceBus")
{
// receive event from Service Bus DiagnosticSource
innerSubscription = listener.Subscribe(delegate (KeyValuePair<string, object> evnt)
{
// Log operation details once it's done
if (evnt.Key.EndsWith("Stop"))
{
Activity currentActivity = Activity.Current;
serviceBusLogger.LogInformation($"Operation {currentActivity.OperationName} is finished, Duration={currentActivity.Duration}, Id={currentActivity.Id}, StartTime={currentActivity.StartTimeUtc}");
}
});
}
});
applicationLifetime.ApplicationStopping.Register(() =>
{
outerSubscription?.Dispose();
innerSubscription?.Dispose();
});
}
V tomto příkladu jsou protokoly naslouchacího procesu trvání, výsledek, jedinečný identifikátor a čas spuštění pro každou operaci Service Bus.
Události
Všechny události budou mít následující vlastnosti, které jsou v souladu se specifikací Open telemetrie: https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/api.md .
message_bus.destination– fronta/téma/cesta předplatnéhopeer.address– plně kvalifikovaný obor názvůkind– buď producent, příjemce nebo klient. Výrobce se používá při posílání zpráv, příjemce při přijímání a klientovi při vyrovnávání.component–servicebus
Všechny události mají také vlastnosti entita a koncový bod, které jsou v níže uvedené tabulce vynechány.
string Entity--Název entity (Queue, téma atd.)Uri Endpoint– Service Bus adresa URL koncového bodu
Instrumentované operace
Tady je úplný seznam instrumentované operace:
| Název operace | Sledované rozhraní API |
|---|---|
| ServiceBusSender. Send | ServiceBusSender.SendMessageAsync ServiceBusSender.SendMessagesAsync |
| ServiceBusSender. Schedule | ServiceBusSender.ScheduleMessageAsync ServiceBusSender.ScheduleMessagesAsync |
| ServiceBusSender. Cancel | ServiceBusSender.CancelScheduledMessageAsync ServiceBusSender.CancelScheduledMessagesAsync |
| ServiceBusReceiver. Receive | ServiceBusReceiver.ReceiveMessageAsync ServiceBusReceiver.ReceiveMessagesAsync |
| ServiceBusReceiver.ReceiveDeferred | ServiceBusReceiver.ReceiveDeferredMessagesAsync |
| ServiceBusReceiver. prohlížet | ServiceBusReceiver.PeekMessageAsync ServiceBusReceiver.PeekMessagesAsync |
| ServiceBusReceiver. Abandon | ServiceBusReceiver.AbandonMessagesAsync |
| ServiceBusReceiver. Complete | ServiceBusReceiver.CompleteMessagesAsync |
| ServiceBusReceiver. nedoručených zpráv | ServiceBusReceiver.DeadLetterMessagesAsync |
| ServiceBusReceiver. odklad | ServiceBusReceiver.DeferMessagesAsync |
| ServiceBusReceiver.RenewMessageLock | ServiceBusReceiver.RenewMessageLockAsync |
| ServiceBusSessionReceiver.RenewSessionLock | ServiceBusSessionReceiver.RenewSessionLockAsync |
| ServiceBusSessionReceiver. getsessionstate | ServiceBusSessionReceiver.GetSessionStateAsync |
| ServiceBusSessionReceiver.SetSessionState | ServiceBusSessionReceiver.SetSessionStateAsync |
| ServiceBusProcessor.ProcessMessage | Zpětné volání procesoru nastaveno na ServiceBusProcessor. Vlastnost ProcessMessageAsync |
| ServiceBusSessionProcessor.ProcessSessionMessage | Zpětné volání procesoru nastaveno na ServiceBusSessionProcessor. Vlastnost ProcessMessageAsync |
Filtrování a vzorkování
V některých případech je žádoucí protokolovat pouze část událostí, aby se snížila režie výkonu nebo spotřeba úložiště. Mohli byste protokolovat pouze události stop (jako v předchozím příkladu) nebo ukázkové procento událostí.
DiagnosticSource Poskytněte způsob, jak ho dosáhnout pomocí IsEnabled predikátu. Další informace najdete v tématu filtrování založené na kontextu v DiagnosticSource.
IsEnabled může být voláno vícekrát, aby jedna operace minimalizovala dopad na výkon.
IsEnabled se volá v následujícím pořadí:
IsEnabled(<OperationName>, string entity, null)napříkladIsEnabled("ServiceBusSender.Send", "MyQueue1"). Všimněte si, že na konci není žádné "Start" nebo "Stop". Slouží k filtrování konkrétních operací nebo front. Pokud metoda zpětného volání vrátí hodnotufalse, události pro operaci se neodesílají.- Pro operace "proces" a "ProcessSession" obdržíte také
IsEnabled(<OperationName>, string entity, Activity activity)zpětné volání. Slouží k filtrování událostí na základěactivity.Idvlastností značek nebo.
- Pro operace "proces" a "ProcessSession" obdržíte také
IsEnabled(<OperationName>.Start)napříkladIsEnabled("ServiceBusSender.Send.Start"). Kontroluje, zda by měla být aktivována událost Start. Výsledek má vliv pouze na událost Start, ale další instrumentace na ní není závislá.
IsEnabledPro událost zastavení není k dispozici.
Pokud je výsledkem nějaké operace výjimka, IsEnabled("ServiceBusSender.Send.Exception") je volána metoda. Přihlásili jste se k odběru událostí Exception a zabráníte zbytek instrumentace. V takovém případě je stále nutné tyto výjimky zpracovat. Vzhledem k tomu, že je jiná instrumentace zakázaná, neměli byste očekávat, že by kontext trasování byl tok se zprávami od spotřebitelů k producentovi.
Můžete použít IsEnabled také implementaci strategií vzorkování. Vzorkování založené na Activity.Id nebo Activity.RootId zaručuje konzistentní vzorkování napříč všemi pneumatikami (Pokud je šířené systémem trasování nebo vlastním kódem).
V DiagnosticSource případě, že je pro stejný zdroj k dispozici více posluchačů, je pro přijetí události dostačující pouze jeden naslouchací proces, takže není IsEnabled zavolána žádná záruka.
Další kroky
- Korelace Application Insights
- Application Insights závislosti monitorů , abyste viděli, jestli REST, SQL nebo jiné externí prostředky zpomalují vaši práci.
- Sledování vlastních operací pomocí sady Application Insights .NET SDK