← Kursa Dön
📄 Text · 35 min

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

ÖzellikAçıklama
DiscoverLog ve veri keşfi, ad-hoc arama
DashboardBirden fazla görselleştirmeyi tek sayfada birleştirme
LensSürükle-bırak ile görselleştirme oluşturma
CanvasPiksel mükemmelliğinde sunum ve infografik
MapsCoğrafi veri görselleştirme
Dev ToolsElasticsearch REST API konsolu
Stack MonitoringElasticsearch, Logstash, Beats monitoring
AlertingKural 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.0

2. 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: @timestamp

API 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 verileri

3. 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ın

KQL (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/

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 önerir

Lens ile Grafik Tipleri

TipKullanım
Bar (Horizontal/Vertical)Karşılaştırma, dağılım
LineZaman serisi, trend
AreaHacim ve trend birlikte
Pie / DonutOran ve pay
MetricTek sayı (toplam hata, ortalama süre)
TableTablo formatında aggregation
HeatmapYoğunluk haritası
GaugeGösterge (SLA %, health score)
TreemapHiyerarş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ürasyon

TSVB Ö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, service

5. 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 > 500

Dashboard 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 tetiklenir

Dashboard 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 schedule

6. 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 belirle

Canvas 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"}
| render

Canvas Ö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 gradient

Point 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: Count

8. 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ün

Grok 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ör

9. 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 searchSık kullanılan aramaları kaydet
SpacesTakım/departman bazlı izolasyon
Auto-refreshDashboard'larda auto-refresh aç (30s-1m)
DrilldownGenel → detay navigasyon kur

❌ Yapma

KonuNeden
Tek dashboard'a 30+ panelYavaş yüklenir, okunmaz
logs-* tek data viewÇok büyük → yavaş field list
Herkese admin erişimiSpaces + roles ile kısıtla
PDF report sürekliAğır işlem, scheduling kullan
Dashboard'suz monitoringHam 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/@timestamp

Hata 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.ndjson

Kibana 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/list

14. 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: 3

Dashboard Performans İpuçları

StratejiDetay
Panel sayısını sınırlaDashboard başına max 15-20 panel
Zaman aralığını daralt"Last 7 days" yerine "Last 24 hours"
Data view'ı daraltlogs-* yerine logs-app-*
Sampling kullanRandom sampling ile büyük veri setlerinde hızlan
Pre-computed dataTransform 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/_start

Sonra 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

  1. Kibana Elasticsearch'ün görselleştirme katmanı — Discover ile veri keşfi, Lens ile grafik oluşturma, Dashboard ile birleştirme.

  2. Discover ad-hoc arama ve veri keşfi için — KQL ile hızlı filtreleme, field istatistikleri ve saved search özelliği.

  3. 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.

  4. Dashboard birden fazla görselleştirmeyi tek sayfada birleştirir — filtreler tüm panelleri etkiler, drilldown ile detaya inilebilir.

  5. Canvas piksel mükemmelliğinde sunum ve infografik — NOC ekranları, yönetici sunumları, branded raporlar için.

  6. Alerting kural tabanlı uyarı — log threshold, metric threshold, anomaly detection ile Slack, email, webhook entegrasyonu.