Service Bus mesajlaşma aracılığıyla dağıtılmış izleme ve bağıntı
Mikro hizmetler geliştirmenin yaygın sorunlarından biri, işleme dahil olan tüm hizmetler aracılığıyla bir istemciden işlem izleme yeteneğidir. Hata ayıklama, performans analizi, A/B testi ve diğer tipik tanılama senaryolarında yararlı olur. Bu sorunun bir parçası mantıksal iş parçalarını izlemektir. İleti işleme sonucu ve gecikme ve dış bağımlılık çağrılarını içerir. Diğer bir bölüm, işlem sınırlarının ötesinde bu tanılama olaylarının bağıntısı olur.
Bir üretici kuyruk aracılığıyla bir ileti gönderdiğinde, genellikle başka bir istemci veya hizmet tarafından başlatılan başka bir mantıksal işlem kapsamında gerçekleşir. Aynı işlem tüketici tarafından bir ileti aldıktan sonra devam eder. Hem üretici hem de tüketici (ve işlemi işleyen diğer hizmetler), işlem akışını ve sonucu izlemek için telemetri olaylarını kabul edin. Bu tür olayları ve izleme işlemini uçtan uca ilişkilendirmek için telemetri raporlayan her hizmetin her olayı bir izleme bağlamıyla damgasına sahip olması gerekir.
Microsoft Azure Service Bus mesajlaşması, üreticileri ve tüketicilerin bu tür izleme bağlamını iletmek için kullanması gereken yük özelliklerini tanımladı. Protokol, http bağıntı protokolünütemel alır.
| Özellik Adı | Description |
|---|---|
| Diagnostic-Id | Bir üreticinin bir dış çağrısının sıraya özgü tanıtıcısı. Http protokolündeki Istek kimliği , dikkat edilecek noktalar ve biçim için bkz. |
Service Bus .NET Client 'ı oto izleme
ServiceBusProcessor .Net Için Azure Messaging Service Bus Client sınıfı, izleme sistemleri veya istemci kodu parçası tarafından bağlanabilen izleme noktaları sağlar. Bu izleme, istemci tarafında Service Bus mesajlaşma hizmetine yapılan tüm çağrıların izlenmesini sağlar. İleti işleme (ileti işleyici düzeni) ProcessMessageAsync kullanılarak ServiceBusProcessor yapıldığında ileti işleme de işaretlenir.
Azure Application Insights izleme
Microsoft Application Insights , automagical isteği ve bağımlılık izleme dahil zengin performans izleme olanakları sağlar.
Proje türüne bağlı olarak Application Insights SDK 'Yı yüklemelisiniz:
- ASP.net -ınstall sürüm 2,5-beta2 veya üzeri
- ASP.NET Core -Version 2.2.0-Beta2 veya üstünü yükler. Bu bağlantılar SDK yükleme, kaynak oluşturma ve SDK 'Yı yapılandırma (gerekirse) hakkında ayrıntılar sağlar. Non-ASP.NET uygulamalar için, konsol uygulamaları Için Azure Application Insights makalesine başvurun.
İletileri işlemek için (ileti işleyici düzeni) kullanırsanız ProcessMessageAsync ServiceBusProcessor ileti işleme de işaretlenir. Hizmetiniz tarafından gerçekleştirilen tüm Service Bus çağrıları otomatik olarak izlenir ve diğer telemetri öğeleriyle bağıntılı. Aksi takdirde, el ile ileti işleme izleme için aşağıdaki örneğe bakın.
İleti işlemeyi izle
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");
}
}
}
Bu örnekte, her işlenen ileti için istek telemetrisi raporlanır, zaman damgası, süre ve sonuç (başarılı) vardır. Telemetride bir bağıntı özellikleri kümesi de vardır. İleti işleme sırasında bildirilen iç içe izlemeler ve özel durumlar, bunları ' alt öğeleri ' olarak temsil eden bağıntı özellikleriyle da damgalı RequestTelemetry .
İleti işleme sırasında desteklenen dış bileşenlere çağrılar yaparsanız, bunlar da otomatik olarak izlenir ve bağıntılı hale getiriyoruz. El ile izleme ve bağıntı için Application Insights .NET SDK ile özel Işlemleri izleme bölümüne bakın.
Application Insights SDK 'ya ek olarak herhangi bir dış kod çalıştırıyorsanız, Application Insights günlüklerini görüntülerken daha uzun süre görmeyi bekler.

