Caner Tosuner

Leave your code better than you found it

Asp.Net Core ElasticSearch Logging ve Kibana Kurulumu & Kullanımı

Daha önceki yazılarda asp.net coreelasticsearchlogging konularına ayrı ayrı farklı örneklerle değinmiştik. Bu yazımızda ise asp.net core projelerinde default logging storage olarak elasticsearch konfigure edip bu elasticsearch'de ki index'lerde bulunan log kayıtlarını Kibana kullanarak nasıl görüntüleyebiliriz örnek proje ile anlatacağız. 

Logging bir uygulama için olmazsa olmazların başında gelmektedir. Uygulama cycle'ın da loglama işlemi doğru zamanda doğru yerde ve en önemlisi bir birine bağlı olacak şekilde yaptığınızda log sonucunda oluşan veri aslında sizin için paha biçilmez bir monitoring aracı olabilir. Analiz yapabilir, alert oluşturabilir, çeşitli raporlar sağlayabiliriz. Bütün bu saydıklarımız ve daha fazlası için çeşitli çözümler sunulabilir ancak şuan ki günümüz yazılım dünyasında ElasticSearch, Kibana with Logstach üçlüsü en performanslı ve open-source olduğundan community'si en sağlam çözüm olarak karşımıza çıkmakta.

Uygulama geçmeden önce bilgisayarınızda .Net Core SDK, ElasticSearch ve Kibana yüklü olmalı. Kurulumlarla ilgili detaylara .Net Core SDK ve ElasticSearch için aşağıdaki başlık altında bulunan yazılarımızdan ulaşabilirsiniz. Kibana kurulumunu ise bu yazımızda anlatacağız.

1) .Net Core Sdk 2.1 Kurulumu

.Net Core SDK 2.1 kurulumunu NET Core 2.0 to 2.1 Migration yazımızda anlatmıştık ve bu yazıda belirtilen instraction'ları takip ederek sdk kurulunu sağlayabilirsiniz.

2) ElasticSearch Kurulumu

ElastciSearch kullanabilmek için bu yazıda anlatıldığı gibi kurulum işlemlerini yapıp kurulumun doğru olup olmadığını test etmek adına browser üzerinden  http://localhost:9200/ adresine httpget isteği yaptığınızda kurulu olan es'ün bilgilerini görüntüleyebilirsiniz.

3) Kibana Kurulumu

Kibana kurulumu için elastic.co adresinde yer alan download sayfasından Kibana için ilgili işletim sisteminize ait dosyaları download edelim. Ben local'de windows kullandığım için Windows uyumlu versiyonu indirdim.

Download işlemi bittikten sonra rar'lı dosyaları ben C sürücüsünü seçtim extract edelim. Extract ettikten sonra C:\kibana-6.3.2\bin klasöründe bulunan kibana.bat dosyasını run edip kibanayı start etmesini bekleyelim. Dilerseniz Kibanayı işletim sistemine service olarak register'da edebilirsiniz.

Kibananın çalışıp çalışmadığından emin olmak için browser üzerinden http://localhost:5601 adresine giderek ulaşabilirsiniz. Elasticsearch'te index oluşturduktan sonra kibana'ya tekrar döneceğiz.

4) Asp.Net Core Api Proje Oluşturulması

Artık örnek projemizi geliştirmeye başlayalım. İlk olarak vs'da ProductApi adında bir Asp.net core 2.1 Web Api projesi oluşturalım.

Projeyi oluşturduktan sonra nuget'ten indirip kullanacağımız kütüphaneleri projemiz için kuralım. Uygulama loglarını atarken Serilog kütüphanesini ve onun ElasticSearch ve .net Core için olan extension dll'lerini projemize nuget üzerinden bulup ekleyelim.

Yukarıdaki paketlerin nuget üzerinden kurulum işlemleri tamamlandıktan sonra projede yer alan Startup.cs sınıfı içerisinde serilog ve elasticsearch için gerekli olan logging konfigurasyonlarını aşağıdaki gibi yapalım. İlk olarak ConfigureServices metodunda serilog ve serilog'un storage olarak elasticsearch'ü kullanacağını belirten kod bloğunu aşağıdaki gibi yazalım.

