HN ओपन: FlowTracker – Java प्रोग्रामों में डेटा फ्लो ट्रैकिंग
(github.com/coekie)FlowTracker: Java प्रोग्रामों में डेटा फ्लो ट्रैकिंग
FlowTracker एक Java agent है, जो यह ट्रैक करता है कि कोई प्रोग्राम डेटा को कैसे पढ़ता, बदलता और लिखता है। इससे file और network I/O की जांच की जा सकती है, और input व output को जोड़कर यह दिखाया जा सकता है कि output कहाँ से आया। इसके जरिए Java प्रोग्राम के output का मतलब समझना आसान होता है।
डेमो
Spring PetClinic, Spring framework का एक demo application है। FlowTracker की क्षमताएँ दिखाने के लिए, इसमें यह देखा जाता है कि PetClinic कैसे HTTP requests को प्रोसेस करता है और templates व database से HTML pages बनाता है। आप browser में demo चला सकते हैं या वीडियो देख सकते हैं।
- HTTP प्रोसेसिंग: FlowTracker दिखाता है कि किस code ने कौन-सा output बनाया। उदाहरण के लिए, यदि आप
"HTTP/1.1"या HTTP header पर क्लिक करें, तो आप देख सकते हैं कि यह हिस्साorg.apache.coyotepackage की classes द्वारा बनाया गया है। - Thymeleaf templates: यह दिखाता है कि प्रोग्राम द्वारा पढ़ा गया input (HTML template) output से कैसे जुड़ता है। HTML tag name पर क्लिक करने से आप देख सकते हैं कि वह हिस्सा
layout.htmlfile से आया है। - Database: यह दिखाता है कि HTML page की table में मौजूद जानकारी database से आई है। उदाहरण के लिए, table में
Georgeपर क्लिक करने से आप देख सकते हैं कि वह value database से आई है।
यह demo in-memory database का उपयोग करता है, इसलिए SQL scripts तक भी ट्रैक किया जा सकता है। यदि MySQL database इस्तेमाल किया जाए, तो database connection तक भी ट्रैक किया जा सकता है।
उपयोग
FlowTracker अभी proof-of-concept चरण में है, इसलिए यह हर प्रोग्राम में ठीक से काम नहीं कर सकता। यह काफी overhead भी जोड़ता है, जिससे प्रोग्राम की execution धीमी हो जाती है। इसे इस्तेमाल करने के लिए FlowTracker agent jar file डाउनलोड करें और उसे Java command line में जोड़ें।
अंदरूनी काम करने का तरीका
संक्षिप्त विवरण
FlowTracker class files (bytecode) में code inject करके memory में मौजूद data और उसके source को ट्रैक करता है। यह मुख्य रूप से text और binary data (String, char और byte arrays) को ट्रैक करता है।
- JDK method calls को FlowTracker के method calls से replace करता है।
- JDK के महत्वपूर्ण स्थानों पर code inject करके input और output को ट्रैक करता है।
- Method के अंदर local variables और stack की values को ट्रैक करने के लिए data flow analysis और गहरी instrumentation करता है।
- Method call से पहले और बाद में, तथा method की शुरुआत और अंत में code जोड़कर method arguments और return values को ट्रैक करता है।
डेटा मॉडल: Tracker
FlowTracker के data model की मुख्य classes और concepts:
- Tracker: ट्रैक किए जा रहे object की content और source की जानकारी रखता है।
- content: वह content जिससे data गुज़रा है। उदाहरण:
InputStreamयाOutputStreamसे गुज़रे सभी bytes। - source: content की range को दूसरे trackers की source range से जोड़ता है।
- content: वह content जिससे data गुज़रा है। उदाहरण:
- TrackerRepository: एक global map रखता है, जो दिलचस्प objects और उनके trackers को जोड़ता है।
- TrackerPoint: tracker के भीतर उस स्थान को इंगित करता है जो एक single primitive value को दर्शाता है।
बेसिक instrumentation
Trackers को up-to-date रखने के लिए, कुछ खास JDK method calls पर FlowTracker के hook method calls डाले जाते हैं। उदाहरण के लिए, System.arraycopy call को com.coekie.flowtracker.hook.SystemHook.arraycopy call से replace किया जाता है।
Primitive values, data flow analysis
Primitive values को ट्रैक करना एक बड़ी चुनौती है। उदाहरण के लिए, byte value को ट्रैक करने के लिए method के भीतर local variables में trackers स्टोर किए जाते हैं।
Method calls
यह मॉडल करता है कि primitive values method calls के arguments और return values के रूप में दूसरे methods तक कैसे बहते हैं। Arguments और return values के PointTracker को स्टोर करने के लिए Invocation का उपयोग किया जाता है।
Source के रूप में code का उपयोग
यह उन values को ट्रैक करता है जो code से ही आती हैं, जैसे primitive और String constants। हर class के लिए एक tracker बनाया जाता है, और जब constants refer किए जाते हैं, तब उस tracker को refer किया जाता है।
String literals
String literals की नई copy बनाई जाती है, और String की content को ClassOriginTracker से जोड़ा जाता है। उदाहरण के लिए, String s = "abc"; को String s = StringHook.constantString("abc", 1234, 81); में rewrite किया जाता है।
Untracked values के लिए fallback तरीका
प्रोग्राम की हर value को ट्रैक नहीं किया जाता। जब कोई untracked value ऐसी जगह पहुँचती है जहाँ ट्रैकिंग ज़रूरी है, तो उसे constant की तरह treat किया जाता है।
GN⁺ का सार
- FlowTracker, Java प्रोग्रामों के data flow को ट्रैक करके प्रोग्राम के output को समझने में मदद करता है।
- Spring PetClinic demo के जरिए HTTP request processing, template उपयोग और database integration को विज़ुअली देखा जा सकता है।
- यह अभी proof-of-concept चरण में है, इसलिए हर प्रोग्राम में अच्छी तरह काम नहीं कर सकता और performance overhead काफ़ी अधिक है।
- Data flow analysis और method call tracking के जरिए primitive values और objects के source को ट्रैक किया जाता है।
- मिलती-जुलती क्षमताओं वाले tools में Dynatrace, New Relic आदि शामिल हैं।
1 टिप्पणियां
Hacker News टिप्पणियाँ
Clojure के लिए FlowStorm नाम का एक टूल पेश किया गया
Java/JVM ecosystem के टूल्स की बहुत प्रशंसा की गई
HTML element से SQL statement तक trace करने वाला demo प्रभावशाली लगा
Smalltalk environment की याद दिलाता है
demo video बहुत उपयोगी होने पर ज़ोर दिया गया
HTML source maps जैसे concept पर प्रयोग करने का अनुभव साझा किया गया
Eve-lang demo से मिलती-जुलती चीज़ बताई गई
SQL injection को dynamic तरीके से खोजने वाले टूल जैसा एक paper याद होने की बात कही गई
इंटरनेट पर मौजूद data को trace करने का vision रखने का अनुभव साझा किया गया
VSCode और अपने project में इस टूल को आज़माने की कोशिश के लिए आभार जताया गया