Elastic APM ile Uygulama Performans Takibi
Mikroservis mimarisinin yaygınlaşması ile birlikte API Management konusu önemli bir konuma geldi. Özellikle bounded context sayısı çok olan mimarilerde performans takibi kritik rol oynamaktadır. Uygulamalarda oluşabilecek sorunları izlemeyi kolaylaştıran ve sorunların temel nedenlerini bulmada fikir edinebileceğimiz açık kaynaklı bir araç olan Elastic APM hakkında bu yazıda bazı bilgiler paylaşacağım.
Elastic APM’in birçok yazılım dili desteği olması birçok yazılım ekibinin kullanması açısından önemli bir avantaj. Java, .NET, Node.js, Go, Django, Flask, Rails, Rack, RUM – JS gibi dil ve kütüphanelerde Elastic APM’i kolayca kullanabiliyoruz.
Bu yazıda Docker ile hazırlanmış bir paket aracılığıyla .NET Core ortamında hazırlanmış bir örnek üzerinden Elastic APM’in kurulmasına ve basit şekilde uygulama performans metriklerine nasıl ulaşacağımıza göz atacağız. Uygulamaya geçmeden önce Elastic APM’in bazı bileşenleriyle ilgili birkaç bilgi paylaşayım:
- Uygulama tarafında performans metriklerini toplamayı sağlayan APM Agent,
- Agent tarafından gönderilen datayı işleyen APM Server,
- Büyük veriler üzerinde sorgulama, içerik arama, veri analizi gibi işlemlerde daha çok performanstan dolayı tercih edilen bir search engine olan Elasticsearch,
- Elasticsearch için açık kaynaklı bir veri görselleştirme panosu olan Kibana ana işleyeşimizi oluşturacak.
Docker ile Elastic Stack ve APM Kurulumu
elastic.co sitesi üzerinden ulaşabileceğiniz quick start için hazırlanmış ayar bilgilerini docker-compose.yml dosyasına ekliyoruz. Ardından ilgili dizine girip aşağıdaki komutu çalıştıralım.
> docker-compose up
Elastic/ Kibana/ APM Server aşağıdaki şekilde docker üzerinde ayağa kalkacaktır.
URL
- Elastic : http://localhost:9200/
- Kibana APM UI : http://localhost:5601/app/apm
- APM Server : http://localhost:8200/
APM Agent Oluşturma
Performans metriklerini toplamak için bir APM agent oluşturmamız gerekiyor. APMExampleAPI adında bir .Net Core 3.1 API projesi oluşturuyoruz. Agent’ı uygulamamıza entegre edebilmek için bir Elastic kütüphanesi kullanacağız. Elastic.Apm.NetCoreAll kütüphanesini Nuget paketlerinden bulup yüklüyoruz.
Sonraki aşamada appsettings.json dosyasında APM için gerekli configuration işlemlerini ekleyelim.
Log Level Elastic.APM
.Net Core’ da internal APM logger için LogLevel değerini Elastic.Apm ile vermemiz gerekiyor.
SecretToken
APM sunucusunda istekleri yetkilendirmek için konulabilir. Bu örnekte kullanmadığımız için yukarıdaki şekilde tanımlama yaptık.
ServerUrls
Kurduğumuz APM Server localhost:8200 üzerinde çalıştığı için URL olarak 8200 veriyoruz. Bunu farklı ortamlara taşırsanız URL kısmını değiştirmeniz gerekiyor. Birden fazla APM Server kullanacaksanız url bilgilerini “,” ile ayırarak yazabilirsiniz. Örnek: “http://localhost:8200,http://localhost:8201″
ServiceName
Bu alan Kibana APM UI içerisinde agent ismi olarak görülecek o yüzden API ile ilgili anlamlı bir isim yazılması gerekiyor.
appsettings.json dosyasındaki düzenlemeleri tamamladıktan sonra uygulama ayağa kalktığında APM agent’ı register etmemiz gerekecek. Bu işleri de Startup.cs dosyasında yapacağız. appsettings.json dosyasında ayarladığımız configler ile birlikte agent’ı register etmesi için Elastic.Apm.NetCoreAll kütüphanesinde bulunan UseAllElasticApm fonksiyonunu kullanacağız.
API Call
Başlangıçta Kibana APM üzerinde herhangi bir service bulunmuyor, uygulamamıza entegre edilen agent API çağrımı sırasında otomatik servis oluşturmayı kendi sağlıyor. Uygulamayla gelen default controller’ı çalıştırıp APM’de kayıt oluşmasını test edelim.
Kibana APM UI
Kibana APM arayüzüne ait URL’yi tarayıcımızdan çalıştırarak performansla ilgili bilgilere ulaşabiliriz. Aşağıdaki resimde giriş ekranı yer alıyor. Development ortamında çalıştığımız için environment development olarak görülüyor. Bu servisler QA, PreProd, Prod gibi farklı environmentlar için de eklenebilir. .Net Core ile API yazdığımız için agent dotnet olarak set edilmiş. Ortalama response time, dakikadaki transaction sayısı gibi özet bilgileri bu sayfada görüntüleyebiliyoruz.
Kayıtlı olan bir servisin detaylarına girince API endpointlerine yapılan tüm requestleri listeleyebiliyoruz. Grafik arayüzü sayesinde anlaşılır metriklerle monitör edebiliyoruz. Transactionları, hangi endpointe request atıldığını, ortalama response time gibi bilgilerin tümünü buradan kontrol edebiliyoruz. Error ve Success call ayrımını net bir şekilde görebiliyoruz.
Transactionların içerisine girdiğimizde ilgili transaction’a ait daha çok detay bilgiyi inceleme şansımız oluyor. Aşağıda Success response almış örnek bir API çağrısı bulunuyor.
Ayrıca aşağıda Error response almış örnek bir API çağrısı bulunuyor. Yapılan çağrı sırasında; çağrı yapan Client IP, Host IP, OS, request method gibi ayrıntılı bilgileri de inceleyebiliyoruz.
Hazır bir docker file üzerinden .NET Core projesi için Elastic APM’in nasıl kurulup uygulamaya register edilebileceğini ve arayüzlerden de performans detaylarına nasıl göz atılacağını bir örnekle görmüş olduk. Örnekteki docker file ve uygulamaya GitHub hesabım üzerinden erişebilir, daha fazla ayrıntı için aşağıdaki kaynakları inceleyebilirsiniz.
Kaynakça
https://www.elastic.co/apm
https://www.elastic.co/guide/en/apm/agent/dotnet/current/setup.html
https://www.elastic.co/guide/en/apm/agent/dotnet/current/configuration-on-asp-net-core.html
https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-docker.html
https://www.elastic.co/guide/en/apm/server/current/running-on-docker.html