HN’de yayımlandı: FlowTracker – Java programlarında veri akışını izleme
(github.com/coekie)FlowTracker: Java programlarında veri akışını izleme
FlowTracker, bir Java ajanıdır ve programın verileri nasıl okuduğunu, işlediğini ve yazdığını izler. Bu sayede dosya ve ağ G/Ç’sini inceleyebilir, girdiler ile çıktıları birbirine bağlayarak çıktının nereden geldiğini gösterebilir. Böylece bir Java programının çıktısının ne anlama geldiğini anlamaya yardımcı olur.
Demo
Spring PetClinic, Spring framework’ünün demo uygulamasıdır. FlowTracker’ın yeteneklerini göstermek için, PetClinic’in HTTP isteklerini işleyip şablonlar ve veritabanından HTML sayfaları oluşturma süreci gözlemlenir. Demoyu tarayıcıda çalıştırabilir veya videoyu izleyebilirsiniz.
- HTTP işleme: FlowTracker, hangi kodun hangi çıktıyı ürettiğini gösterir. Örneğin,
HTTP/1.1veya HTTP başlıklarından birine tıklarsanız, bu bölümünorg.apache.coyotepaketindeki sınıflar tarafından üretildiğini görebilirsiniz. - Thymeleaf şablonları: Programın okuduğu girdinin (HTML şablonunun) çıktıyla nasıl bağlandığını gösterir. HTML etiket adlarına tıklarsanız, ilgili kısmın
layout.htmldosyasından geldiğini görebilirsiniz. - Veritabanı: HTML sayfasındaki tablodaki bilgilerin veritabanından geldiğini gösterir. Örneğin, tablodaki
Georgedeğerine tıklarsanız, bu değerin veritabanından geldiğini görebilirsiniz.
Bu demo, bellek içi bir veritabanı kullandığından SQL script’lerine kadar izleme yapabilir. MySQL veritabanı kullanıldığında ise veritabanı bağlantısına kadar izleme mümkündür.
Kullanım
FlowTracker şu anda kavram kanıtlama aşamasındadır; bu nedenle her programda iyi çalışmayabilir. Ayrıca önemli ölçüde ek yük getirerek programın daha yavaş çalışmasına neden olur. Kullanmak için FlowTracker ajan jar dosyasını indirip Java komut satırına eklemeniz gerekir.
Nasıl çalışır
Kısa açıklama
FlowTracker, sınıf dosyalarına (bytecode) kod enjekte ederek bellekteki verileri ve bunların kaynaklarını izler. Başlıca metin ve ikili verileri (String, char ve byte dizileri) takip eder.
- JDK metot çağrılarını FlowTracker metot çağrılarıyla değiştirir.
- Girdi ve çıktıyı izlemek için JDK’nin önemli noktalarına kod enjekte eder.
- Metotlar içinde yerel değişkenler ve stack üzerindeki değerleri izlemek için veri akışı analizi ve daha derin enstrümantasyon uygular.
- Metot argümanlarını ve dönüş değerlerini izlemek için metot çağrılarının öncesine ve sonrasına, ayrıca metotların başlangıcına ve sonuna kod ekler.
Veri modeli: Tracker
FlowTracker’ın veri modelindeki temel sınıflar ve kavramlar:
- Tracker: İzlenen nesnenin içeriği ve kaynağı hakkında bilgi tutar.
- content: Verinin içinden geçtiği içerik. Örn.
InputStreamveyaOutputStreamiçinden geçen tüm baytlar. - source: İçerik aralıklarını, diğer tracker’ların kaynak aralıklarıyla ilişkilendirir.
- content: Verinin içinden geçtiği içerik. Örn.
- TrackerRepository: İlgi çekici nesneleri ve bunların tracker’larını ilişkilendiren global bir harita tutar.
- TrackerPoint: Tek bir ilkel değeri temsil eden tracker içindeki bir konumu işaret eder.
Temel enstrümantasyon
Tracker’ları güncel tutmak için, belirli JDK metot çağrılarında FlowTracker’ın hook metot çağrıları eklenir. Örneğin, System.arraycopy çağrısı com.coekie.flowtracker.hook.SystemHook.arraycopy çağrısıyla değiştirilir.
İlkel değerler, veri akışı analizi
İlkel değerleri izlemek daha büyük bir zorluktur. Örneğin, bir byte değerini izlemek için metot içinde yerel değişkenlerde tracker bilgisi saklanır.
Metot çağrıları
İlkel değerlerin metot çağrılarının argümanları ve dönüş değerleri olarak başka metotlara akışı modellenir. Bunun için argümanların ve dönüş değerlerinin PointTracker bilgilerini saklayan Invocation kullanılır.
Kaynak olarak kodun kendisini kullanma
Kodun kendisinden gelen değerler de izlenir (ör. ilkel sabitler ve String sabitleri). Her sınıf için bir tracker oluşturulur ve sabite başvurulduğunda ilgili tracker referans alınır.
String sabitleri
String sabitleri yeniden kopyalanır ve String içeriği ClassOriginTracker ile ilişkilendirilir. Örneğin, String s = "abc"; ifadesi String s = StringHook.constantString("abc", 1234, 81); olarak yeniden yazılır.
İzlenmeyen değerler için yedek yaklaşım
Programdaki tüm değerler izlenmez. İzlenmeyen bir değer, izlenmesi gereken bir noktaya ulaştığında sabitlere benzer şekilde ele alınır.
GN⁺ özeti
- FlowTracker, Java programlarındaki veri akışını izleyerek program çıktısını anlamaya yardımcı olur.
- Spring PetClinic demosu üzerinden HTTP istek işleme, şablon kullanımı ve veritabanı entegrasyonu görsel olarak incelenebilir.
- Araç şu anda kavram kanıtlama aşamasındadır; her programda sorunsuz çalışmayabilir ve yüksek performans ek yükü vardır.
- Veri akışı analizi ve metot çağrısı takibi sayesinde ilkel değerlerin ve nesnelerin kaynakları izlenebilir.
- Benzer işlevler sunan araçlar arasında Dynatrace ve New Relic bulunur.
1 yorum
Hacker News yorumu
Clojure için FlowStorm adlı bir araçtan bahsediliyor
Java/JVM ekosistemindeki araçlar çok iyi diye övülüyor
HTML öğelerinden SQL sorgularına kadar izleme yapan demo etkileyici bulunuyor
Smalltalk ortamını hatırlattığı belirtiliyor
Demo videosunun çok faydalı olduğu özellikle vurgulanıyor
HTML source map'e benzer bir kavramı deneme deneyimi paylaşılıyor
Eve-lang demosuna benzediği söyleniyor
SQL injection'ı dinamik olarak bulan bir araca benzer bir makalenin hatırlandığı belirtiliyor
İnternetteki verileri izleme vizyonuna sahip olma deneyimi paylaşılıyor
Bu aracı VSCode ve projelerde deneme girişimi için teşekkür ediliyor