← Back to list

Sıfırdan Zirveye Enterprise Observability: Docker, Prometheus, Grafana ve Loki ile Çözülemeyen “No…

Gelişen mikroservis mimarilerinde ve büyük veri altyapılarında, sistemlerin anlık durumunu görememek (kör uçuşu yapmak), production…

Bengisu Bostancı · 2026-06-08 07:24 · 0 claps · 3.8 min read
#devops #grafana #loki #node-exporter #docker
Open on Medium ↗
Wiki topics: CUL · Culture & Media ☁️ · DevOps & Cloud 😂 · Humor & Satire

Sıfırdan Zirveye Enterprise Observability: Docker, Prometheus, Grafana ve Loki ile Çözülemeyen “No Labels Found” Gizemi

Gelişen mikroservis mimarilerinde ve büyük veri altyapılarında, sistemlerin anlık durumunu görememek (kör uçuşu yapmak), production ortamlarında felakete davetiye çıkarmaktır. Bir sistemin donanım metriklerini, canlı log akışlarını ve akıllı alarm mekanizmalarını tek bir merkezde toplamak, modern DevOps ve Veri Mühendisliğinin kalbidir.

Bu yazıda; Prometheus, Grafana, Loki ve Node Exporter kullanarak sıfırdan kurumsal bir Gözlemlenebilirlik (Observability) Altyapısı kuracağız. Ancak bu yazı sadece “kusursuz çalışan” bir rehber değil; Windows ortamında Docker Desktop kullanırken karşımıza çıkan inatçı kilitlenmeleri ve meşhur Grafana Loki “No labels found” hatasını nasıl gerçek bir mühendislik yaklaşımıyla çözdüğümüzün hikayesidir!

🎯 1. Projenin Amacı ve İş Hayatındaki Önemi Ne?

Büyük ölçekli veri hatlarında (Data Pipelines) veya mikroservis sistemlerinde bir hata oluştuğunda şu soruların cevabını ararız:

  • Hata anında sunucunun RAM ve CPU kullanımı ne durumdaydı? (Metrik)
  • Konteynerler o saniyede tam olarak hangi teknik hatayı fırlattı? (Log)
  • Sistem kritik eşiğe geldiğinde mühendislere haber verildi mi? (Alarm)

Bu Proje Nerelerde Kullanılır?

  • Büyük Veri & MLOps Altyapıları: Apache Spark, Kafka veya Airflow gibi dağıtık sistemlerin kaynak tüketimlerini izlemede.
  • Kurumsal Mikroservisler: Docker ve Kubernetes üzerinde koşan onlarca servisin loglarını tek bir merkezde filtrelemede.
  • Sistem Yönetimi (SysAdmin & SAP Basis): Sunucu sağlığını saniyelik takip edip kesintileri (Downtime) minimize etmede.

🏗️ 2. Mimari Yapı ve Kullanılan Teknolojiler

Altyapımızı tamamen izole ve kurumsal bir Docker köprü ağı (observability_mesh) üzerinde kurguladık:

  1. Node Exporter: İşletim sisteminin çekirdeğine inerek CPU, bellek ve disk metriklerini ham olarak toplar.
  2. Prometheus: Node Exporter’ın topladığı bu ham metrikleri belirli aralıklarla (scraping) çekip saklayan zaman serisi veritabanıdır (TSDB).
  3. Grafana Loki: Logların Prometheus’u olarak bilinir. Logları indekslemek yerine etiketleyerek (metadata) saklar ve yüksek performans sunur.
  4. Grafana: Tüm bu metrik, log ve alarmları jilet gibi arayüzlerde birleştiren merkezi izleme panelimiz.

🛠️ 3. Kurumsal Konfigürasyon: docker-compose.yml

Projemizi ayağa kaldırırken kullandığımız, her servis için merkezi loglama kuralının mühürlendiği nihaî production-ready dosyamız:

version: '3.8'

networks:
  observability_mesh:
    driver: bridge

# Konteyner loglarını doğrudan Loki'ye üfleyen sürücü tanımı
x-logging: &default-logging
  logging:
    driver: loki
    options:
      loki-url: "http://localhost:3100/loki/api/v1/push"

services:
  # 1. NODE EXPORTER
  node-exporter:
    image: prom/node-exporter:v1.8.0
    container_name: enterprise_node_exporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)'
    networks:
      - observability_mesh
    restart: unless-stopped
    <<: *default-logging

  # 2. PROMETHEUS
  prometheus:
    image: prom/prometheus:v2.51.0
    container_name: enterprise_prometheus
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
    ports:
      - "9090:9090"
    networks:
      - observability_mesh
    depends_on:
      - node-exporter
    restart: unless-stopped
    <<: *default-logging

  # 3. GRAFANA
  grafana:
    image: grafana/grafana:10.4.1
    container_name: enterprise_grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    networks:
      - observability_mesh
    depends_on:
      - prometheus
    restart: unless-stopped
    <<: *default-logging

  # 4. GRAFANA LOKI
  loki:
    image: grafana/loki:2.9.4
    container_name: enterprise_loki
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - observability_mesh
    restart: unless-stopped

volumes:
  prometheus_data:
    driver: local
  grafana_data:
    driver: local

🛑 4. Savaş Hikayesi: Karşılaştığımız Sürekli Hatalar ve Çözümleri

Mühendislik, dökümantasyondaki her şeyin tıkır tıkır çalışmadığı anlarda başlar. İşte bizim bu projede saatlerce göğüs göğüse çarpıştığımız o kritik hatalar:

Hata 1: Windows Dosya İzinleri ve Kilitlenmeler (docker compose down Çıkmazı)