public void ConfigureServices(IServiceCollection services)
{
    Log.Logger = new LoggerConfiguration()
        .Enrich.FromLogContext()
        .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200/"))
        {
            AutoRegisterTemplate = true,
        })
        .CreateLogger();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

Sonrasında ise Configure metodunda yukarıda ilgili tanımlamalarını yaptığımız serilog'u LoggerFactory'e ekleyip uygulamanın serilog üzerinden logging yapacağını belirttiğimiz kısmı yazalım.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    loggerFactory.AddSerilog();//serilog servisini eklediğimiz yer

    app.UseMvc();
}

Kurulumlarımızı ve proje geliştirme adımlarını tamamladık artık projemizi run ederek örnek olarak bir ProductController açıp içerisinde bulunan Get metoduna ürün isimleri girmiştim browser üzerinden http://localhost:60506/api/product adresine httpGet isteği attığımızda aşağıdaki gibi ürün isimlerini listelediğini göreceğiz.

[Route("api/[controller]")]
[ApiController]
public class ProductController : ControllerBase
{
    // GET api/product
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new List<string> { "Mobile Phone", "Laptop", "Books", "Shoes" };
    }
}

Uygulamada minimum log level Information olduğundan hem uygulama start event'leri hemde end-point'e yaptığımız request-response'a ait log mesajlarını şuan elasticsearch'de logstash-yyy.MM.dd (logstash-2018.07.26 gibi.) formatında bir index oluşturup bu index'e günlük olarak insert etmiş bulunuyor. Bu index'in yaratılıp yaratılmadığını anlamak içinse yine browser üzerinden elasticsearch'ün api'sine istekte bulunarak öğrenebiliriz. Browser'dan http://localhost:9200/_cat/indices?v adesine httpGet isteği yolladığınızda yukarıda bahsettiğimiz formatta index'in oluştuğunu göreceksinizdir.

Şimdi ise son adım olarak index'lemiş olduğumuz bu logları Kibana üzerinde görüntüleyelim. http://localhost:5601 adresine gittiğimizde şuan için herhangi bir index tanımlaması yapmadığımızdan hiçbir şey görüntülenmemekte. Bunun için Kibana'da sol menüde yer alan Management sayfasına giderek Index Patterns ekranında Index pattern textbox'ına "logstash-*" yazarak Next dedikten sonra çıkan ekranda Time Filter'ı log hangi property'ye göre yapacağını belirttiğimiz dropdown'dan @timestamp field'ını seçip Create Index Pattern butonuna tıkladıktan sonra logstash- formatına uygun bütün indexleri Kibana'ya tanımlamış olduk.

 

Indexlemiş olduğumuz logları görüntüleyebilmek için yine sol menüden Discover sayfasına giderek zaman filtresine göre aşağıdaki gibi uygulamamıza ait logları görebiliriz. Dilersek search box'ı kullanarak log içersiinde aramak istediğimiz bir metni kolayca arayabilir yada uygulamanın throw ettiği exception'lar için dashboard'lar tanımlayıp daha metric'ler kullanarak kolayca görüntüleyebiliriz. 

 

Geleneksel logging tekniklerinde genelde erişilmesi ve anlaşılması zor içinde kaybolunabilen yapılar söz konusuydu. Öyle ki log dosyaları arasında aradığımız bir text'i bulmak bazen saatlerimizi bile alabilmekteydi. Ancak elasticsearch ve kibana bunu tamamiyle değiştirdi desek yanlış olmaz. Bu ikili ile birlikte uygulamanızın ürettiği günlük yüzlerce megabyte'lık log text'ini elasticsearch'e index'leyip çok rahat ve hızlı bir şekilde kibana üzerinden erişebilirsiniz. X pack kullanarak çeşitli alert yapıları tasarlayabilir uygulamanızla ilgili herhangi olağan dışı bir durumda en hızlı şekilde kolayca haberdar olabilirsiniz. 

