.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

Bir uygulama tarafından her yeni istek alındığında, bir izlemeyle ilişkilendirilebilir. .NET'te yazılan uygulama bileşenlerinde, bir izlemedeki çalışma birimleri örnekleriyle System.Diagnostics.Activity 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, her çalışma birimi için , ve adlı TagsEventsad-değer çiftleri gibi OperationNamediğer bilgileri 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.

Not

Dağıtılmış izlemedeki iş birimleri için bir diğer yaygın endüstri adı da 'Spans'tır. .NET, bu kavram için 'Span' adı iyi oluşturulmadan önce yıllar önce 'Etkinlik' terimini benimsemiştir.

Etkinlik Kimlikleri

Dağıtılmış izleme ağacındaki Etkinlikler arasındaki Üst-Alt ilişkiler, benzersiz kimlikler kullanılarak oluşturulur. . NET'in dağıtılmış izleme uygulaması iki kimlik düzenini destekler: .NET 5+ dilinde varsayılan olan W3C standart TraceContext ve geriye dönük uyumluluk için kullanılabilen 'Hiyerarşik' adlı eski bir .NET kuralı. 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 ( atanırActivity.SpanId). Her Etkinlik trace-id, kendi span-id ve üst öğesininActivity.ParentSpanId () span-id'sini 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. true ayarı Activity.ForceDefaultIdFormat bu davranışı geçersiz kılar ve üst öğe farklı bir kimlik biçimi kullansa bile DefaultIdFormat ile tüm yeni Etkinlikleri oluşturur.

Etkinlikleri başlatma ve durdurma

Bir işlemdeki her iş parçacığı, üzerinden Activity.Currenterişilebilen, bu iş parçacığında gerçekleşen işi izleyen ilgili bir Activity nesnesine sahip olabilir. Geçerli etkinlik, bir iş parçacığındaki tüm zaman uyumlu çağrılar boyunca otomatik olarak akar ve farklı iş parçacıklarında işlenen zaman uyumsuz çağrıları izler. 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, A etkinliği iş parçacığındaki geçerli Etkinlik olarak geri yüklenir. Bir Etkinlik başlatıldığında geçerli saati olarak Activity.StartTimeUtcyakalar. Durduğunda, Activity.Duration geçerli saat ile başlangıç saati arasındaki fark olarak hesaplanır.

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

İşlem sınırları arasında çalışmayı izlemek için, alma işleminin bunlara başvuran Etkinlikler oluşturabilmesi için Etkinlik üst kimliklerinin ağ üzerinden iletilmesi gerekir. W3C TraceContext Id biçimini kullanırken.NET, bu bilgileri iletmek için standart tarafından önerilen HTTP üst bilgilerini de kullanır. Kimlik biçimini kullanırken.NET Hierarchical , kimliği iletmek için özel bir request-id 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 zaman uyumlu ve zaman uyumsuz çağrılar aracılığıyla kimliğin nasıl aktığını da 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.

İzlemeleri toplama

İzlenen kod, dağıtılmış izlemenin parçası olarak nesneler oluşturabilir Activity , ancak izlemenin tamamının daha sonra yararlı bir şekilde gözden geçirilebilmesi için bu nesnelerdeki bilgilerin merkezi bir kalıcı depoda iletilmesi ve serileştirilmesi gerekir. Uygulama Analizler, OpenTelemetry veya üçü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 veya System.Diagnostics.DiagnosticListenerkullanarak System.Diagnostics.ActivityListener 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'ın kullanılması, çağrılarak DiagnosticSource.StartActivity kabul edilmesi için izlemeli kodun kullanılmasını gerektiren daha karmaşık bir senaryodur ve koleksiyon kitaplığının, izlenen kodun başlatırken 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 ile oluşturulan etkinlikler için telemetri koleksiyonu kitaplıkları geri çağırma ile örneklemeyi ActivityListener.Sample denetleyebilir. Günlük kitaplığı Etkinliği hiç oluşturmamaya, izleme kimliklerini dağıtmak veya tam tanılama bilgileriyle doldurmak için gereken en az bilgiyle oluşturmayı seçebilir. Bu seçenekler, tanılama yardımcı programını artırmak için artan performans ek yükünü dengeler. Daha eski çağırma deseni kullanılarak başlatılan ve DiagnosticSource.StartActivity ilk çağrıyla Activity.ActivityDiagnosticSource.IsEnabledDiagnosticListener örneklemesini de destekleyebilecek etkinlikler. 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ış izlemeyi kullanmaya başlamaya yönelik kod için bkz . Dağıtılmış İzleme İzleme araçları.