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.0Prometheus 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: truePromQL 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:
- prometheusGrafana'da bir panel oluşturmak için:
Data source olarak Prometheus ekleyin (URL:
http://prometheus:9090)Yeni dashboard oluşturun
Panel ekleyip PromQL sorgusu yazın
Görselleştirme türünü seçin (time series, gauge, stat, table vb.)
Yararlı Dashboard Panelleri
| Panel | PromQL |
|---|---|
| İstek/saniye | sum(rate(http_server_requests_seconds_count[5m])) |
| p95 Yanıt süresi | histogram_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 Heap | jvm_memory_used_bytes{area="heap"} |
| Aktif thread | jvm_threads_live_threads |
| GC Pause | rate(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.
AI Asistan
Sorularını yanıtlamaya hazır