Web Servislerinde Metrik Takibi
Merhabalar, bu makalede Web Servisleri üzerinde metrik takibini Prometheus ve Grafana kullanarak nasıl gerçekleştireceğimizi anlatmaya çalışacağım.
Production ortamında çalışan web servislerimizi runtime’da, anlamlı grafikler ve verilerle takip etme ihtiyacımız olabilmekte. En temel olarak, web servisimize gelen istek değişimi, isteklerin response süreleri ve hatta web servisin bulunduğu sunucunun bellek kullanımı gibi verilere ulaşmamız gerekebiliyor. Bu veriler için, arayüz üzerinden veya çeşitli bildirimlerle takip edilip aksiyon alınması gereken durumlar oluşuyor. İşte bu noktada, konuyla ilgili alternatif teknolojiler olan Prometheus ve Grafana devreye giriyor.
Prometheus
Prometheus, bir Open-Source Monitoring uygulamasıdır. Servis içerisinde ayarlanmış Metric’ler üzerinde kayıtlar oluşturur. Bu kayıtları görüntülemeyi sağlayan hem arayüzü hemde “text” formatında sonuç dönen bir endpoint’i mevcuttur. Bir çok popüler platformla kullanılabilir. Go, Java, C#, Python, Ruby, C, C++, Node.JS, PHP…
Grafana
Grafana, alternatif uygulamalardan toplanmış olan metric, kayıt ve logların görüntülenmesini sağlamaktadır. Kendi arayüzü üzerinden ayarlamalar ve görüntülemeler yapabilmekteyiz. Arayüzü, bir web uygulaması şeklinde çalışmakta ve kullanıcı yönetiminden yetkilendirmeye kadar birçok özelliği bulunmaktadır. Arayüz içerisinde birden fazla dashboard oluşturulabilir ve bu dashboard’larda, belirlenmiş metric’lerin grafikleri gösterilebilir. Grafana sadece Prometheus ile çalışmamakta, bir çok popüler teknolojiyle entegre olabilmektedir. Bunlardan bazıları; Microsoft SQL Server, PostgreSQL, MongoDb, MySQL, Oracle, Elasticsearch, Azure Monitor, Google Cloude Monitoring… Grafana üzeriden sadece görüntüleme değil uyarı mekanizmasınıda kullanabilmekteyiz. Takip ettiğimiz metric’ler üzerinde belirttiğimiz kurallara göre uyarılar oluşturtabiliriz. Bu uyarıları birden fazla kanalla istediğimiz adrese ulaştırabiliriz. Bu kanallardan bazıları; Email, webhook, DingDing, Microsoft Teams, Discord, Kafka REST Proxy, Slack Telegram…
Uygulama
Bu teknolojileri kullanarak en temel haliyle bir örnek uygulama geliştirelim. Web servis olarak .NET 5.0 ile WebApi oluşturarak ilerleyeceğim.
- Prometheus Kurulumu
Aşağıdaki link üzerinden sisteminize uygun olan paketi indirip, indirilen zip dosyasını bir klasöre çıkartın.
Çıkardıktan sonra “prometheus.exe”yi açın ve Prometheus artık metric dinleme pozisyonunda çalışmış olacaktır. İlerleyen bölümlerde “prometheus.yml” içerisinde konfigürasyon yapmamız gerekecek.
- Grafana Kurulumu
Aşağıdaki link üzerinden sisteminize uygun olan paketi bulup indirdin.
Kurulum işlemi bittikten sonra, tarayıcınızda http://localhost:3000/ adresine giderek Grafana arayüzüne ulaşabilirsiniz. Varsayılan kullanıcı adı ve şifre bilgisi “admin” şeklindedir. Makalenin ilerleyen kısımlarında Grafana ve Prometheus’u nasıl birbiriyle haberleştireceğimizden bahsedeceğim.
- Web Servis Oluşturulması
Bu işlemden önce eğer sisteminizde .NET 5.0 yüklü değilse aşağıdaki adresten indirip kurabilirsiniz.
(Makale içeriği .NET Core 3.1 ve üstü için de geçerlidir.)
Boş bir klasör oluşturup komut satırı(cmd) ile bu klasöre gidip aşağıdaki komutu uygulayalım.
Daha sonra “prometheus-net.AspNetCore” kütüphanesini projemize ekleyelim. Bunun için yine projenin bulunduğu dizinde komut satırı yardımıyla aşağıdaki komutu çalıştıralım.
Proje oluşturulduktan sonra istediğiniz bir IDE ile açabilirsiniz.
Prometheus Konfigürasyonları
İlk olarak, web servisin url’ini Prometheus config dosyası içerisinde tanımlayalım. Prometheus’u kurduğumuz dizindeki “prometheus.yml” dosyasını açıp aşağıdaki gibi güncelleyelim.
Web servisin url tanımını “targets” içerisinde yaptık.
Web servis içerisinde kurmuş olduğumuz “prometheus-net.AspNetCore” kütüphanesi, metriclerin takibi için varsayılan olarak bir endpoint üretiyor. Bu endpointin adresi “/metrics” şeklinde ve bunuda konfigürasyon dosyasında “metrics_path” içerisinde tanımlıyoruz.
Aynı zamanda, “localhost:5001” adresi https ile çalışacağından https tanımını “scheme” içerisinde yapıyoruz.
Bu işlemleri yaptıktan sonra “prometheus.exe”yi çalıştıralım ve metricleri dinler durumda çalışmaya başlasın.
WebApi Prometheus Kullanımı
Web servis içerisinde “startup.cs” dosyasında, “ConfigureServices” fonksiyonu altına aşağıdaki eklemeleri yapalım.
Artık projeyi çalıştırıp “/metrics” endpointine ulaşabilmemiz gerekmektedir.
Metrics endpointi çalıştı ve “UseHttpMetrics()” ile gelen default metriclerde listelendi. Prometheus kütüphanesi, web servis uygulaması içerisinde başarılı bir şekilde çalışmış oldu.
WebApi Metric Tanımı
Prometheus içerisinde yapılabilecek 4 farklı metric tanımı bulunmakta.
- Counter
Değeri yalnızca yeniden başlatıldığında artırılabilen veya sıfırlanabilen tek bir monoton olarak artan sayacı temsil eden kümülatif bir metriktir. - Gauge
Dinamik olarak yukarı ve aşağı gidebilen tek bir sayısal değeri temsil eden bir metriktir. Örnek olarak kur bilgisini bu metric ile kullanarak artış ve azalışları takip edilebilir. - Histogram
Bir histogram gözlemleri (genellikle istek süreleri veya yanıt boyutları gibi şeyler) örnekler ve yapılandırılabilir paketlerde sayar. Ayrıca, gözlemlenen tüm değerlerin bir toplamını sağlar. Takip etmek istediğiniz bir işlemi, histogram kullanarak gruplamalar halinde takip edebilirsiniz. Örneğin kur artışını bir liste olarak düşünürsek USD, EUR vb. kurları histogram altında listeli şekilde takip edebilirsiniz. - Summary
Histograma benzer şekilde, özet gözlemleri görüntüler.
Biz bunlardan “Counter”a örnek olacak şekilde örneğimizi yapacağız.
Web servise gelen isteklerin sayısını tutan bir metric tanımlayalım. Bunun için “startup.cs” içerisinde request’leri yakalayacağımız bir middleware oluşturalım.
Yukarıdaki işlemde;
- Metrics class’ı altında CreateCounter() fonksiyonunu kullanarak bir sayaç metriği oluşturduk. Bunu oluştururken parametre olarak “name”, “help” ve konfigürasyon ayarlarını gönderdik. Konfigürasyon olarak “LabelNames” vererek, belirttiğimiz “scheme, method, path” değerlerine göre grup şeklinde sayaç yapılmasını sağladık. Çıktısını örnekte görmüş olacağız.
- app.Use() ile middleware oluşturmuş olduk. Bu middleware her gelen istekte çalışacaktır.
- Middleware içerisinde counter’ımızı Inc() fonksiyonuyla arttırdık. Bunu yaparken WithLabels() ile daha önce belirlemiş olduğumuz label değerlerini parametre olarak vermiş olduk. Bu sayede her gelen isteğin “scheme”, “method”, “path” değerlerine göre sayaç arttırılmış olacak.
- Gelen isteğin arasına girip yapmak istediğimiz işlemi gerçekleştirdikten sonra “return next();” ile isteğin devam etmesini sağlamış olduk.
Artık uygulamayı çalıştırıp istek yaparak test edelim.
İstek yapmak için tarayıcı üzerinden de gidilebilir veya Postman üzerinden de istek yapabilirsiniz.
Şuanki web servis için istek yapacağımız url: https://localhost:5001/weatherforecast
İstek gerçekleşti. Şimdi “/metrics” üzerinden counter’ın çalışıp çalışmadığını kontrol edelim. Bunun için https://localhost:5001/metrics adresine gidiyoruz.
Counter çalışmış ve belirlediğimiz format çerçevesinde değerleri arttırmış. Bunu prometheus arayüzünden inceleyelim. Bunun için http://localhost:9090 adresini açıyoruz.
Açılan arayüz içerisinde “Expression” kısmına metric adını yazıyoruz ve execute butonu ile çalıştırıyoruz.
Görüldüğü üzere metric değerlerimiz listelenmiş oldu. “Graph” sekmesine geçerek bunu grafik üzerinde gösterebiliriz.
Metric’lerimiz prometheus ile başarılı bir şekilde çalıştı. Artık devreye Grafana’yı alalım ve dashboard oluşturup grafiklerimizi görüntüleyelim.
http://localhost:3030 adresine giderek kullanıcı adı ve şifre bilgilerini “admin” olarak girip giriş yapıyoruz. Soldaki menüden “Configuration>Data Sources” içerisine girerek prometheus kaynağını ekleyeceğiz.
Data Sources ekranına girdikten sonra “Add data source” butonuna tıklayarak gelen ekrandan “Prometheus” seçelim.
Name ve URL alanlarını doldurum kaydedelim. Veri kaynağımızı “Prometheus” olarak ayarladık ve bundan sonra, Grafana Prometheus üzerinden oluşan metric’leri sürekli olarak dinleyerek arayüz üzerinden bize sunacak. Bunun için bir dashboard oluşturalım. Menüden “+” menüsüne tıklayarak “Dashboard”ı seçelim.
“Add an empty panel” tıklayarak eklemek istediğimiz metric ayarını yapalım.
Aşağıdaki ekrandan dilediğiniz konfigürasyon ayarını yapabilirsiniz. Burada önemli nokta Kırmızı ile işaretlenmiş alana, görüntülenmesini istediğiniz metric adını vermelisiniz. Bu uygulama için “webApi_request_counter” değerini giriyorum.
Ayarlarımızı yaptıktan sonra Apply butonu ile kaydediyoruz.
Ve dashboard oluşmuş oldu. İşaretli buton ile kaydedilmesi gerekmekte.
Bu şekilde Grafana ve Prometheus’u birbirine bağlayarak arayüz işlemini gerçekleştirmiş olduk.
Peki Grafana sadece bu işe mi yarıyor? Hayır. Grafana üzerinden kullanıcılar ve yetkilendirmeler yaparak, web servisleri için hangi metricleri hangi kullanıcının görüntüleyeceği ayarlarını yapabilirsiniz. Ayrıca metricler üzerinden alarm mekanizması oluşturabilirsiniz.
Alarm mekanizması kurulmasıyla ilgili örneğe aşağıdaki makaleden ulaşabilirsiniz.
Prometheus ve Grafana ile Web Servisleri üzerinde Metric takibinin nasıl yapılacağıyla ilgili temel seviyede bir anlatım yapmaya çalıştım. Bu metric takibini kendi senaryolarınıza göre çeşitlendirebilir ve değiştirebilirsiniz. Ayrıca bu projenin kaynak kodlarına GitHub hesabımdan, aşağıdaki linkten ulaşabilirsiniz. Okuduğunuz için teşekkürlerimi sunar, faydalı olmasını dilerim.
Kaynaklar