🔍 Veri Analizi Raporu

Muzibu Admin Panel
Saat 15 Sonrası Veri Düşüşü Analizi

20 Şubat 2026 tarihinde saat 15:00 sonrası gözlemlenen keskin düşüşün teknik analizi

Sorun Tespit Edildi

Veri kaybı yok! Bu bir görsel anomali. Dashboard bileşeni bugünün verilerini gösterirken şu anki saati hariç tutuyor. Saat 15:00'da sadece 0-14 saatlerin verileri gösterildiği için grafikte düşüş gibi görünüyor.

Sebep
Tasarım Kararı
Veri Kaybı
❌ Yok
Etki
Görsel

📝 Basit Anlatım

Ne Oldu?

Muzibu admin panelinde günlük dinleme istatistiklerini gösteren grafikte, saat 15:00'dan sonra aniden düşüş gözlemlendi. Bu, sanki kullanıcılar müzik dinlemeyi bırakmış gibi görünüyordu.

Gerçek Sebep Nedir?

Dashboard (yönetim paneli) bugünün verilerini gösterirken, henüz tamamlanmamış saatin verilerini göstermiyor. Böylece yanıltıcı istatistikler oluşmasını engelliyor.

Örnek: Saat 15:30'da bakıyorsanız, 15. saat henüz tamamlanmadığı için sadece 0-14 saatlerin (00:00-14:59) verileri gösterilir. 15. saat (15:00-15:59) hariç tutulur.

Neden Keskin Düşüş Görünüyor?

Saat tam 15:00'a geldiğinde sistem "artık 15. saatteyiz, bu saati göstermeyelim" diyor. O ana kadar 14. saat gösteriliyordu, şimdi hariç tutuluyor. Bu geçiş anında grafikte düşüş gibi görünüyor.

Saat Sistem Saati Gösterilen Saatler Görsel Etki
14:45 14 0-13 saatler ✓ Normal
15:00 15 0-14 saatler ⚠️ Düşüş (14. saat hariç)
15:30 15 0-14 saatler − Stabil (değişim yok)
16:00 16 0-15 saatler ✓ İyileşme (14-15 geri döner)

İyi Haber!

  • Hiçbir veri kaybı yok
  • Kullanıcılar normal şekilde müzik dinlemeye devam ediyor
  • Veritabanında tüm kayıtlar mevcut
  • Bu sadece grafiğin gösterim şekliyle ilgili

Neden Böyle Tasarlanmış?

Henüz tamamlanmamış bir saatin verilerini göstermek yanıltıcı olabilir. Örneğin saat 15:10'da 15. saati gösterseniz, sadece 10 dakikalık veri olacağı için çok düşük görünür. Bu yüzden tamamlanmamış saat hariç tutuluyor.

🔧 Teknik Detaylar

Route ve Controller Akışı

Route
/admin/muzibu
Controller
Modules/Muzibu/routes/admin.php:15
DashboardController@index()
View
resources/views/admin/dashboard-index.blade.php
Livewire Component
Modules/Muzibu/App/Http/Livewire/Admin/DashboardComponent.php

Veri Kaynağı

Model
Modules/Muzibu/App/Models/SongPlay.php
Tablo
muzibu_song_plays
Alanlar
id - Primary key
song_id - Çalınan şarkı ID
user_id - Dinleyen kullanıcı
ip_address - IP adresi
created_at - Dinleme zamanı
listened_duration - Dinleme süresi
✓ Not
Tabloda deleted_at alanı yok. Soft delete kullanılmıyor, veri kaybı riski yok.

🚨 Kritik Kod Bloğu (Root Cause)

Dosya: DashboardComponent.php
// Satır 127
$currentHour = $date->isToday() ? now()->hour : 24;

// Satır 134-135 - hourlyStats() metodunda
->when($date->isToday(), function($q) use ($currentHour) {
    $q->whereRaw('HOUR(created_at) < ?', [$currentHour]);
})

Mantık Açıklaması

  • Eğer seçilen tarih bugün ise: now()->hour kullan
  • Eğer geçmiş tarih ise: 24 kullan (tüm gün)
  • Sorgu: HOUR(created_at) < currentHour
  • Şu anki saat hariç tutulur (küçüktür operatörü kullanıldığı için)

Saat 15:00'daki Durum

now()->hour = 15
$currentHour = 15
HOUR(created_at) < 15 → Sadece 0-14 saatler (00:00-14:59)
Sonuç: 15. saat (15:00-15:59) hariç tutulur → Grafikte düşüş görünümü

İki Farklı Hesaplama Metodu

A. listeningStats() - Genel İstatistikler

// Satır 97
$endOfDay = now()->subHour()->endOfHour();

Bugün ise son saati hariç tutar (performans optimizasyonu)

B. hourlyStats() - Saatlik Grafik

// Satır 127
$currentHour = $date->isToday() ? now()->hour : 24;

// Satır 135
$q->whereRaw('HOUR(created_at) < ?', [$currentHour]);

Şu anki saati hariç tutar

