Sitemap

Sistem Performansını İzleme: Prometheus, Grafana ve Nginx ile Örnek Proje

5 min readFeb 22, 2025

Modern yazılım geliştirme süreçlerinde, uygulamalarımızın performansını izlemek, trafik yönetimini sağlamak ve servisler arası iletişimi yönetmek kritik bir gerekliliktir. Bu yazıda, Prometheus, Grafana ve Nginx gibi araçların ne işe yaradığını açıklayarak başlayacağız. Ardından, bu bileşenleri Docker üzerinde nasıl çalıştırabileceğimizi adım adım göstereceğiz. Son olarak, Go programlama dili ile geliştirdiğimiz bir örnek proje üzerinden API ve Consumer bileşenlerini içeren bir servis oluşturacağız. Böylece, hem dağıtık sistemlerin nasıl gözlemlenebileceğini hem de mikro servis mimarisinde izlenebilirliğin nasıl sağlanacağını uygulamalı olarak ele alacağız.

Prometheus Nedir?

Prometheus, açık kaynaklı bir sistem izleme ve uyarı aracıdır. Özellikle mikroservis mimarileri ve dinamik bulut ortamlarında kullanılmak üzere tasarlanmıştır. Prometheus, metrik verileri toplar, depolar ve bu verileri analiz ederek sistem performansını izlemeye yardımcı olur.

Temel Özellikleri:

  • Zaman Serisi Veritabanı: Toplanan metrikleri zaman serisi olarak depolar.
  • Güçlü Sorgulama Dili (PromQL): Metrik verileri analiz etmek ve sorgulamak için kullanılır.
  • Servis Keşfi (Service Discovery): Dinamik ortamlarda yeni servisleri otomatik olarak keşfeder.
  • Uyarı Yönetimi: Belirli eşikler aşıldığında uyarılar gönderir.
  • Pull Tabanlı Mimari: Metrikleri hedef sistemlerden düzenli aralıklarla çeker.

Kullanım Alanları:

  • Sistem ve uygulama performansı izleme.
  • Hata ayıklama ve sorun giderme.
  • Uyarı sistemleri oluşturma.

Grafana Nedir?

Grafana, açık kaynaklı bir veri görselleştirme ve analiz platformudur. Prometheus gibi çeşitli veri kaynaklarından gelen metrikleri grafikler, panolar ve raporlar halinde sunar. Kullanıcı dostu arayüzü sayesinde karmaşık verilerin anlaşılır bir şekilde görselleştirilmesini sağlar.

Temel Özellikleri:

  • Çoklu Veri Kaynağı Desteği: Prometheus, InfluxDB, Elasticsearch, MySQL gibi birçok veri kaynağıyla entegre çalışır.
  • Özelleştirilebilir Panolar: Kullanıcılar kendi ihtiyaçlarına göre panolar oluşturabilir.
  • Zengin Grafik Seçenekleri: Çizgi grafikler, çubuk grafikler, ısı haritaları gibi birçok görselleştirme seçeneği sunar.
  • Uyarı ve Bildirimler: Belirli koşullar sağlandığında uyarılar gönderir.

Kullanım Alanları:

  • Sistem ve uygulama metriklerinin görselleştirilmesi.
  • Gerçek zamanlı veri analizi.
  • Ekip içi raporlama ve paylaşım.

Nginx Nedir?

Nginx, yüksek performanslı bir web sunucusu, ters proxy ve yük dengeleyicidir. Hem statik hem de dinamik içerik sunmak için kullanılır ve özellikle yüksek trafikli web sitelerinde tercih edilir.

Temel Özellikleri:

  • Yüksek Performans: Eşzamanlı bağlantıları verimli bir şekilde yönetir.
  • Ters Proxy: İstekleri arka uç sunuculara yönlendirir.
  • Yük Dengeleme: Trafiği birden fazla sunucuya dağıtır.
  • SSL/TLS Desteği: Güvenli iletişim sağlar.
  • Dinamik Modül Desteği: İhtiyaçlara göre genişletilebilir.

Kullanım Alanları:

  • Web sunucusu olarak statik ve dinamik içerik sunma.
  • Mikroservis mimarilerinde ters proxy ve yük dengeleyici olarak kullanım.
  • API gateway olarak kullanım.

RabbitMQ için Prometheus Entegrasyonu

RabbitMQ’nun metriklerini Prometheus’a aktarmak için rabbitmq_prometheus eklentisini etkinleştirmemiz ve metriklerin okunacağı portu (15692) açmamız gerekiyor. Aşağıdaki Docker compose yapılandırması, bu işlemleri otomatik olarak gerçekleştirir:

rabbitmq:
image: rabbitmq:3-management
container_name: demo-rabbitmq
ports:
- "5672:5672" # AMQP portu
- "15672:15672" # RabbitMQ Management UI
- "15692:15692" # Prometheus metrikleri için port
environment:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
command: /bin/sh -c "rabbitmq-plugins enable --offline rabbitmq_prometheus && rabbitmq-server"
volumes:
- mq_data:/var/lib/rabbitmq
networks:
- demo-network

Bu yapılandırma, RabbitMQ’nun Prometheus metriklerini 15692 portu üzerinden sunmasını sağlar.

Nginx için Prometheus Entegrasyonu

Nginx’in metriklerini Prometheus’a aktarmak için nginx-prometheus-exporter kullanacağız. Bu araç, Nginx'in durum bilgilerini Prometheus'un okuyabileceği bir formata dönüştürür.

