← Kursa Dön
📄 Text · 25 min

Prometheus & Grafana

Giriş

Metrik toplamak tek başına yetmez — toplanan verileri depolamak, sorgulamak ve görselleştirmek gerekir. Modern monitoring dünyasının standart araç seti Prometheus (metrik depolama ve sorgulama) ve Grafana (görselleştirme ve alerting) ikilisidir. Bu derste Spring Boot uygulamanızı Prometheus ile izlemeyi, PromQL ile metrik sorgulamayı ve Grafana dashboard'ları oluşturmayı öğreneceksiniz.

Prometheus Nedir?

Prometheus, Cloud Native Computing Foundation (CNCF) tarafından geliştirilen açık kaynaklı bir monitoring ve alerting sistemidir. Temel özellikleri:

  • Pull-based model: Prometheus, hedef uygulamalardan belirli aralıklarla metrikleri çeker (scrape). Bu, push-based sistemlerin aksine, uygulamanın Prometheus'u bilmesine gerek olmadığı anlamına gelir.

  • Time-series database: Metrikler zaman damgalı olarak saklanır

  • PromQL: Güçlü bir sorgulama dili

  • Service discovery: Hedefleri otomatik keşfedebilir (Kubernetes, Consul vb.)

Mimari

┌──────────┐  scrape   ┌───────────────┐  query  ┌─────────┐
│ Spring   │◀─────────│  Prometheus    │◀───────│ Grafana  │
│ Boot App │  /metrics │  Server       │ PromQL  │Dashboard │
│ :8080    │           │  :9090        │         │ :3000    │
└──────────┘           └───────┬───────┘         └─────────┘
                               │
                       ┌───────▼───────┐
                       │  AlertManager │
                       │  (opsiyonel)  │
                       └───────────────┘

Spring Boot + Prometheus Entegrasyonu

Bağımlılık

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

Bu bağımlılık eklendiğinde Micrometer, metrikleri Prometheus formatında sunan /actuator/prometheus endpoint'ini otomatik aktif eder.

Yapılandırma

# Prometheus endpoint'ini aç
management.endpoints.web.exposure.include=health,info,prometheus,metrics

# Metrik isimlerini Prometheus convention'ına uygun yap (snake_case)
management.prometheus.metrics.export.enabled=true

# Histogram bucket'ları (isteğe bağlı)
management.metrics.distribution.percentiles-histogram.http.server.requests=true

/actuator/prometheus Çıktısı

# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{area="heap",id="G1 Eden Space"} 2.5165824E7
jvm_memory_used_bytes{area="heap",id="G1 Old Gen"} 1.8874368E7
jvm_memory_used_bytes{area="nonheap",id="Metaspace"} 6.2836736E7

# HELP http_server_requests_seconds Duration of HTTP server request handling
# TYPE http_server_requests_seconds summary
http_server_requests_seconds_count{method="GET",uri="/api/users",status="200"} 1523
http_server_requests_seconds_sum{method="GET",uri="/api/users",status="200"} 45.234

# HELP orders_created_total Total number of orders created
# TYPE orders_created_total counter
orders_created_total{type="all"} 8924.0

Prometheus formatı, her metriği # HELP (açıklama), # TYPE (tür) ve metrik_adı{etiketler} değer yapısında sunar.

Prometheus Yapılandırması

Prometheus'un Spring Boot uygulamanızı scrape etmesi için prometheus.yml dosyası yapılandırılır:

global:
  scrape_interval: 15s       # Her 15 saniyede bir çek
  evaluation_interval: 15s   # Kural değerlendirme aralığı

scrape_configs:
  - job_name: 'spring-boot-app'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 10s     # Bu job için özel aralık
    static_configs:
      - targets: ['app-server:8080']
        labels:
          environment: 'production'
          team: 'backend'

  - job_name: 'spring-boot-app-staging'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['staging-server:8080']
        labels:
          environment: 'staging'

# Kubernetes service discovery (Docker/K8s ortamı için)
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true

PromQL Temelleri

PromQL (Prometheus Query Language), zaman serisi verileri sorgulamak için kullanılır:

# Anlık değer — mevcut JVM heap kullanımı
jvm_memory_used_bytes{area="heap"}

# Rate — son 5 dakikada saniyede ortalama istek sayısı
rate(http_server_requests_seconds_count[5m])

# Toplam istek sayısının artış hızı (per second)
rate(orders_created_total[5m])

# 95. percentile yanıt süresi (histogram'dan)
histogram_quantile(0.95, rate(http_server_requests_seconds_bucket[5m]))

# HTTP 5xx hata oranı
sum(rate(http_server_requests_seconds_count{status=~"5.."}[5m]))
/
sum(rate(http_server_requests_seconds_count[5m]))

# Belirli bir endpoint'in ortalama yanıt süresi
rate(http_server_requests_seconds_sum{uri="/api/orders"}[5m])
/
rate(http_server_requests_seconds_count{uri="/api/orders"}[5m])

# Toplam aktif thread sayısı
jvm_threads_live_threads

# Aggregation — ortam bazında toplam istek
sum by (environment) (rate(http_server_requests_seconds_count[5m]))

Grafana Dashboard Oluşturma

Grafana, Prometheus'tan gelen verileri görselleştiren güçlü bir dashboard aracıdır. Docker Compose ile kurulum:

version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    depends_on:
      - prometheus

Grafana'da bir panel oluşturmak için:

  1. Data source olarak Prometheus ekleyin (URL: http://prometheus:9090)

  2. Yeni dashboard oluşturun

  3. Panel ekleyip PromQL sorgusu yazın

  4. Görselleştirme türünü seçin (time series, gauge, stat, table vb.)

Yararlı Dashboard Panelleri

PanelPromQL
İstek/saniyesum(rate(http_server_requests_seconds_count[5m]))
p95 Yanıt süresihistogram_quantile(0.95, sum(rate(http_server_requests_seconds_bucket[5m])) by (le))
Hata oranı (%)sum(rate(http_server_requests_seconds_count{status=~"5.."}[5m])) / sum(rate(http_server_requests_seconds_count[5m])) * 100
JVM Heapjvm_memory_used_bytes{area="heap"}
Aktif threadjvm_threads_live_threads
GC Pauserate(jvm_gc_pause_seconds_sum[5m])

Alerting Rules

Prometheus, belirli koşullar sağlandığında uyarı oluşturabilir. Alert kuralları alert.rules.yml dosyasında tanımlanır:

groups:
  - name: spring-boot-alerts
    rules:
      - alert: HighErrorRate
        expr: |
          sum(rate(http_server_requests_seconds_count{status=~"5.."}[5m]))
          / sum(rate(http_server_requests_seconds_count[5m])) > 0.05
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "High error rate detected"
          description: "Error rate is above 5% for 5 minutes"

      - alert: HighResponseTime
        expr: |
          histogram_quantile(0.95,
            sum(rate(http_server_requests_seconds_bucket[5m])) by (le)
          ) > 2
        for: 3m
        labels:
          severity: warning
        annotations:
          summary: "High response time"
          description: "P95 response time is above 2 seconds"

      - alert: JvmMemoryHigh
        expr: jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} > 0.9
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "JVM heap memory above 90%"

      - alert: ApplicationDown
        expr: up{job="spring-boot-app"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Application is down"

Alert akışı: Prometheus → AlertManager → Notification channel (Slack, email, PagerDuty). AlertManager, alert'leri gruplar, sessizleştirir (silence) ve yönlendirir.