Cron Job Taraması

Kernel.php içinde tanımlı tüm zamanlanmış görevler tarandı:

Saat Görev Durum
02:00 Log cleanup, Telescope prune ✓ İlgisiz
03:00 (Pazar) Session cleanup ✓ İlgisiz
06:00 Subscription verification, renewal ✓ İlgisiz
09:00 Trial expiry check ✓ İlgisiz
10:00 Renewal reminders ✓ İlgisiz
15:00 - Hiçbir görev yok - ❌ Cron job sebep değil
Her 5/10/15 dk Queue health, statistics ✓ İlgisiz
Saatlik Blog generation, Subscription transitions ✓ İlgisiz
✓ Sonuç
15:00'da çalışan herhangi bir cron job yok. Düşüş cron job'dan kaynaklanmıyor.

Cache Mekanizması

// DashboardComponent.php, satır 43-46
private function cacheTTL(): int
{
    return 300; // 5 dakika
}

Dashboard istatistikleri 5 dakikalık cache ile saklanıyor. Bu cron job'larla ilgili değil.

Aynı Mantığın Kullanıldığı Diğer Dosyalar

ListeningHistoryComponent.php
Satırlar 199-207 - İdentik currentHour logiği

📊 Saat Bazlı Durum Analizi

Sistem Saati now()->hour $currentHour SQL Koşulu Gösterilen Saatler Görsel Etki
14:45 14 14 HOUR < 14 0-13 saatler (00:00-13:59) ✓ Normal
15:00 15 15 HOUR < 15 0-14 saatler (00:00-14:59) ⚠️ DÜŞÜŞ
15:30 15 15 HOUR < 15 0-14 saatler (00:00-14:59) − Stabil
16:00 16 16 HOUR < 16 0-15 saatler (00:00-15:59) ✓ İyileşme
16:30 16 16 HOUR < 16 0-15 saatler (00:00-15:59) ✓ Normal
⚠️ Kritik Nokta
Saat 15:00'da sistem saati 15'e geçtiği için 15. saat hariç tutulur. 14. saat verileri de kaybolur, bu yüzden keskin düşüş görünür.
− Stabil Dönem
15:00-15:59 arası tüm dakikalarda aynı durum devam eder. Yeni veri eklense bile grafikte değişiklik olmaz.
✓ İyileşme
Saat 16:00'da sistem 16'ya geçince 14. ve 15. saatlerin verileri grafikte geri döner.

💡 İyileştirme Önerileri

1️⃣

Şu Anki Saati Dahil Etme (Kısmi Veri)

Henüz tamamlanmamış saatin verilerini "kısmi" olarak göster. Kullanıcı güncel durumu görebilir.

// Değişiklik önerisi
$currentHour = $date->isToday() ? now()->hour + 1 : 24;
// Veya
$q->whereRaw('HOUR(created_at) <= ?', [$currentHour]);
2️⃣

Visual Indicator Ekle

Grafikte "Mevcut saat tamamlanmamış, kısmi veriler gösteriliyor" notu ekle.

💡 Örnek: "15:00-15:59 verisi henüz tamamlanmadı, gösterilen veriler kısmidir."
3️⃣

Tamamlanan vs. Tamamlanmamış Ayırımı

Grafikte tamamlanan saatler düz çizgi, tamamlanmamış saat kesikli çizgi ile göster.

Tamamlanan
Tamamlanmamış
4️⃣

Cache Süresini Uzat

5 dakika yerine 10-15 dakika cache kullan. Sunucu yükünü azaltır, görsel anomali sıklığını düşürür.

private function cacheTTL(): int
{
    return 900; // 15 dakika
}

Özet ve Sonuç

Root Cause (Ana Sebep)

DashboardComponent.hourlyStats() ve listeningStats() metodlarının bugünün mevcut saatini hariç tuttuğu logic'te saklıdır. Bu performans ve doğruluk için tasarımsal bir seçim olabilir.

Veri Durumu

  • Veritabanında tüm veriler mevcut
  • Hiçbir veri silinmedi
  • Soft delete yok
  • Cron job etkisi yok

Görsel Anomali

  • Sadece grafik gösteriminde sorun
  • Her saat başında tekrarlanır
  • Kullanıcı etkinliği normal
  • Sistem sağlıklı çalışıyor

Aksiyon Önerileri

1
Öncelik: Kullanıcı Bilgilendirme

Dashboard'a "Bugünün mevcut saati tamamlanmamış veriler içerir" notu ekle

2
Orta Vadeli: Logic Değişikliği

Şu anki saati de dahil et ama "kısmi" olarak işaretle

3
Uzun Vadeli: Visual Indicator

Tamamlanan/tamamlanmamış saatleri farklı görselleştir

✓ Sistem Sağlıklı

Tespit edilen durum bir bug değil, performans ve doğruluk için alınmış tasarımsal bir karardır. Veri kaybı, güvenlik açığı veya sistem hatası yoktur. Kullanıcılar normal şekilde müzik dinlemeye devam ediyor.