nginx-exporter:
image: nginx/nginx-prometheus-exporter:latest
container_name: demo-nginx-exporter
command:
- "-nginx.scrape-uri=http://nginx/status" # Nginx durum bilgilerini çekmek için URI
ports:
- "9113:9113" # Exporter'ın metrikleri sunduğu port
depends_on:
- nginx
networks:
- demo-network

Bu yapılandırma, Nginx’in metriklerini 9113 portu üzerinden Prometheus'a sunar.

Go Uygulaması için Prometheus Entegrasyonu

Go dilinde geliştirdiğimiz uygulama için Echo framework kullanıyoruz. Echo framework ile Prometheus entegrasyonu oldukça kolaydır. Aşağıdaki kod örneği, uygulamamızın metriklerini Prometheus’a nasıl aktaracağımızı gösterir:

package main

import (
"github.com/labstack/echo/v4"
echoprometheus "github.com/labstack/echo-contrib/prometheus"
)

func main() {
e := echo.New()

// Prometheus middleware'ini ekleyerek metrikleri topluyoruz
e.Use(echoprometheus.NewMiddleware("demo_api"))

// Metrikleri Prometheus'a sunmak için "/metrics" endpoint'ini ekliyoruz
e.GET("/metrics", echoprometheus.NewHandler())

// Sağlık kontrolü için "/health" endpoint'ini ekliyoruz
e.GET("/health", func(c echo.Context) error {
return c.String(200, "OK")
})

e.Start(":8080")
}

Bu kod, uygulamamızın metriklerini /metrics endpoint'i üzerinden Prometheus'a sunar.

Nginx Yapılandırması

Nginx’in durum bilgilerini Prometheus’a aktarmak için stub_status modülünü kullanacağız. Bu modül, Nginx'in çalışma durumu hakkında temel metrikler sağlar. Aşağıdaki yapılandırma dosyası (nginx.conf), Nginx'in /status endpoint'i üzerinden durum bilgilerini sunmasını sağlar:

worker_processes 1;

events {
worker_connections 1024;
}

http {
server {
listen 80;

# /status endpoint'i için stub_status modülünü etkinleştiriyoruz
location /status {
stub_status on; # Durum bilgilerini sunar
access_log off; # Erişim loglarını devre dışı bırakır
allow all; # Tüm IP'lerden erişime izin verir
}

# Diğer tüm istekleri Go uygulamasına yönlendiriyoruz
location / {
proxy_pass http://demo-api:8080/; # Go uygulamasına yönlendirme
}
}
}

Nginx’i Docker üzerinde çalıştırmak için aşağıdaki yapılandırmayı kullanabiliriz:

nginx:
image: nginx:latest
container_name: demo-nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
networks:
- demo-network

Prometheus Yapılandırması

Prometheus’un RabbitMQ, Nginx ve Go uygulamasından metrikleri toplayabilmesi için bir yapılandırma dosyası (prometheus.yml) oluşturmamız gerekiyor. Bu dosya, Prometheus'un hangi hedeflerden metrik toplayacağını belirtir:

global:
scrape_interval: 5s # Metriklerin toplanma aralığı

scrape_configs:
- job_name: 'rabbitmq'
static_configs:
- targets: ['demo-rabbitmq:15692'] # RabbitMQ metrikleri

- job_name: 'nginx-exporter'
static_configs:
- targets: ['demo-nginx-exporter:9113'] # Nginx metrikleri

- job_name: 'go-api'
static_configs:
- targets: ['demo-api:8080'] # Go uygulaması metrikleri

Prometheus’u Ayağa Kaldırma

Prometheus’u Docker üzerinde çalıştırmak için aşağıdaki yapılandırmayı kullanabiliriz:

prometheus:
image: prom/prometheus
container_name: demo-prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml # Yapılandırma dosyasını bağlama
- prometheus_data:/prometheus # Metrik verilerini depolama
ports:
- "9090:9090" # Prometheus UI erişimi
networks:
- demo-network

Prometheus’u başlattıktan sonra, http://localhost:9090/targets adresine giderek metrik hedeflerinin durumunu kontrol edebilirsiniz. Burada RabbitMQ, Nginx ve Go uygulamasının metriklerinin başarıyla toplandığını göreceksiniz.

Topladığımız metrik değerlerini Grafana üzerinde görselleştirerek daha anlaşılır ve etkili bir izleme deneyimi elde edebiliriz. Grafana, hem hazır dashboardlar hem de kendi ihtiyaçlarınıza göre özelleştirilebilir dashboardlar oluşturma imkanı sunar. Örneğin, bu projede Nginx, RabbitMQ ve Go uygulaması için sırasıyla 4368, 10991 ve 18452 numaralı hazır dashboardları kullanarak hızlı bir şekilde metrikleri görselleştirebilirsiniz. Ayrıca, kendi ihtiyaçlarınıza uygun özel dashboardlar oluşturarak daha detaylı analizler yapabilirsiniz.

Umarım bu yazı, Prometheus, Grafana, Nginx ve Go uygulaması ile metrik toplama ve görselleştirme süreçlerini anlamanıza yardımcı olmuştur. Eğer projeyi denemek veya incelemek isterseniz, uygulamanın tüm kodlarına buradan ulaşabilirsiniz.

--

--

No responses yet