Sistemi tazelemek için docker compose down --images local --volumes komutunu çalıştırdığımızda terminalden unknown flag: --images uyarısı aldık. Bazı Docker CLI sürümleri bu parametreyi doğrudan desteklemez.

  • Çözüm: İmajları ve diskleri güvenli bir şekilde eritmek için doğru sözdiziminin **docker compose down --rmi local --volumes** olduğunu saptadık ve kilitli kalıntıları temizledik.

Hata 2: Loki Bağlantı Kilitleri (“Unable to connect with Loki”)

Sıfırlama sonrası Grafana arayüzünden Loki’ye bağlanmak istediğimizde kırmızı bir hata kutusu bizi karşıladı: “Unable to connect with Loki.” Windows dosya sistemi, Docker birimleri (volumes) üzerindeki kilitleri bırakmadığı için Loki diske yazma yapamıyor ve çöküyordu.

  • Çözüm: Loki’nin command satırındaki depolama parametrelerini en yalın hale getirerek, Windows izin engellerine çalım attık ve Loki'nin tamamen stabil ve hafif çalışmasını sağladık. Tarayıcıda http://localhost:3100/ready adresinde **ready** mesajını mühürledik.

🔍 Hata 3: Büyük Kabus — Label Browser’ın Bir Türlü Açılmaması ve “No Labels Found” Krizi

Gözlemlenebilirlik ağımız ayaktaydı, Grafana Loki’ye yeşil ışık yakarak bağlanmıştı. Ancak Grafana **Explore sekmesine gidip `Label browser` butonuna tıkladığımızda saatlerce o sinir bozucu hatayı gördük: "No labels found."**

Loki oradaydı, Grafana oradaydı ama içeride tek bir etiket (container_name, job vb.) yoktu. Bu kör noktayı tam 3 aşamalı bir mühendislik hamlesiyle çözdük:

1. Perde: Eksik Docker Log Sürücüsünün Keşfi

Terminalde docker plugin disable loki --force komutunu verdiğimizde acı gerçekle yüzleştik: plugin "loki" not found. Bilgisayarımızda Docker'ın logları yakalayıp Loki'ye üfleyecek bir sürücü eklentisi (driver) kurulmamıştı! Hemen sistem düzeyinde eklentiyi kurduk:

docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions

2. Perde: YAML Dosyasındaki Gizli Bağlantı (YAML Anchors)

Eklentiyi kurmak yetmezdi; Docker konteynerlerine loglarını bu eklentiye basması gerektiğini söylemeliydik. docker-compose.yml dosyamızın tepesine x-logging objesini tanımladık ve izlemek istediğimiz her servisin altına **<<: *default-logging** köprüsünü miras bıraktık.

3. Perde: Hard Reset ve Mutlu Son

Tüm bu ayarlardan sonra köprülerin uyanması için konteynerleri tamamen aşağı çekip zorla yeniden oluşturduk:

docker compose down --volumes
docker compose up -d

Grafana Explore ekranına dönüp Label browser butonuna tıkladığımızda; container_name, compose_project gibi tüm kurumsal etiketler jilet gibi listelendi! container_name -> enterprise_grafana -> Show Logs dediğimiz an canlı log şelalesi ekranda akmaya başladı.

🚨 5. Proaktif Yaklaşım: Akıllı Alarm (Alerting) Katmanı

Sadece izlemek yetmez, sistem kendi kendini korumalıydı. Grafana üzerinde kurumsal bir alarm kuralı (Alert Rule) kurguladık.

  • Kural: Enterprise_Alerts adında yeni bir klasör ve dakikalık kontrol sağlayan ram-check-group oluşturduk.
  • Eşik Değer (Threshold): Eğer test makinemizin RAM kullanımı %50'nin üzerine çıkarsa (IS ABOVE 50), alarm durumu 5 dakika beklemek yerine 1 dakika içinde (Pending -> Firing) kırmızıya dönecek şekilde optimize edildi.

🎯 Sonuç ve Kazanımlar

Bu projenin sonunda, bir production ortamında karşılaşılabilecek en zorlu senaryolardan birini simüle ettik. Windows işletim sisteminin dosya sınırlarını, Docker eklenti mimarisini ve Grafana Loki’nin etiketleme mantığını derinlemesine tecrübe ettik.

Artık arkamızda; metrikleriyle canlı grafik çizen, loglarıyla satır satır konuşan ve anomalilerde alarm fırlatan canavar gibi bir altyapı var!

Eğer siz de mikroservislerinizde “No labels found” hatasıyla boğuşuyorsanız, Docker sürücülerinizi ve YAML miras yapılarınızı kontrol etmeyi unutmayın! Sorularınızı yorumlarda tartışabiliriz. 🛠️


메타데이터
post_id
bb64c35824f9
slug
sıfırdan-zirveye-enterprise-observability-docker-prometheus-grafana-ve-loki-ile-çözülemeyen-no-bb64c35824f9
url
https://medium.com/@bengisubostanci0/s%C4%B1f%C4%B1rdan-zirveye-enterprise-observability-docker-prometheus-grafana-ve-loki-ile-%C3%A7%C3%B6z%C3%BClemeyen-no-bb64c35824f9
canonical_url
https://medium.com/@bengisubostanci0/s%C4%B1f%C4%B1rdan-zirveye-enterprise-observability-docker-prometheus-grafana-ve-loki-ile-%C3%A7%C3%B6z%C3%BClemeyen-no-bb64c35824f9
author_url
https://medium.com/@bengisubostanci0
status
ok
fetched_at
2026-06-20 20:29:01