Aracılığıyla paylaş


.NET dağıtılmış izleme kavramları

Dağıtılmış izleme, mühendislerin uygulamalardaki hataları ve performans sorunlarını, özellikle de birden çok makineye veya işleme dağıtılabilir olanları yerelleştirmelerine yardımcı olan bir tanılama tekniğidir. Dağıtılmış izlemenin nerede yararlı olduğu hakkında genel bilgi için bkz. Dağıtılmış İzlemeye Genel Bakış.

İzlemeler ve Etkinlikler

Her yeni istek bir uygulama tarafından alındığında, bir izlemeyle ilişkilendirilebilir. .NET'te yazılan uygulama bileşenlerinde, bir izlemedeki iş birimleri System.Diagnostics.Activity örnekleriyle temsil edilir ve izleme bir bütün olarak bu Etkinliklerin bir ağacını oluşturur ve potansiyel olarak birçok farklı işlemde yer alır. Yeni bir istek için oluşturulan ilk Etkinlik, izleme ağacının kökünü oluşturur ve isteği işlemenin genel süresini ve başarısını/başarısızlığını izler. İsteğe bağlı olarak, işi ayrı ayrı izleyebileceğiniz farklı adımlara bölmek için alt etkinlikler oluşturulabilir. Örneğin, web sunucusunda belirli bir gelen HTTP isteğini izleyen bir Etkinlik verildiğinde, isteği tamamlamak için gerekli olan veritabanı sorgularının her birini izlemek için alt etkinlikler oluşturulabilir. Bu, her sorgu için süre ve başarının bağımsız olarak kaydedilmesini sağlar. Etkinlikler, OperationName, Tagsolarak adlandırılan ad-değer çiftleri ve Eventsgibi her çalışma birimi için başka bilgiler kaydedebilir. Ad, gerçekleştirilen işin türünü tanımlar, etiketler işin açıklayıcı parametrelerini kaydedebilir ve olaylar zaman damgalı tanılama iletilerini kaydetmek için basit bir günlük mekanizmasıdır.

Dikkat

Dağıtılmış izlemedeki iş birimleri için yaygın olarak kullanılan endüstri terimlerinden biri de 'Spans'tır. .NET, bu kavram için 'Span' adı iyi oluşturulmadan çok yıllar önce 'Etkinlik' terimini benimsemiştir.

Etkinlik Kimlikleri

Dağıtılmış izleme ağacındaki Etkinlikler arasındaki Parent-Child ilişkiler benzersiz kimlikler kullanılarak oluşturulur. . NET'in dağıtılmış izleme uygulaması iki kimlik düzenini destekler: W3C standart TraceContext. Bu .NET 5+ dilinde varsayılandır ve geriye dönük uyumluluk için kullanılabilen 'Hiyerarşik' adlı eski bir .NET kuralıdır. Activity.DefaultIdFormat hangi kimlik düzeninin kullanılacağını denetler. W3C TraceContext standardında, her izlemeye genel olarak benzersiz bir 16 baytlık trace-id (Activity.TraceId) atanır ve izleme içindeki her Etkinliğe benzersiz bir 8 baytlık span-id (Activity.SpanId) atanır. Her etkinlik trace-id'yi, kendi span-id'sini ve üst öğesinin span-id'sini (Activity.ParentSpanId) kaydeder. Dağıtılmış izlemeler sürecin sınırları boyunca çalışmayı izleyebildiğinden, üst ve alt etkinlikler aynı işlemde olmayabilir. Trace-id ve üst span-id birleşimi, hangi işlemde bulunduğundan bağımsız olarak üst Etkinliği genel olarak benzersiz olarak tanımlayabilir.

Activity.DefaultIdFormat, yeni izlemeleri başlatmak için hangi kimlik biçiminin kullanılacağını denetler, ancak varsayılan olarak var olan bir izlemeye yeni bir Etkinlik eklemek üst Etkinliğin kullandığı biçimi kullanır. Activity.ForceDefaultIdFormat'ın true olarak ayarlanması, bu davranışı geçersiz kılar ve üst öğe farklı bir kimlik biçimi kullansa bile, tüm yeni Etkinlikleri DefaultIdFormat ile oluşturur.

Etkinlikleri başlatma ve durdurma

bir işlemdeki her iş parçacığının, Activity.Currentaracılığıyla erişilebilen, bu iş parçacığında gerçekleşen işi izleyen karşılık gelen bir Activity nesnesi olabilir. Geçerli etkinlik, bir iş parçacığındaki tüm zaman uyumlu çağrılar boyunca otomatik olarak akışa geçer ve farklı iş parçacıklarında işlenen asenkron çağrıları takip eder. Etkinlik A bir iş parçacığındaki geçerli etkinlikse ve kod yeni bir Etkinlik B başlatırsa, B bu iş parçacığındaki yeni geçerli etkinlik olur. Varsayılan olarak, B etkinliği de Etkinlik A'yı üst öğe olarak ele alır. Etkinlik B daha sonra durdurulduğunda, iş parçacığındaki şu anki Etkinlik olarak Etkinlik A geri yüklenir. Bir Etkinlik başlatıldığında geçerli saati Activity.StartTimeUtcolarak yakalar. Durduğunda, geçerli saat ile başlangıç saati arasındaki fark olarak Activity.Duration hesaplanır.

