Metriklerin Efendisi Prometheus! – Episode 2 – Monitoring

Oldukça sıcak bir hafta sonundan herkese selamlar. Yine biraz fırsat bulmuşken Prometheus ile ilgili makaleye kaldığım yerden devam etmek istiyorum. İlk bölümde uygulama ve genel konsept hakkında temel bilgiler paylaşmıştım. Ara ara konuyu dağıtıp Soundcloud Infrastructure’ın monolitik mimariden mikroservis mimarisine taşınırken ortaya çıkan dağıtık bir monitoring ihtiyacından da bahsetmiştim.

Bu bölümde, Prometheus‘u kullanarak bir Docker Host sunucunun metriklerini Collect ediyoruz. Grafana ile bu metrikleri görsel hale hazır duruma getiriyoruz. Aynı zamanda Docker Host‘umuz üzerinde bulunan Container sistemleri de monitör ederek onlara ait metrik durumlarını da kontrol ediyoruz. Bütün bu Monitoring altyapısını Container halinde çalışır halde getiriyoruz.

Öncelikle bu konuda deneyimlerinden yararlandığım Stefan Prodan‘dan, bireysel izni ile, ilgili makalesinden alıntılar yapacağım. Yine kendisine ait GitHub / dockprom reposu Prometheus’a hızlıca göz atmak isteyenler için harika bir repo. Hem makaleden yaptığım alıntılar hem de şahsi fikirlerimle yine uzunca ve doyurucu bir makale olacağa benziyor.

Prometheus’un tercih edilmesinin sebebi, ilk bölümde de bahsettiğimiz gibi, çok-boyutlu (Multi-Dimensional) metriklerle çalışabilmesi ve kolay kavranan bir sorgulama diline sahip olması. Görselleştirme ve Alerting işlemleri için aynı dilin kullanılması bütün monitöring görevlerini kolaylaştıran en büyük etken.  Prometheus, önceki bölümlerde de bahsettiğim Black-Box Monitoring‘e olanak sağlarken aynı zamanda White-Box monitoring ile de yapının içeriden de metriklerini Collect edebilir, görselleştirebilir.

Bir diğer tercih sebebi ise, bütün monitoring-stack yapısının Container’lar üzerinde koşabilmesi. Bu sayede dağıtık sistemleri ve altyapısı monitör edebilmek için çok hızlı bir şekilde Deploy edilebilmekte. Amaca özel Exporter’lar sayesinde spesifik servisler de monitör edilebilmekte. Örneğin; HAProxy, MySQL, PostgreSQL, Memcached, Redis  ve daha fazlası. Prometheus ekosistemi sayesinde Exporter ihtiyaçları geniş ölçüde karşılanmakta. Database, MQ, HTTP sunuculardan donanım merkezli IoT ve IPMI sistemlere kadar geniş bir yelpaze mevcut.

IPMI sözcüğü burada dikkat çekmiş olabilir, hemen açıklayalım; IPMI’ın anlamı  Intelligent Platform Management Interface, “yani Akıllı Platform Yönetim Arayüzü”  IPMI ile işletim sistemi seviyesinde değil de donanım seviyesinde kontrol olanağı sağlanır. Örneğin, kapalı bir sunucuyu IPMI ile tekrar açabilir ve yönetebilirsiniz. Yani, bir nevi Out-Of-Band management işlemi.

Mimarinin derinliklerine doğru

Tekrar Prometheus’a dönelim. Birazdan birkaç komut ile ayağa kaldıracağımız sistemi Stefan şu görsel ile çok güzel açıklamış. Görseli inceleyerek mimariden biraz bahsetmek istiyorum.

prometheus-on-docker

SOURCE: https://stefanprodan.com/2016/a-monitoring-solution-for-docker-hosts-containers-and-containerized-services/

