Kibana — Dashboard, Visualization, Discover
Giriş — Dashboard, Visualization, Lens, Canvas ve Discover
Bir şehrin trafik kontrol merkezini düşün. Yüzlerce kameradan akan görüntü, sensörlerden gelen veri, hız ölçümler — ham haliyle anlamsız rakam yığını. Ama büyük ekranlarda haritalar, grafikler, canlı sayaçlar olduğunda, bir bakışta şehrin trafiğini anlarsın. Kırmızı bölgeler tıkanık, yeşil bölgeler akıyor, alarm çaldığında kaza var.
Kibana, Elasticsearch'ün trafik kontrol merkezi. Milyarlarca log kaydını, metrikleri ve iş verilerini görsel hale getirir. Dashboard'lar, grafikler ve tablolarla bir bakışta sisteminizin durumunu anlarsınız.
1. Kibana Nedir?
Temel Özellikler
| Özellik | Açıklama |
|---|---|
| Discover | Log ve veri keşfi, ad-hoc arama |
| Dashboard | Birden fazla görselleştirmeyi tek sayfada birleştirme |
| Lens | Sürükle-bırak ile görselleştirme oluşturma |
| Canvas | Piksel mükemmelliğinde sunum ve infografik |
| Maps | Coğrafi veri görselleştirme |
| Dev Tools | Elasticsearch REST API konsolu |
| Stack Monitoring | Elasticsearch, Logstash, Beats monitoring |
| Alerting | Kural tabanlı uyarı sistemi |
Kibana Kurulumu
# kibana.yml — Temel konfigürasyon
server.port: 5601
server.host: "0.0.0.0"
server.name: "kibana-production"
elasticsearch.hosts: ["https://es-node1:9200", "https://es-node2:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "${KIBANA_PASSWORD}"
elasticsearch.ssl.certificateAuthorities: ["/etc/kibana/certs/ca.crt"]
# Encryption keys (required for alerting, saved objects encryption)
xpack.security.encryptionKey: "something-at-least-32-characters-long"
xpack.encryptedSavedObjects.encryptionKey: "something-at-least-32-characters-long"
xpack.reporting.encryptionKey: "something-at-least-32-characters-long"# Docker ile
docker run -d \
--name kibana \
-p 5601:5601 \
-e ELASTICSEARCH_HOSTS="https://es-node1:9200" \
docker.elastic.co/kibana/kibana:8.12.02. Data View (Index Pattern) Oluşturma
Kibana'da veri görselleştirmeden önce bir Data View (eski adıyla Index Pattern) tanımlamanız gerekir.
Kibana UI'dan
Stack Management → Data Views → Create data view
Name: Web Logs
Index pattern: logs-*
Timestamp field: @timestampAPI ile
POST kbn:/api/data_views/data_view
{
"data_view": {
"title": "logs-*",
"timeFieldName": "@timestamp",
"name": "Web Logs"
}
}Birden Fazla Data View
logs-* → Tüm loglar
logs-nginx-* → Sadece nginx logları
logs-app-* → Sadece uygulama logları
metrics-* → Metrik verileri
apm-* → APM verileri3. Discover — Veri Keşfi
Discover, Elasticsearch'teki verileri keşfetmek ve ad-hoc sorgu yapmak için kullanılır.
Temel Kullanım
1. Sol menü → Discover
2. Data view seç: "logs-*"
3. Zaman aralığı seç: "Last 24 hours"
4. Arama çubuğuna KQL (Kibana Query Language) yazınKQL (Kibana Query Language)
# Basit arama
status: ERROR
# Field değeri arama
service.name: "auth-service" and level: "ERROR"
# Wildcard
message: *timeout*
# Range
response_time > 1000
# OR operatörü
level: "ERROR" or level: "WARN"
# NOT operatörü
not status_code: 200
# Nested field
geo.country_name: "Turkey"
# Exists
response_time: *Lucene Query Syntax (Alternatif)
# Discover'da KQL yerine Lucene syntax de kullanabilirsiniz
# Sağ üstteki "KQL" butonunu tıklayıp "Lucene" seçin
# Term query
status:ERROR
# Phrase query
message:"connection refused"
# Range
response_time:[1000 TO *]
# Boolean
level:ERROR AND service:auth-service
# Regex
path:/api\/v[0-9]+\/users/Saved Search
Sık kullandığınız aramaları kaydedin:
1. Discover'da sorgu yazın
2. Filtreleri ekleyin
3. Görüntülenecek sütunları seçin
4. "Save" butonuna tıklayın
5. İsim verin: "Production Errors - Last 24h"Discover'da Field İstatistikleri
Bir field adına tıklayınca:
En sık değerler (top values)
Değer dağılımı
"Filter for value" ve "Filter out value" butonları
4. Visualize / Lens — Görselleştirme
Lens — Modern Görselleştirme Aracı
Lens, sürükle-bırak ile görselleştirme oluşturmanın en kolay yolu. Kibana otomatik olarak verinize uygun grafik tipini önerir.
1. Sol menü → Visualize Library → Create visualization
2. "Lens" seçin
3. Sol panelden field'ları sürükleyip canvas'a bırakın
4. Kibana otomatik grafik önerirLens ile Grafik Tipleri
| Tip | Kullanım |
|---|---|
| Bar (Horizontal/Vertical) | Karşılaştırma, dağılım |
| Line | Zaman serisi, trend |
| Area | Hacim ve trend birlikte |
| Pie / Donut | Oran ve pay |
| Metric | Tek sayı (toplam hata, ortalama süre) |
| Table | Tablo formatında aggregation |
| Heatmap | Yoğunluk haritası |
| Gauge | Gösterge (SLA %, health score) |
| Treemap | Hiyerarşik dağılım |
Lens Örnekleri
Örnek 1: Saatlik Hata Grafiği (Line)
1. Lens'i aç
2. Data view: logs-*
3. X-axis: @timestamp (Date Histogram, interval: Auto)
4. Y-axis: Count of records
5. Break down by: level.keyword (Top 5)
6. Filter: level: ERROR or level: WARN
7. Grafik tipi: LineÖrnek 2: Status Code Dağılımı (Pie)
1. Lens'i aç
2. Slice by: status_code (Top values, size: 10)
3. Metric: Count
4. Grafik tipi: DonutÖrnek 3: Ortalama Response Time by Service (Bar)
1. Lens'i aç
2. Horizontal axis: service.keyword (Top values)
3. Vertical axis: Average of response_time
4. Break down by: None
5. Grafik tipi: Horizontal BarÖrnek 4: Metric Visualization (Tek Sayı)
1. Lens'i aç
2. Grafik tipi: Metric
3. Primary metric: Count
4. Filter: level: ERROR AND @timestamp >= now-1h
5. Subtitle: "Errors in last hour"Aggregation-Based Visualizations (Eski Yöntem)
Lens'in yapamadığı karmaşık senaryolar için:
Visualize Library → Create visualization → Aggregation based
# TSVB (Time Series Visual Builder)
- Birden fazla metric overlay
- Matematik ifadeleri (derivative, cumulative sum)
- Annotation (event marker)
# Vega / Vega-Lite
- Tamamen özel D3-bazlı görselleştirmeler
- JSON/HJSON konfigürasyonTSVB Örneği: Request Rate + Error Rate
1. Create visualization → TSVB
2. Panel options:
- Index pattern: logs-*
- Time field: @timestamp
3. Data tab:
- Series 1: Count (label: "Total Requests", color: blue)
- Series 2: Count with filter (level: ERROR, label: "Errors", color: red)
4. Annotations:
- Index: deployments-*
- Fields: version, service5. Dashboard — Birleştirme
Dashboard Oluşturma
1. Sol menü → Dashboard → Create dashboard
2. "Add panel" → Mevcut visualization'ları ekleyin
3. Panel'leri sürükleyip boyutlandırın
4. Filtreleri ekleyin (dashboard seviyesinde)
5. Zaman aralığını ayarlayın
6. SaveÖrnek Dashboard: Web Application Monitoring
Üst satır (Metric panels):
┌──────────┬──────────┬──────────┬──────────┐
│ Total │ Error │ Avg │ P99 │
│ Requests │ Rate │ Response │ Response │
│ 1.2M │ 0.3% │ 125ms │ 890ms │
└──────────┴──────────┴──────────┴──────────┘
Orta satır (Grafikler):
┌─────────────────────┬──────────────────────┐
│ Request Rate │ Response Time │
│ (Line chart, │ (Line chart, │
│ per service) │ percentiles) │
│ │ │
└─────────────────────┴──────────────────────┘
Alt satır (Tablolar ve dağılımlar):
┌──────────────┬──────────────┬──────────────┐
│ Top Errors │ Status Code │ Geographic │
│ (Table) │ Distribution │ Distribution │
│ │ (Donut) │ (Map) │
└──────────────┴──────────────┴──────────────┘Dashboard Filtreleri
Dashboard'a eklenen filtreler tüm panel'leri etkiler:
# Üst barda filtre ekle:
+ Add filter → service.name is "auth-service"
+ Add filter → environment is "production"
# KQL arama çubuğu:
level: ERROR and response_time > 500Dashboard Drilldown
Bir panel'e tıklayınca detaya inme:
1. Panel düzenle → Actions
2. "Create drilldown"
- Dashboard to dashboard: Başka dashboard'a git
- URL: Harici sayfaya git
- Discover: Discover'da aç
3. Panel'deki herhangi bir data noktasına tıklayınca drilldown tetiklenirDashboard Paylaşım
# 1. Link ile paylaş
Dashboard → Share → Get link
- Snapshot link (mevcut durumu saklar)
- Short URL
# 2. Embed (iframe)
Dashboard → Share → Embed code
<iframe src="https://kibana:5601/app/dashboards#/view/abc123?embed=true" />
# 3. PDF/PNG Export
Dashboard → Share → PDF Reports / PNG Reports
# 4. Scheduled Report
Dashboard → Share → PDF Reports → Generate on schedule6. Canvas — Sunum ve İnfografik
Canvas, piksel mükemmelliğinde görselleştirmeler oluşturmanızı sağlar. Dashboard'ların aksine, Canvas tam kontrol verir — arka plan rengi, font, düzen, animasyon.
Canvas Kullanım Alanları
Yönetici sunumları
TV/monitör üzerinde gösterge tabloları
Özel branded raporlar
NOC (Network Operations Center) ekranları
Canvas Workpad Oluşturma
1. Sol menü → Canvas → Create workpad
2. Arka plan rengi/resmi ayarla
3. Element ekle:
- Metric: ES|SQL sorgusu ile
- Chart: Lens görselleştirmesi
- Image: Logo, ikon
- Text: Başlık, açıklama
- Shape: Dekoratif şekiller
4. Her element için data source belirleCanvas Expression Language
Canvas kendi expression dili kullanır:
# Elasticsearch'ten veri çek
filters
| essql query="SELECT COUNT(*) as total FROM \"logs-*\" WHERE level='ERROR'"
| math "total"
| metric "Errors" metricFont={font size=48 family="Arial" color="#FF0000"}
| render
# Zaman serisi
filters
| essql query="SELECT DATE_TRUNC('hour', @timestamp) as hour, COUNT(*) as count FROM \"logs-*\" GROUP BY hour ORDER BY hour"
| pointseries x="hour" y="count"
| plot defaultStyle={seriesStyle lines=2 color="#0077CC"}
| renderCanvas Örneği: Executive Summary
Sayfa 1 — Overview:
┌─────────────────────────────────────┐
│ Company Logo │
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ 99.9%│ │ 1.2M│ │ 45ms│ │
│ │Uptime│ │Req/d│ │ Avg │ │
│ └─────┘ └─────┘ └─────┘ │
│ │
│ [Request Trend Line Chart] │
│ │
│ [Service Health Grid] │
└─────────────────────────────────────┘
Sayfa 2 — Errors:
┌─────────────────────────────────────┐
│ Top 10 Errors (Table) │
│ Error Rate by Service (Bar) │
│ Error Location Map │
└─────────────────────────────────────┘7. Maps — Coğrafi Görselleştirme
Choropleth Map (Bölge Haritası)
1. Sol menü → Maps → Create map
2. Add layer → Choropleth
3. EMS boundaries: World Countries
4. Data view: logs-*
5. Join field: geo.country_code2
6. Metric: Count
7. Color: Red → Green gradientPoint Map (Nokta Haritası)
1. Add layer → Documents
2. Data view: logs-*
3. Geospatial field: geo.location
4. Tooltip fields: client_ip, city, country
5. Clustering: Grid (yoğunluk göster)Heatmap Layer
1. Add layer → Heat map
2. Data view: logs-*
3. Geospatial field: geo.location
4. Metrics: Count8. Dev Tools — Elasticsearch Konsolu
Console
# Sol menü → Dev Tools → Console
# Sorgu yazıp çalıştır (Ctrl+Enter)
GET _cluster/health
GET logs-*/_search
{
"query": {
"bool": {
"filter": [
{ "range": { "@timestamp": { "gte": "now-1h" } } },
{ "term": { "level": "ERROR" } }
]
}
},
"size": 5
}Search Profiler
# Profile tab'ına geç
# Sorguyu yapıştır ve "Profile" butonuna tıkla
# Her shard'ın her query bileşeninin süresini görürsünGrok Debugger
# Grok Debugger tab'ına geç
# Sample Data:
83.149.9.216 - - [17/May/2024:10:05:03 +0000] "GET /index.html HTTP/1.1" 200 12846
# Grok Pattern:
%{COMBINEDAPACHELOG}
# "Simulate" tıkla → Parsed output'u gör9. Alerting — Kural Tabanlı Uyarı
Alert Rule Oluşturma
1. Stack Management → Rules → Create rule
2. Rule type:
- Elasticsearch query: Custom query bazlı
- Log threshold: Log seviyesi bazlı
- Metric threshold: Metrik bazlı
- Index threshold: Index bazlı
3. Conditions: Ne zaman tetiklensin?
4. Actions: Ne yapılsın? (Email, Slack, webhook, PagerDuty)Örnek: Error Rate Alert
Rule type: Elasticsearch query
Name: "High Error Rate"
Check every: 1 minute
Condition:
Index: logs-*
KQL: level: "ERROR"
Threshold: Count > 100 in last 5 minutes
Actions:
1. Slack notification:
Channel: #ops-alerts
Message: "🔴 High error rate detected: {{context.value}} errors in 5 min"
2. Email:
To: ops-team@company.com
Subject: "[ALERT] High Error Rate"Anomaly Detection Alert
Rule type: Machine Learning
Name: "Unusual Request Rate"
ML Job: request-rate-anomaly
Condition:
Severity: Warning (score > 75)
Actions:
Slack: "⚠️ Anomaly detected: {{context.anomalyExplorerUrl}}"10. Kibana Spaces — Multi-Tenant
Space Oluşturma
Stack Management → Spaces → Create space
Space: "engineering"
- Dashboard, Discover, Visualize, Dev Tools
- Data views: logs-*, metrics-*
Space: "business"
- Dashboard, Canvas
- Data views: business-*
Space: "security"
- Dashboard, SIEM, Maps
- Data views: security-*, logs-*Her space:
Kendi saved object'leri (dashboard, visualization)
Kendi data view'ları
Kendi feature erişimi
URL'de
/s/<space-name>/...şeklinde
11. Best Practices
✅ Yap
| Konu | Öneri |
|---|---|
| Data view | İhtiyaca göre granüler data view'lar oluştur |
| Dashboard | İlgili metikleri tek dashboard'da birleştir |
| Lens | İlk tercih Lens olsun — basit ve güçlü |
| Saved search | Sık kullanılan aramaları kaydet |
| Spaces | Takım/departman bazlı izolasyon |
| Auto-refresh | Dashboard'larda auto-refresh aç (30s-1m) |
| Drilldown | Genel → detay navigasyon kur |
❌ Yapma
| Konu | Neden |
|---|---|
| Tek dashboard'a 30+ panel | Yavaş yüklenir, okunmaz |
logs-* tek data view | Çok büyük → yavaş field list |
| Herkese admin erişimi | Spaces + roles ile kısıtla |
| PDF report sürekli | Ağır işlem, scheduling kullan |
| Dashboard'suz monitoring | Ham log okumak verimsiz |
12. Yaygın Hatalar ve Çözümleri
Hata 1: "No data" / Boş Dashboard
# Kontrol 1: Data view doğru mu?
Stack Management → Data Views → İlgili pattern'ı kontrol et
# Kontrol 2: Zaman aralığı
Sağ üstteki time picker → "Last 7 days" veya daha geniş dene
# Kontrol 3: Elasticsearch'te veri var mı?
Dev Tools:
GET logs-*/_count
# Kontrol 4: Timestamp field doğru mu?
GET logs-*/_mapping/field/@timestampHata 2: "Too many buckets" Hatası
// Sorun: Aggregation çok fazla bucket oluşturmaya çalışıyor
// Çözüm 1: Dashboard'da daha kısa zaman aralığı seç
// Çözüm 2: Visualization'da bucket sayısını sınırla
// Çözüm 3: ES ayarını değiştir (dikkatli)
PUT _cluster/settings
{
"persistent": {
"search.max_buckets": 65535
}
}Hata 3: Dashboard Yavaş Yükleniyor
# Çözüm 1: Panel sayısını azalt (max 15-20)
# Çözüm 2: Zaman aralığını daralt
# Çözüm 3: Heavy aggregation'ları basitleştir
# Çözüm 4: Lens yerine saved search kullan (tablo için)
# Çözüm 5: Data view'ı daralt (logs-app-* vs logs-*)13. Kibana API — Programatik Erişim
Saved Objects API
// Dashboard export
GET kbn:/api/saved_objects/_find?type=dashboard&per_page=100
// Dashboard export (belirli dashboard)
GET kbn:/api/saved_objects/dashboard/my-dashboard-id
// Dashboard import (environment'lar arası taşıma)
POST kbn:/api/saved_objects/_import
// multipart/form-data ile .ndjson dosyası gönderilir
// Bulk export
POST kbn:/api/saved_objects/_export
{
"type": ["dashboard", "visualization", "search", "index-pattern"],
"includeReferencesDeep": true
}Dashboard'ları Environment'lar Arası Taşıma
# 1. Dev ortamından export
curl -X POST "http://dev-kibana:5601/api/saved_objects/_export" \
-H "kbn-xsrf: true" \
-H "Content-Type: application/json" \
-d '{"type": ["dashboard"], "includeReferencesDeep": true}' \
-o dashboards.ndjson
# 2. Production'a import
curl -X POST "http://prod-kibana:5601/api/saved_objects/_import" \
-H "kbn-xsrf: true" \
--form file=@dashboards.ndjsonKibana Reporting API
// PDF rapor oluştur
POST kbn:/api/reporting/generate/printablePdf
{
"jobParams": {
"objectType": "dashboard",
"title": "Weekly Report",
"relativeUrl": "/app/dashboards#/view/abc123"
}
}
// Rapor durumunu kontrol et
GET kbn:/api/reporting/jobs/list14. Kibana Performance Tuning
Session ve Cache Ayarları
# kibana.yml
# Saved object cache
elasticsearch.maxSockets: 1024
elasticsearch.requestTimeout: 60000
# Arama timeout
xpack.data_enhanced.search.sessions.enabled: true
xpack.data_enhanced.search.sessions.maxUpdateRetries: 3
# Reporting
xpack.reporting.queue.timeout: 120000
xpack.reporting.capture.maxAttempts: 3Dashboard Performans İpuçları
| Strateji | Detay |
|---|---|
| Panel sayısını sınırla | Dashboard başına max 15-20 panel |
| Zaman aralığını daralt | "Last 7 days" yerine "Last 24 hours" |
| Data view'ı daralt | logs-* yerine logs-app-* |
| Sampling kullan | Random sampling ile büyük veri setlerinde hızlan |
| Pre-computed data | Transform ile önceden hesaplanmış summary index |
Transform ile Dashboard Hızlandırma
Ağır aggregation'ları her seferinde çalıştırmak yerine, önceden hesaplayın:
// Saatlik özet tablosu oluştur
PUT _transform/dashboard-summary
{
"source": {
"index": "logs-*"
},
"dest": {
"index": "dashboard-hourly-summary"
},
"pivot": {
"group_by": {
"hour": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "1h"
}
},
"service": {
"terms": { "field": "service.keyword" }
}
},
"aggregations": {
"request_count": { "value_count": { "field": "@timestamp" } },
"error_count": { "filter": { "term": { "level": "ERROR" } } },
"avg_response_time": { "avg": { "field": "response_time" } },
"p99_response_time": { "percentiles": { "field": "response_time", "percents": [99] } }
}
},
"frequency": "5m",
"sync": {
"time": { "field": "@timestamp", "delay": "60s" }
}
}
POST _transform/dashboard-summary/_startSonra dashboard'u dashboard-hourly-summary index'i üzerinden oluşturun — çok daha hızlı yüklenir.
15. Java ile Kibana Dashboard Verisi Hazırlama
Dashboard'lar Elasticsearch aggregation'ları üzerine kuruludur. Java uygulamanızdan dashboard için optimize edilmiş veri gönderebilirsiniz:
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.IndexRequest;
// Dashboard için pre-aggregated metrics gönder
public class DashboardMetricsSender {
private final ElasticsearchClient client;
public void sendServiceMetrics(String service, long requestCount,
long errorCount, double avgResponseTime) throws Exception {
Map<String, Object> metric = Map.of(
"@timestamp", Instant.now().toString(),
"service", service,
"request_count", requestCount,
"error_count", errorCount,
"error_rate", (double) errorCount / requestCount * 100,
"avg_response_time", avgResponseTime,
"environment", "production"
);
client.index(IndexRequest.of(b -> b
.index("service-metrics-" +
LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy.MM.dd")))
.document(metric)
));
}
}Özet
Kibana Elasticsearch'ün görselleştirme katmanı — Discover ile veri keşfi, Lens ile grafik oluşturma, Dashboard ile birleştirme.
Discover ad-hoc arama ve veri keşfi için — KQL ile hızlı filtreleme, field istatistikleri ve saved search özelliği.
Lens modern ve kolay görselleştirme aracı — sürükle-bırak ile grafik oluşturun, Kibana otomatik olarak en uygun grafik tipini önerir.
Dashboard birden fazla görselleştirmeyi tek sayfada birleştirir — filtreler tüm panelleri etkiler, drilldown ile detaya inilebilir.
Canvas piksel mükemmelliğinde sunum ve infografik — NOC ekranları, yönetici sunumları, branded raporlar için.
Alerting kural tabanlı uyarı — log threshold, metric threshold, anomaly detection ile Slack, email, webhook entegrasyonu.
AI Asistan
Sorularını yanıtlamaya hazır