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:

İ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.

Application Insights günlüğünde uzun süre

İ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 yolu
  • peer.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.
  • componentservicebus

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:

  1. 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ürse false , 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ın activity.Id .
  2. 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