Docker Host sunucumuzun sistem metriklerini “Node Exporter” Collect ederek Prometheus Metric Database’e gönderir.  Docker Host’umuz sanal bir makine veya Fiziksel bir Host olabilir. Node Exporter gibi cAdvisor ise Container metriklerini toplar. O da Collect ettiği Container metriklerini Prometheus’a aktarır. Grafana bu metrikleri çeşitli Query’ler kullanarak anlamlandırır ve görselleştirir. AlertManager ise Alerting işlemini yönetir. Prometheus’un gönderdiği uyarıları işler. Bu uyarılar deduplicating yani tekilleştirme, gruplama ve bu uyarıların doğru alıcılara (Örneğin; email, OpsGenie ve PagerDuty, Slack gibi servisler) yönlendirilmesi işlemine dayanır. Bu arada OpsGenie Türk kökenli bir SaaS girişimi. Bunu da arada belirtmek isterim. 🙂

AlertManager’ın kullandığı “Deduplication” yönetimine yakından bakalım. Aslında genel olarak “Deduplication” yöntemi nedir ona bir açıklık getirelim.

Deduplication nedir?

Data deduplication, ya da bazen “Akıllı sıkıştırma” ya da “Single-instance depolama” olarak da isimlendirilir. Storage yüklerini elimine etmek için uygulanan bir işlem. Veriyi çeşitli algoritmalarla sıkıştırır. Tekrar eden verileri elimine ederek storage üzerinde sadece uniq bir kopyasının sağlanması amaçlıdır. Incremental yedek işlemine benzer bir durum söz konusudur.

Örneğin bir email sisteminde 1MB boyutunda bir ekli dosyanın 100 örneği olduğunu düşünelim. Bir email’in farklı posta kutularında olması gibi. Eğer bu email platformu -örneğin, Exchange Server gibi- bir storage sistemle yedeklenirse bu dosyaların ihtiyaç duyacağı alan doğal olarak 100MB olacaktır. Böyle bir sistemin Deduplication destekli bir sistemle yedeği alınsaydı, sadece 1 kopya üzerinde işlem yapılacak ve storage üzerinde sadece 1MB’lık bir alan kullanımı söz konusu olacaktı. Akıllıca bir teknoloji değil mi?

Baykuş as a Service!

logo.png

Tamam, komik bir başlıktı, kabul. 🙂 Sistemi ayağa kaldırmadan önce cAdvisor‘e biraz değinmek istiyorum. cAdvisor (Container Advisor), Container’lar hakkında anlamlı kaynak kullanımı ve performans karakteristikleri bilgisi sağlar. GitHub reposundan da görüleceği üzere, cAdvisor bir Google ürünü. Kendisi bir daemon yani arka-plan servisi; Container bilgilerini toplar, export eder, işler, birleştirir hatta görselleştirir. cAdvisor’ün native bir Docker desteği olduğunu da belirtmeliyim. Her container için ayrı ayrı “Resource Isolation Parameters” dediğimiz ayrılmış kaynak parametrelerinin kaydını tutar, saklar ve host genelinde kullanıma hazır hale getirir. cAdvisor’un Container soyutlaması yine bir Google ürünü olan lmctfy tabanlıdır. Daha fazla detay için buradan devam edebilirsiniz. cAdvisor’ün mimarimizdeki görevi topladığı Container metriklerinin Prometheus’a aktarılması.

Tıpkı cAdvisor gibi “Node Exporter” da bir Exporter. Donanım ve işletim sistemi metriklerini toplarlar. Node Exporter ile hangi sistem metriklerin toplanacağı hakkında ayrıntılı bilgilere buradan ulaşılabilir. Centos ve Fedora instance’lar için şu Exporter kullanılabilir.

Sistemi ayağa kaldırmaya başlayalım. Sırası ile aşağıdaki komutları kullanarak docker-compose ile Prometheus monitoring stack ayağa kalkacaktır.

$ git clone https://github.com/stefanprodan/dockprom
$ cd dockprom
$ docker-compose up -d

“dockprom” GitHub repo’yu lokal alanımıza kopyalayıp, “dockprom” dizinine girelim.

root@dockerhost:[/home/hakan/pro-monitoring]: git clone https://github.com/stefanprodan/dockprom
Cloning into 'dockprom'...
remote: Counting objects: 195, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 195 (delta 0), reused 1 (delta 0), pack-reused 192
Receiving objects: 100% (195/195), 1.36 MiB | 657.00 KiB/s, done.
Resolving deltas: 100% (102/102), done.
root@dockerhost:[/home/hakan/pro-monitoring]:
root@dockerhost:[/home/hakan/pro-monitoring]: cd dockprom/
root@dockerhost:[/home/hakan/pro-monitoring/dockprom]:

