DEV Community

Emin Şahin
Emin Şahin

Posted on

Türkiye'de Sentry Logları Neden Dashboardda Görünmüyor?

Geliştirdiğim yeni uygulamada hata takibi için kullandığım Firebase Crashlytics'i bırakıp Sentry'e geçmeye karar verdim. Her şey çok standart ve kolay görünüyordu ancak Türkiye'deki internet servis sağlayıcılarının az bilinen bir engeline takılacağımı hiç tahmin etmemiştim. Saatlerimi çalan bu DNS yönlendirme (hijack) sorunu ve Sentry destek ekibinden gelen o tek kelimelik çözümü, benzer bir durum yaşayanlar için paylaşmak istedim.

Neden Sentry'ye Geçmek İstedim?

Uygulamada zaten Firebase ekosistemini (Auth, Firestore, Remote Config vs.) kullanıyorum. Hata takibi için de başlangıçta Crashlytics kullanıyordum. Ama proje büyüdükçe Crashlytics'in sunduğu hata gruplandırmaları bana yetersiz gelmeye başladı. Hem daha detaylı stack trace görebilmek hem de projeyi tamamen Firebase'e bağımlı yapmamak (vendor lock-in) için Sentry daha mantıklı geldi.

Kod tarafında Clean Architecture kullandığım için geçiş çok rahattı. Loglama işlerini soyutladığım için sadece arka plandaki entegrasyonu Sentry ile değiştirmem yetti.

Ortada Hata Var, Log Yok

Entegrasyonu bitirdim ve test etmek için bilerek bir hata fırlattım.

final sentryId = await Sentry.captureException(exception, stackTrace: stack);
print('Sentry Event ID: $sentryId');
Enter fullscreen mode Exit fullscreen mode

Konsolda Sentry'nin bana verdiği Event ID sorunsuz yazdırıldı. SDK hatayı yakalamış ve sunucuya iletmiş gibi görünüyordu. Ancak Sentry paneline girdiğimde hiçbir issue göremiyordum. Ekranda hâla "Kuruluma Başla" adımları duruyordu.

Filtreler mi yanlış, DSN(Data Source Name) adresini mi eksik kopyaladım derken panelde hiçbir sorun bulamadım.

Debug Modunu Açınca Gelen Gerçek

SDK'nın arka planda ne yaptığını anlamak için Sentry'nin debug modunu aktif ettim. Önce Flutter konsolunda ağ isteklerini görmeyi bekledim ama hiçbir şey çıkmadı. Sentry, debug loglarını Flutter'a değil, doğrudan native platform konsollarına (iOS için Xcode) yazdırıyormuş.

Xcode konsolunu açtığımda asıl hatayı gördüm: İstekler zaman aşımına (timeout) uğruyordu.

NSURLErrorDomain Code=-1001 "The request timed out."
NSErrorFailingURLStringKey=[https://o4506359996481536.ingest.us.sentry.io/api/.../envelope/](https://o4506359996481536.ingest.us.sentry.io/api/.../envelope/)
Enter fullscreen mode Exit fullscreen mode

İşin Aslı: DNS Engeli

Sorunun kodda değil ağda olduğunu anlayınca, Mac terminalinden Sentry adresine bir curl isteği attım; o da başarısız oldu. Sonra aklıma "Acaba DNS mi engelli?" sorusu geldi ve nslookup ile bir test yaptım.

Kendi internetimle sorguladığımda, İSS'lerin yasaklı siteleri yönlendirdiği Türkiye IP'si (195.175.254.2) döndü. Aynı sorguyu Google DNS (8.8.8.8) ile yapınca ise gerçek IP adresi (34.160.81.0) karşıma çıktı.

Durum netti: Türkiye'deki servis sağlayıcılar *.sentry.io domainini ulusal çapta, DNS seviyesinde engellemişti. Telefonun mobil verisinden denedim, orada da durum aynıydı.

Beni Oyalayan Yanlış İzler

Tabii sorunun kaynağını bulana kadar biraz zaman kaybettim:

  • Port Çakışması: Arka planda 443 portunda çalışan lokal bir SQL sunucusu vardı. İlk başta isteklerin bu yüzden kendi ağımda kaybolduğunu sandım.
  • VPN Yanılgısı: "VPN açarsam kesin düzelir" deyip denedim ama yine olmadı. Çünkü Mac'in DNS önbelleği eski IP'yi tutmaya devam ediyordu (dscacheutil -flushcache ile temizlemem gerekti).
  • Emülatör Sorunu: DNS'i temizlesem bile Android emülatörü ağı açılışta aldığı için eski ayarlarla kalmıştı. Emülatörü tamamen yeniden başlatmam gerektiğini geç fark ettim.

Destek Ekibinden Gelen Çözüm

Sorunu çözmek için Firebase Cloud Functions ile bir proxy yazmayı bile denedim. Yaklaşık 15 satırlık bir kodla istekleri *.cloudfunctions.net üzerinden geçirdim ve çalıştı. Ancak bu sefer de her log, Firebase faturama trafik maliyeti olarak yansıyacaktı. Son çare olarak Crashlytics'e geri dönmeyi düşünürken, Sentry destek ekibine bir e-posta attım.

Birkaç saat içinde döndüler ve çözüm son derece basitti: DSN adresindeki ingest.us.sentry.io kısmını ingest.tr.sentry.io yapmak.

Yeni DSN ile uygulamayı tekrar çalıştırdım ve her şey düzeldi. Bu subdomain, arka planda yine aynı IP adresine gidiyor ama İSS'lerin engelleme listesine takılmadığı için bağlantı sorunsuz kuruluyor.

Son Durum ve Tavsiye

Remote Config Kullanımı: Yeni .tr domaininin de bir gün engellenme ihtimaline karşı, DSN adresini artık Firebase Remote Config üzerinden uygulamaya veriyorum. Böylece yeni bir sorun çıkarsa mağazaya güncelleme göndermeden adresi değiştirebilirim.

Özetle, Türkiye'de Sentry kullanıyorsanız veya uygulamanızın Türkiye'den kullanıcıları varsa, varsayılan olarak gelen ABD sunucu adresi (US domain) çalışmıyor. Mutlaka .tr uzantılı ingest adresini kullanın. Ayrıca ağ isteklerinde anlam veremediğiniz timeout hataları alıyorsanız, nslookup domain.com 8.8.8.8 komutunu denemek sizi saatlerce debug yapmaktan kurtarabilir.

Top comments (0)