Gökhan Gökalp

Loglama Yapılarında Correlation ID ile Traceability’i Sağlamak

Loglama Yapılarında Correlation ID ile Traceability’i Sağlamak

Merhaba arkadaşlar.

Bu makale konusunda sizlerle uygulamalarımızda Correlation ID aracılığı ile consistent bir şekilde nasıl loglama işlemlerini gerçekleştirebiliriz konusunu ele almaya çalışacağım.

blog-arrows

Çoğu zaman geliştirmekte olduğumuz uygulamalarda, background da neyin olup bittiğini anlayabilmek için genelde çeşitli loglama işlemlerini gerçekleştiririz. Özellikle büyümekte ve büyük çapta olan projelerde monolithic architecture’ların yerine distributed architecture’ların tercih edilmesiyle beraber, sağlamış olduğu bir çok faydanın yanında business process yönetimi ve consistency gibi bazı sorunları da beraberinde getirmektedir.

Senaryo

payment-logging-flow

Yukarıda ki gibi bir örnekle açıklamak gerekirse eğer: Örneğin X request’i ilgili business işlemini gerçekleştirebilmesi için, -n tane service ile çalışması gerekmektedir. Gerçekleştirecek olduğu bu service call’lar sonucunda ise, oluşturacağı bir result bulunmaktadır. Peki, bu service call’ları sırasında herhangi bir noktada kopma yaşanırsa? Hangi log, hangi request de gerçekleşti? İşte bu gibi problemlerde Correlation ID yaklaşımı kullanılmaktadır.

Yaklaşım

payment-logging-with-correlation-id-flow

Service’ler arasında her bir request için unique identifier görevini görecek olan bir Correlation ID gezdirilir. Bu sayede hangi request hangi koşullarda ve nasıl hata alındığının log’larını takip edebilmek, oldukça kolaylaşacaktır.

Distributed yaklaşımların dışında bazı durumlarda ise uygulamalarımızda ki bottleneck’leri ortaya koyabilmek için farklı senaryolarda test case’leri ve log işlemleri gerçekleştiririz. Örneğin X request’i, ilgili result set’i oluşturabilmek için hangi business process’lerden geçiyor? hangi parametreler ile ilerliyor? nerede ne kadar vakit harcıyor? gibi soruları cevaplayabilmek için, loglama işlemini gerçekleştirirken Correlation ID çözümü ile ilerleyebiliriz. Bu sayede istediğimiz contextual bilgileri loglarken, Correlation ID ile de loglamadaki traceability’i arttırarak, bottleneck’leri hızlı bir şekilde ortaya koyabiliriz.

Loglama

Gerçekleştireceğimiz örnekte loglama için NLog kütüphanesini kullanacağım. Loglama yaparken herhangi bir aspect kütüphanesi kullanmayacağım. Sizler dilerseniz lisanslı olarak PostSharp veya open-source olarak Fody gibi kütüphaneler aracılığı ile intercept işlemlerini gerçekleştirerek loglamaları yapabilirsiniz.

“LogTraceWithCorrelationId” isminde yeni bir console application oluşturalım. İçerisine aşağıdaki resimde olduğu gibi NuGet üzerinden “NLog” ve “NLog.Config” kütüphanelerini kuralım.

nlog

Kütüphanelerin kurulumu ardından öncelikle “NLog.config” dosyasını aşağıdaki gibi düzenleyelim.

Bu config dosyası ile logların database’e kaydedilmesi gerektiğini, parameter’lar ilede “commandText” üzerindeki parametreleri set ediyoruz. “rules” kısmında ise “minlevel” parametresi ile “debug” boyutunda loglanmasını ve target olarak “database” target’ını kullanmasını söylüyoruz.