İşlem sınırları arasında eşgüdüm

İşlem sınırları arasında çalışmayı izlemek için, alıcı işlemin bunlara başvuran Etkinlikler oluşturabilmesi amacıyla Etkinlik ebeveyn kimliklerinin ağ üzerinden iletilmesi gerekir. W3C TraceContext Kimliği biçimini kullanırken, .NET, bu bilgileri iletmek için standart tarafından önerilen HTTP üst bilgilerini de kullanır. .NET, Hierarchical kimliği biçimini kullanırken kimliği iletmek için özel bir istek kimliği HTTP üst bilgisi kullanır. Diğer birçok dil çalışma zamanının aksine, ASP.NET web sunucusu ve System.Net.Http gibi .NET yerleşik kitaplıkları, HTTP iletilerinde Etkinlik Kimliklerinin kodunu çözmeyi ve kodlamayı yerel olarak anlar. Çalışma zamanı ayrıca senkron ve asenkron çağrılar sırasında kimliğin akışını nasıl yönetileceğini de anlar. Bu, HTTP iletileri alan ve yayan .NET uygulamalarının, uygulama geliştiricisi veya üçüncü taraf kitaplık bağımlılıkları tarafından özel kodlama yapılmadan otomatik olarak akan dağıtılmış izleme kimliklerine katıldığı anlamına gelir. Üçüncü taraf kitaplıkları, KIMLIKleri HTTP olmayan ileti protokolleri üzerinden iletmek veya HTTP için özel kodlama kurallarını desteklemek için destek ekleyebilir.

İzleri toplama

İzlenen kod, dağıtılmış izlemenin bir parçası olarak Activity nesneler oluşturabilir, ancak bu nesnelerdeki bilgilerin merkezi bir kalıcı depoda iletilip serileştirilmesi ve böylece izlemenin tamamının daha sonra yararlı bir şekilde gözden geçirilebilmesi gerekir. Application Insights, OpenTelemetryveya üçüncü taraf telemetri veya APM satıcısı tarafından sağlanan kitaplık gibi bu görevi gerçekleştirebilen birkaç telemetri koleksiyonu kitaplığı vardır. Alternatif olarak, geliştiriciler System.Diagnostics.ActivityListener veya System.Diagnostics.DiagnosticListenerkullanarak kendi özel Etkinlik telemetri koleksiyonlarını yazabilir. ActivityListener, geliştiricinin bu konuda önceden bilgi sahibi olup olmadığından bağımsız olarak herhangi bir Etkinliği gözlemlemektedir. Bu, ActivityListener'ı basit ve esnek bir genel amaçlı çözüm yapar. Buna karşılık, DiagnosticListener kullanmak, enstrümanlanan kodun DiagnosticSource.StartActivity çağrısını yaparak onay vermesini gerektiren daha karmaşık bir senaryodur ve koleksiyon kütüphanesinin, enstrümanlanan kodun başlatma sırasında kullandığı tam adlandırma bilgilerini bilmesi gerekir. DiagnosticSource ve DiagnosticListener'ın kullanılması, oluşturucunun ve dinleyicinin rastgele .NET nesnelerini değiştirmesine ve özelleştirilmiş bilgi geçirme kuralları oluşturmasına olanak tanır.

Örnekleme

Yüksek aktarım hızı uygulamalarındaki gelişmiş performans için.NET'te dağıtılmış izleme, izlemelerin tümünü kaydetmek yerine yalnızca bir alt kümesini örneklemeyi destekler. Önerilen ActivitySource.StartActivity API'siyle oluşturulan etkinlikler için telemetri koleksiyonu kitaplıkları ActivityListener.Sample geri çağırma ile örneklemeyi denetleyebilir. Günlük kitaplığı, Olayı hiç oluşturmamayı, izleme kimliklerini dağıtmak için gereken en az bilgiyle oluşturmayı veya onu tam tanılama bilgileriyle doldurmayı seçebilir. Bu seçenekler, tanılama yardımcı programını artırmak için artan performans ek yükünü dengeler. Activity.Activity ve DiagnosticSource.StartActivity'i çağırmanın eski deseni kullanılarak başlatılan etkinlikler, ilk olarak DiagnosticSource.IsEnabled'yi çağırarak DiagnosticListener örneklemesini de destekleyebilir. Tam tanılama bilgilerini yakalarken bile .NET uygulaması hızlı olacak şekilde tasarlanmıştır; verimli bir toplayıcıyla birlikte, modern donanım üzerinde yaklaşık bir mikrosaniyede etkinlik oluşturulabilir, doldurulabilir ve iletilebilir. Örnekleme, kaydedilmemiş her etkinlik için izleme maliyetini 100 nanosaniyenin altına düşürebilir.

Sonraki adımlar

.NET uygulamalarında dağıtılmış izleme kullanmaya başlamak için örnek kodlara bakmak üzere Dağıtılmış İzleme Araçlarıbölümüne bakın.

.NET tarafından yerel olarak yayılan etkinliklerin listesi için bkz. .NETYerleşik etkinlikler.