“dockprom” klasörü içinde docker-compose komutunu girelim.

docker-compose up -d

docker-compose, “docker-compose.yml” dosyasını kullanarak Prometheus Stack’ın ihtiyaç duyduğu bütün Container’ları ayağa kaldırdı.

compose-up

Ayağa kalkan Container’ları kontrol edelim.

compose-ps

Çalışan Container listesi ve erişim portları şu şekilde:

Prometheus (Metrik Veritabanı) http://:9090
AlertManager (Alert Yönetimi) http://:9093
Grafana (Metrik Görselleştirme) http://:3000
NodeExporter (Host metrik collector)
cAdvisor (Container metrik collector)

Bütün bu container’ları ayağa kaldıran “docker-compose.yml” dosyasının detaylarını şuradan inceleyebilirsiniz.

Prometheus Stack ayağa kalktığına göre, işleme Grafana’nın yönetimi ile devam edebiliriz.

Browser ile http://host-ip:3000 adresine gidelim. Host-IP için Docker Host’umuzun IP adresini kullanalım. Giriş kullanıcı adı admin ve şifresi changeme şeklinde. Bu girdileri user.config dosyasını kullanarak veya Grafana UI üzerinden değiştirebiliyoruz.

grafana1

Grafana UI’a login olduktan sonra “Grafana” logosuna tıklayarak “Data Sources” sonra da “Add Data Source” butonunu tıklayarak “Prometheus Container”ı bir data source olarak ekleyelim. Şu değerleri kullanalım.

prom2

Prometheus Container’ı data source olarak ekledikten sonra görselleştirme için bir Dashboard’a ihtiyacımız olacak. Dashboard şablonlarını “grafana” klasörü içinde bulabilirsiniz. Bu şablonları eklemek için yine Grafana logosuna tıklayarak “Dashboards”u ve sonra  “Import”u tıklayalım.  Sırası ile aşağıdaki dosyaları ayrı ayrı import edelim.

  • docker_containers.json
  • docker_host.json
  • monitor_services.json
  • nginx_container.json

Grafana Dashboard şöyle bir görünüme sahip olacak.

grafana-ui2

Docker Host Dashboard, sunucunuz hakkındaki hayati kaynak kullanım metriklerini oldukça şık bir şekilde sunacaktır. CPU, Uptime, Memory kullanımı, IO durumu, Sistem Load durumu gibi metrikleri detaylı bir şekilde inceleyebilirsiniz.

grafana-ui2--

Container Host Dashboard ile çalışan Container metriklerini monitör edebilirsiniz. Container’ların kullandığı toplam CPU Load, Memory durumu, Storage kullanımı, bireysel sistem load, IO durumu, network inbound/outbound durumları gibi. Bu ekranda monitoring stack’ın bir parçası olan Container’lar hakkında bilgi görüntülenmez.

grafana-ui-service

Monitor Services Dashboard ise monitoring stack yapısında kullanılan Container’lar hakkında bilgi sunar. Örneğin, Container CPU kullanımı, Memory durumu, HTTP isteklerinin sayısı, Alarm grafiği gibi.

İkinci Prometheus serisinin sonuna geldik. Bir sonraki bölümde Alert dosyalarının düzenlenmesi, Trigger belirleme, bu dosyaların HTTP POST yöntemi ile Prometheus’a aktarımını incelemek istiyorum.

Daha sonra ise Prometheus’un birçok Exporter komponentlerini kullanarak farklı senaryolarda nasıl kullanılır onları araştırıp aktaracağım.

Teşekkürler.

Hakan Orcan

Kullanılan kaynaklar:
http://searchstorage.techtarget.com/definition/data-deduplication
https://github.com/stefanprodan/dockprom
https://en.wikipedia.org/wiki/Out-of-band_management
https://grafana.com/
https://prometheus.io/
https://github.com/google/cadvisor
https://stefanprodan.com/2016/a-monitoring-solution-for-docker-hosts-containers-and-containerized-services/

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s