İletiyi alırken bir gecikme olduğu anlamına gelmez. Bu senaryoda, ileti SDK koduna parametre olarak geçirildiğinden ileti zaten alındı. Uygulama öngörüleri günlüklerinde (işlem) ad etiketi, iletinin artık dış olay işleme kodunuz tarafından işlendiğini gösterir. Bu sorun Azure ile ilgili değildir. Bunun yerine, bu ölçümler, iletinin Service Bus zaten alındığını belirten dış kodunuzun verimliliğini ifade eder.
İzleme sistemi olmadan izleme
İzleme sisteminizin otomatik Service Bus çağrıları izlemeyi desteklememesi durumunda, bu tür desteği bir izleme sistemine veya uygulamanıza eklemeyi düşünüyorsunuz. Bu bölümde, Service Bus .NET istemcisi tarafından gönderilen tanılama olayları açıklanmaktadır.
Service Bus .NET Client, .NET izleme temelleri System. Diagnostics. Activity ve System. Diagnostics. diagnosticsourcekullanılarak işaretlendi.
Activity bir bildirim mekanizması iken bir izleme bağlamı işlevi görür DiagnosticSource .
DiagnosticSource olayları için bir dinleyici yoksa, izleme devre dışı, sıfır izleme maliyetlerini tutuyor. DiagnosticSource tüm denetimi dinleyiciye verir:
- dinleyici, hangi kaynak ve olayların dinleneceğini denetler
- dinleyici, olay hızını ve örneklemesi denetler
- olaylar, olay sırasında Ileti nesnesine erişip değiştirebilmeniz için tam bağlam sağlayan bir yük ile gönderilir
Uygulamayla devam etmeden önce Diagnosticsource Kullanıcı kılavuzuyla ilgili bilgi edinin.
Microsoft. Extension. günlükçü ile günlükleri yazan ASP.NET Core uygulamasındaki Service Bus olayları için bir dinleyici oluşturalım. DiagnosticSource 'a abone olmak için System. reak. Core kitaplığını kullanır (Ayrıca, diagnosticsource 'a bu olmadan abone olmak da kolaydır)
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();
});
}
Bu örnekte, dinleyici günlük süre, sonuç, benzersiz tanımlayıcı ve her Service Bus işlemi için başlangıç zamanı.
Ekinlikler
Tüm olaylar, açık telemetri belirtimiyle uyumlu olan aşağıdaki özelliklere sahip olacaktır: https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/api.md .
message_bus.destination– kuyruk/konu/abonelik yolupeer.address– tam nitelikli ad alanıkind– üretici, tüketici ya da istemci. Üretici, alma sırasında ileti, alırken tüketici ve istemci gönderirken kullanılır.component–servicebus
Tüm olaylar aynı zamanda ' Entity ' ve ' Endpoint ' özelliklerine sahiptir, bunlar aşağıdaki tabloda atlanır
string Entity--Varlığın adı (kuyruk, konu vb.)Uri Endpoint-Service Bus uç nokta URL 'SI
Belgelenmiş işlemler
Aşağıda, Araçlı işlemlerin tam listesi verilmiştir:
| İşlem adı | İzlenen API |
|---|---|
| ServiceBusSender. Send | ServiceBusSender. SendMessageAsync ServiceBusSender. SendMessagesAsync |
| ServiceBusSender. Schedule | ServiceBusSender. ScheduleMessageAsync ServiceBusSender. ScheduleMessagesAsync |
| ServiceBusSender. Cancel | ServiceBusSender. CancelScheduledMessageAsync ServiceBusSender. CancelScheduledMessagesAsync |
| Servicebusalıcısı. Receive | Servicebusalıcı. ReceiveMessageAsync Servicebusalıcı. ReceiveMessagesAsync |
| Servicebusalıcı. Receiveertelenmiş | Servicebusalıcı. ReceiveDeferredMessagesAsync |
| Servicebusalıcıyı. Peek | Servicebusalıcı. PeekMessageAsync Servicebusalıcı. PeekMessagesAsync |
| Servicebusalıcı. Abandon | Servicebusalıcı. terk Messagesasync |
| Servicebusahize. Tamam | Servicebusalıcı. CompleteMessagesAsync |
| Servicebusalıcının. sahipsiz mektup | Servicebusalıcı. DeadLetterMessagesAsync |
| Servicebusalıcıyı. erteleme | Servicebusalıcı. DeferMessagesAsync |
| Servicebusalıcı. RenewMessageLock | Servicebusalıcı. RenewMessageLockAsync |
| Servicebussessionalıcıyı. RenewSessionLock | Servicebussessionalıcıyı. RenewSessionLockAsync |
| Servicebussessionalıcıyı. GetSessionState | Servicebussessionalıcıyı. GetSessionStateAsync |
| Servicebussessionalıcıyı. SetSessionState | Servicebussessionalıcıyı. SetSessionStateAsync |
| ServiceBusProcessor. ProcessMessage | ServiceBusProcessor üzerinde işlemci geri araması ayarlandı. ProcessMessageAsync özelliği |
| ServiceBusSessionProcessor. ProcessSessionMessage | ServiceBusSessionProcessor üzerinde işlemci geri çağırma kümesi. ProcessMessageAsync özelliği |
Filtreleme ve örnekleme
Bazı durumlarda, performans yükünü veya depolama tüketimini azaltmak için olayların yalnızca bir kısmını günlüğe kaydetmek tercih edilir. Yalnızca ' Durdur ' olaylarını (önceki örnekte olduğu gibi) veya olayların örnek yüzdesini günlüğe yazabilirsiniz.
DiagnosticSource koşul ile elde etmenin yolunu sağlayın IsEnabled . Daha fazla bilgi için bkz. DiagnosticSource 'Ta bağlam tabanlı filtreleme.
IsEnabled , performans etkisini en aza indirmek için tek bir işlem için birden çok kez çağrılabilir.
IsEnabled Şu sırada çağrılır:
IsEnabled(<OperationName>, string entity, null)Örneğin,IsEnabled("ServiceBusSender.Send", "MyQueue1"). Sonunda ' Start ' veya ' Stop ' yok. Belirli işlemleri veya kuyrukları filtrelemek için bu uygulamayı kullanın. Geri çağırma yöntemi döndürürsefalse, işlem için olaylar gönderilmez.- ' Process ' ve ' ProcessSession ' işlemleri için
IsEnabled(<OperationName>, string entity, Activity activity)geri çağırma de alırsınız. Olayları ya da Etiketler özelliklerine göre filtrelemek için kullanınactivity.Id.
- ' Process ' ve ' ProcessSession ' işlemleri için
IsEnabled(<OperationName>.Start)Örneğin,IsEnabled("ServiceBusSender.Send.Start"). ' Start ' olayının tetiklenip tetiklenmeyeceğini denetler. Sonuç yalnızca ' Başlat ' olayını etkiler, ancak daha fazla izleme buna bağlı değildir.
IsEnabled' Durdur ' olayı yok.
Eğer bir işlem sonucu özel durum ise, IsEnabled("ServiceBusSender.Send.Exception") çağırılır. Yalnızca ' özel durum ' olaylarına abone olabilir ve izleme geri kalanını önleyebilirsiniz. Bu durumda, bu tür özel durumları yine de işlemeniz gerekir. Diğer izleme devre dışı bırakıldığından, izleme bağlamını tüketiciden üretici tarafından yapılan iletilerle akışa almanız gerekmez.
IsEnabledAyrıca, örnekleme stratejilerini de kullanabilirsiniz. Veya ' i temel alarak örnekleme Activity.Id Activity.RootId (izleme sistemine veya kendi kodunuz tarafından yayıldığı sürece).
Aynı kaynak için birden fazla dinleyici varsa DiagnosticSource , olayı kabul etmek için yalnızca bir dinleyicinin olması yeterlidir, bu nedenle çağrılan bir garanti yoktur IsEnabled .
Sonraki adımlar
- Application Insights bağıntı
- REST, SQL veya diğer dış kaynakların sizi yavaşlatıyor olup olmadığını görmek için Application Insights bağımlılıkları izleyin .
- .NET SDK Application Insights özel işlemleri izleme