HN เปิดตัว: FlowTracker – ติดตามการไหลของข้อมูลในโปรแกรม Java
(github.com/coekie)FlowTracker: ติดตามการไหลของข้อมูลในโปรแกรม Java
FlowTracker เป็น Java agent ที่ใช้ติดตามวิธีที่โปรแกรมอ่าน จัดการ และเขียนข้อมูล ทำให้สามารถตรวจสอบ file และ network I/O รวมถึงเชื่อมโยงอินพุตกับเอาต์พุตเพื่อแสดงให้เห็นว่าเอาต์พุตมาจากที่ใด ด้วยวิธีนี้จึงช่วยให้เข้าใจได้ว่าเอาต์พุตของโปรแกรม Java หมายถึงอะไร
เดโม
Spring PetClinic เป็นแอปพลิเคชันเดโมของเฟรมเวิร์ก Spring เพื่อสาธิตความสามารถของ FlowTracker จึงมีการสังเกตกระบวนการที่ PetClinic ประมวลผล HTTP request และสร้างหน้า HTML จากเทมเพลตและฐานข้อมูล สามารถรันเดโมในเบราว์เซอร์หรือรับชมวิดีโอได้
- การประมวลผล HTTP: FlowTracker แสดงให้เห็นว่าโค้ดส่วนใดสร้างเอาต์พุตใดขึ้นมา ตัวอย่างเช่น เมื่อคลิกที่ "HTTP/1.1" หรือ HTTP header จะเห็นได้ว่าส่วนนี้ถูกสร้างโดยคลาสในแพ็กเกจ
org.apache.coyote - เทมเพลต Thymeleaf: แสดงให้เห็นว่าอินพุตที่โปรแกรมอ่านเข้ามา (เทมเพลต HTML) เชื่อมโยงกับเอาต์พุตอย่างไร เมื่อคลิกชื่อแท็ก HTML จะเห็นได้ว่าส่วนนั้นมาจากไฟล์
layout.html - ฐานข้อมูล: แสดงให้เห็นว่าข้อมูลในตารางของหน้า HTML มาจากฐานข้อมูล ตัวอย่างเช่น เมื่อคลิก
Georgeในตาราง จะเห็นได้ว่าค่านั้นมาจากฐานข้อมูล
เดโมนี้ใช้ฐานข้อมูลในหน่วยความจำ จึงสามารถติดตามย้อนกลับไปถึง SQL script ได้ หากใช้ฐานข้อมูล MySQL ก็จะสามารถติดตามไปถึงการเชื่อมต่อฐานข้อมูลได้
วิธีใช้งาน
ปัจจุบัน FlowTracker ยังอยู่ในขั้น proof of concept และอาจทำงานได้ไม่ดีในทุกโปรแกรม นอกจากนี้ยังเพิ่ม overhead จำนวนมาก ทำให้โปรแกรมทำงานช้าลง การใช้งานทำได้โดยดาวน์โหลดไฟล์ FlowTracker agent jar แล้วเพิ่มเข้าไปใน Java command line
การทำงานภายใน
คำอธิบายแบบย่อ
FlowTracker แทรกโค้ดเข้าไปใน class file (bytecode) เพื่อติดตามข้อมูลในหน่วยความจำและแหล่งที่มาของข้อมูลนั้น โดยหลักแล้วจะติดตามข้อมูลแบบข้อความและไบนารี (String, char และอาร์เรย์ byte)
- แทนที่การเรียกเมธอดของ JDK ด้วยการเรียกเมธอดของ FlowTracker
- แทรกโค้ดในตำแหน่งสำคัญของ JDK เพื่อติดตามอินพุตและเอาต์พุต
- ทำ data flow analysis และ instrumentation ที่ลึกขึ้นเพื่อใช้ติดตามค่าของตัวแปรภายในและค่าบนสแต็กภายในเมธอด
- เพิ่มโค้ดก่อนและหลังการเรียกเมธอด รวมถึงตอนเริ่มและจบเมธอด เพื่อติดตามอาร์กิวเมนต์ของเมธอดและค่าที่ส่งกลับ
โมเดลข้อมูล: Tracker
คลาสและแนวคิดหลักในโมเดลข้อมูลของ FlowTracker:
- Tracker: เก็บข้อมูลเกี่ยวกับเนื้อหาและแหล่งที่มาของออบเจ็กต์ที่ติดตาม
- content: เนื้อหาที่ข้อมูลได้ไหลผ่าน เช่น ไบต์ทั้งหมดที่ผ่าน
InputStreamหรือOutputStream - source: เชื่อมโยงช่วงของเนื้อหาเข้ากับช่วงต้นทางของ tracker อื่น
- content: เนื้อหาที่ข้อมูลได้ไหลผ่าน เช่น ไบต์ทั้งหมดที่ผ่าน
- TrackerRepository: เก็บ global map ที่เชื่อมโยงออบเจ็กต์ที่น่าสนใจกับ tracker ของมัน
- TrackerPoint: ชี้ไปยังตำแหน่งใน tracker ที่แทนค่าพื้นฐานค่าเดียว
instrumentation พื้นฐาน
เพื่อให้ Trackers เป็นปัจจุบันอยู่เสมอ จะมีการแทรกการเรียกเมธอด hook ของ FlowTracker เมื่อมีการเรียกเมธอด JDK บางตัว ตัวอย่างเช่น การเรียก System.arraycopy จะถูกแทนที่ด้วยการเรียก com.coekie.flowtracker.hook.SystemHook.arraycopy
ค่าพื้นฐาน, data flow analysis
การติดตามค่าพื้นฐานเป็นความท้าทายที่มากกว่า ตัวอย่างเช่น ในการติดตามค่า byte จะมีการเก็บ tracker ไว้ในตัวแปรภายในเมธอด
การเรียกเมธอด
มีการสร้างโมเดลสำหรับกรณีที่ค่าพื้นฐานไหลไปยังเมธอดอื่นในรูปของอาร์กิวเมนต์และค่าที่ส่งกลับ โดยใช้ Invocation เพื่อเก็บ PointTracker ของอาร์กิวเมนต์และค่าที่ส่งกลับ
ใช้โค้ดเองเป็นแหล่งที่มา
ติดตามค่าที่มาจากตัวโค้ดเอง (เช่น ค่าคงที่แบบ primitive และ String) โดยสร้าง tracker สำหรับแต่ละคลาส และอ้างอิง tracker นั้นเมื่อมีการอ้างถึงค่าคงที่
String literal
คัดลอก String literal ใหม่ และเชื่อมโยงเนื้อหาของ String กับ ClassOriginTracker ตัวอย่างเช่น String s = "abc"; จะถูกเขียนใหม่เป็น String s = StringHook.constantString("abc", 1234, 81);
วิธีสำรองสำหรับค่าที่ไม่ได้ถูกติดตาม
ไม่ได้มีการติดตามทุกค่าในโปรแกรม หากค่าที่ไม่ได้ถูกติดตามไปถึงตำแหน่งที่ควรต้องติดตาม จะจัดการค่าดังกล่าวในลักษณะคล้ายกับค่าคงที่
สรุปโดย GN⁺
- FlowTracker ติดตามการไหลของข้อมูลในโปรแกรม Java เพื่อช่วยให้เข้าใจเอาต์พุตของโปรแกรมได้ดีขึ้น
- ผ่านเดโม Spring PetClinic สามารถดูภาพการประมวลผล HTTP request การใช้เทมเพลต และการเชื่อมต่อฐานข้อมูลได้อย่างเป็นภาพ
- ขณะนี้ยังอยู่ในขั้น proof of concept จึงอาจทำงานได้ไม่ดีในทุกโปรแกรม และมี performance overhead สูง
- ใช้ data flow analysis และการติดตามการเรียกเมธอดเพื่อติดตามที่มาของค่าพื้นฐานและออบเจ็กต์
- เครื่องมือที่มีความสามารถคล้ายกันได้แก่ Dynatrace, New Relic เป็นต้น
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
แนะนำเครื่องมือชื่อ FlowStorm สำหรับ Clojure
ชื่นชมว่าเครื่องมือใน ecosystem ของ Java/JVM ยอดเยี่ยมมาก
ประทับใจกับเดโมที่ติดตามจากองค์ประกอบ HTML ไปจนถึงคำสั่ง SQL
ชวนให้นึกถึงสภาพแวดล้อม Smalltalk
เน้นว่าวิดีโอเดโมมีประโยชน์มาก
แชร์ประสบการณ์ที่เคยทดลองแนวคิดคล้ายกับ HTML source map
กล่าวว่าคล้ายกับเดโมของ Eve-lang
จำได้ว่าเคยมีงานวิจัยที่คล้ายกับเครื่องมือสำหรับค้นหา SQL injection แบบไดนามิก
แชร์ว่าตนเองเคยมีวิสัยทัศน์เรื่องการติดตามข้อมูลบนอินเทอร์เน็ต
ขอบคุณที่พยายามใช้เครื่องมือนี้กับ VSCode และโปรเจกต์ของตน