Source Code

ElasticSearch Nedir ? Windows Üzerinde Kurulumu

Elasticsearch, java dilinde open-source olarak geliştirilen, dağıtık mimariye uygun, kolay ölçeklenebilir, enterprise düzeyde bir big-data arama motorudur. Sahip olduğu Http protokolü üzerinde çalışan Restful Api ile CRUD işlemlerini oldukça hızlı bir şekilde yapabilmemize olanak sağlar. 

ElasticSearch veya diğer search engine'lerin geliştirilmesine asıl sebep olan şey big-data dır. Her an her saniye milyonlarca satır veri üretiminden bahsediyoruz ve toplanmış olan bu verileri analiz etmek istediğimizde bu işlemi database seviyesinde yapıyorsak yani SQL'e bağımlıysak hız konusunda geride kalıyoruz. ElasticSearch core kısmında yer alan çeşitli algoritmalarıyla text-search işlemini oldukça kısa sürede hızlı bir şekilde yapabilmektedir.

Kurulum

Yukarıda bahsettiğimiz üzre elasticsearch Java tabanlı bir kütüphane olduğundan windows üzerinde kurulum yapmadan önce pc'nizde en az Java 8 versiyonu kurulu olmak şartıyla JRE ve JDK yüklü olmak zorundadır.

Elasticsearch elasticsearch.org adresinde ZIP and TAR.GZ gibi değişik formatlarda kurulum paketi sunmaktadır. Ancak ben temiz bir kurulum yapmanız adına MSI formatında olan paketi indirmeyi tercih edicem. İndirme işlemi bittiğinde exe'yi çalıştıralım ve bu adreste belirtildiği şekilde veya aşağıdaki görselde de olduğu gibi gerekli konfigurasyonları yaparak kurulumu tamamlayalım.

Kurulum sırasında path, memory-size gibi çeşitli konfigurasyonlar yapabilirsiniz. Eğer kurulumu Install as a service seçeneği ile yaptıysanız elasticsearch service olarak arka planda pc niz açık olduğu sürece çalışacaktır. Service'i görüntülemek için Windows Search kısmına "Services" yazdığınızda çıkan icon'a tıklayalım ve aşağıdaki gibi service listesinde elasticsearch'ü görelim.

Son olarak ES'ün çalışıp çalışmadığını browser üzerinden de kontrol edebiliriz. Browser'ın adres kısmına http://localhost:9200/ yazarak aşağıdaki gibi mevcut pc'niz de kurulu olan ES ile ilgili bilgilere ulaşabilirsiniz.

{
  "name" : "DESKTOP-GRKHT7E",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "saiTqKiQRr6m_GQ03BCH0Q",
  "version" : {
    "number" : "5.5.0",
    "build_hash" : "260387d",
    "build_date" : "2017-06-30T23:16:05.735Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

Mimarisi

Elasticsearch'ü database üzerinden anlamaya çalışacak olursak;

SQL de bulunan Database ES'de Index'e denk gelmektedir. Tablo ise Tip yani ES'e Index yaparken vereceğimiz modellerimize denk gelmektedir. Tabloya kaydettiğimiz her bir row ise ES de Document olarak adlandırılır. Tabloda bulunan Column'lar Field yani Tip olarak verdiğimiz model de bulunan property veya field'lar dır. Schema ise Mapping olarak adlandırılır.

Aslında Code-First yaklaşımına aşina olan arkadaşlar yukarıdaki görsele baktıklarında ES'ünde bir nevi code-first mantığıyla çalıştığını görebilirler.

ES ile ilgili bu yazımızda sona geldik ancak bir sonraki yazımızda yapmış olduğumuz bu kurulum üzerinden bir .Net projesi geliştirerek ES Client'ların dan biri olan NEST'i kullanarak örnekler vermeye devam edeceğiz.