NLog başlıca aşağıdaki log level’larını desteklemektedir:

  • Trace: bu level genelde development sırasında detaylı olarak hight-volume bilgilere erişebilmek için kullanılmaktadır.
  • Debug: bu level’da production ortamında kullanılmaz ve Trace level’ından daha az bilgi içermektedir.
  • Info: genelde information bilgileri için kullanılır ve production ortamlarında da kullanılabilinir.

Bize örneğimizde debug level’ı yeterli olacaktır. Config dosyasının ayarlanması ardından yukarıdaki parametrelere denk gelecek olan SQL tablosunu da aşağıdaki script ile oluşturalım.

Tablo field’larına dikkat ettiyseniz “CorrelationId” field’ı dışındakiler, NLog’un sahip olduğu default field’lardır. Bu bölümde ise “CorrelationId” field’ını nasıl kullanabileceğimize bakacağız.

NLog’un 4.1 versiyonundan sonra “${activityid}” syntax’ı ile, log mesajlarını trace edebilmek için correlation id desteği getirilmiştir. Bundan önceki versiyonlarında ise bu tarz bir işlemler için custom olarak bir layout renderer yazmak gerekiyordu.

Not: NLog’un ${activityid} syntax’ı correlation id’yi “System.Diagnostics” namespace’i altında bulunan, “Trace.CorrelationManager.ActivityId” property’sinden okumaktadır.

Log kütüphanesi hazır olduğuna göre “Program.cs” i açalım ve aşağıdaki gibi kodlayalım.

Dikkat edersek iç içe sequentially olarak ilerkeyen 2 adet method bulunmakta. “Main” method’u içerisinde “System.Diagnostics.Trace.CorrelationManager.ActivityId” property’sine yeni bir guid set ediyoruz. Ardından ilk method olan “DoWork” method’unu call ediyoruz. Method’lar içerisinde ise “LogManager.GetCurrentClassLogger” method’u ile elde etmiş olduğumuz NLog instance’ı üzerinden, “Debug” method’unu kullanarak bir log mesajı atıyoruz. NLog bu işlemlerin ardından bu process bitene kadar set etmiş olduğumuz “ActivityId” yi, otomatik olarak loglar arasında taşıyacaktır. Bu sayede herhangi bir process/request için tüm akışı trace edebilmek kolay bir hale gelecektir.

Yukarıdaki console uygulamasını çalıştıralım ve çıktısına SQL Server Management Studio üzerinden bir bakalım.

logs

Gördüğümüz gibi atmış olduğumuz 2 adet “Debug” log’unu, CorrelationId’leri ile birlikte SQL üzerine insert etmiş durumdadır. Burada loglamak istediğiniz parametreleri, ilgili business value’larınıza göre sizler belirleyebilirsiniz.

Main method’unda set etmiş olduğumuz “ActivityId” yi, web ortamında ise handler’lar aracılığı ile “BeginRequest” event’larında request başına set edebilirsiniz.

Not: “CorrelationId” ye ek olarak, loglama tablosunda bulunan “MachineName” field’ını da, “TenantId” olarak kullanabilmek de mümkündür. Geliştirmekte olduğumuz uygulamaya göre scale amaçlı farklı host’lara dağıttığımızda, hangi hosttaki uygulamadan geldiğini de bu şekilde kolayca ayırt edebiliriz.

Her ne kadar basit bir konu gibi görünse de, birçok case’lerde oldukça fayda sağlamaktadır. Umarım faydalı bir yazı olmuştur. Örnek uygulamaya aşağıdan ulaşabilirsiniz.

Takipte kalın.

logtracewithcorrelationid

Bu makale toplam (682) kez okunmuştur.

11
0



2 thoughts on “Loglama Yapılarında Correlation ID ile Traceability’i Sağlamak

    1. Gökhan GökalpGökhan Gökalp Post author

      Merhaba, evet onunla da thread id’yi alabilirsiniz fakat, gerçekleştirmiş olduğunuz business flow’unda multithreading bir iş yapıyorsanız thread id’ler farklı olacağı için, flow’u correlate edemezsiniz. İyi günler dilerim.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*