HN público: FlowTracker – Rastreo del flujo de datos en programas Java
(github.com/coekie)FlowTracker: Rastreo del flujo de datos en programas Java
FlowTracker es un agente de Java que rastrea cómo un programa lee, manipula y escribe datos. Esto permite identificar I/O de archivos y red, y conectar la entrada con la salida para mostrar de dónde proviene la salida. Así se puede entender qué significa la salida de un programa Java.
Demo
Spring PetClinic es una aplicación de demostración del framework Spring. Para mostrar las capacidades de FlowTracker, se observa cómo PetClinic procesa solicitudes HTTP y genera páginas HTML a partir de plantillas y la base de datos. Puedes ejecutar la demo en el navegador o ver el video.
- Procesamiento HTTP: FlowTracker muestra qué código generó qué salida. Por ejemplo, si haces clic en
"HTTP/1.1"o en un encabezado HTTP, puedes ver que esa parte fue generada por clases del paqueteorg.apache.coyote. - Plantillas Thymeleaf: Muestra cómo la entrada que leyó el programa (la plantilla HTML) se conecta con la salida. Si haces clic en el nombre de una etiqueta HTML, puedes ver que esa parte provino del archivo
layout.html. - Base de datos: Muestra que la información en la tabla de la página HTML provino de la base de datos. Por ejemplo, si haces clic en
Georgeen la tabla, puedes ver que ese valor vino de la base de datos.
Esta demo usa una base de datos en memoria, por lo que incluso se puede rastrear hasta los scripts SQL. Si se usa una base de datos MySQL, también se puede rastrear hasta la conexión con la base de datos.
Uso
FlowTracker se encuentra actualmente en etapa de prueba de concepto, por lo que puede no funcionar bien con todos los programas. También añade mucho overhead, lo que hace más lenta la ejecución del programa. Se usa descargando el archivo jar del agente FlowTracker y agregándolo a la línea de comandos de Java.
Cómo funciona internamente
Explicación simple
FlowTracker inyecta código en archivos de clase (bytecode) para rastrear los datos en memoria y su origen. Principalmente rastrea datos de texto y binarios (String, arreglos de char y byte).
- Reemplaza llamadas a métodos del JDK por llamadas a métodos de FlowTracker.
- Inyecta código en puntos clave del JDK para rastrear entradas y salidas.
- Realiza análisis de flujo de datos e instrumentación más profunda para rastrear valores de variables locales y de la pila dentro de los métodos.
- Agrega código antes y después de las llamadas a métodos, así como al inicio y al final de los métodos, para rastrear argumentos y valores de retorno.
Modelo de datos: Tracker
Clases y conceptos centrales del modelo de datos de FlowTracker:
- Tracker: conserva información sobre el contenido del objeto rastreado y su origen.
- content: el contenido por el que pasaron los datos. Ejemplo: todos los bytes que pasaron por un
InputStreamoOutputStream. - source: conecta rangos del contenido con rangos de origen de otros trackers.
- content: el contenido por el que pasaron los datos. Ejemplo: todos los bytes que pasaron por un
- TrackerRepository: mantiene un mapa global que vincula objetos de interés con sus trackers.
- TrackerPoint: apunta a una ubicación dentro de un tracker que representa un solo valor primitivo.
Instrumentación básica
Para mantener los trackers actualizados, se insertan llamadas a métodos hook de FlowTracker cuando se invocan ciertos métodos del JDK. Por ejemplo, una llamada a System.arraycopy se reemplaza por una llamada a com.coekie.flowtracker.hook.SystemHook.arraycopy.
Valores primitivos, análisis de flujo de datos
Rastrear valores primitivos es un reto mayor. Por ejemplo, para rastrear un valor byte, se almacena un tracker en variables locales dentro del método.
Llamadas a métodos
Modela cómo los valores primitivos fluyen hacia otros métodos como argumentos y valores de retorno en llamadas a métodos. Usa Invocation para almacenar PointTracker de argumentos y valores de retorno.
Usar el propio código como origen
Rastrea valores que provienen del propio código (por ejemplo, constantes primitivas y constantes String). Crea un tracker para cada clase y hace referencia a ese tracker cuando se referencia una constante.
Literales String
Copia de nuevo los literales String y conecta el contenido del String con ClassOriginTracker. Por ejemplo, String s = "abc"; se reescribe como String s = StringHook.constantString("abc", 1234, 81);.
Método alternativo para valores no rastreados
No rastrea todos los valores del programa. Cuando un valor no rastreado llega a un lugar que debería rastrearse, se trata de forma similar a una constante.
Resumen de GN⁺
- FlowTracker rastrea el flujo de datos de programas Java para ayudar a entender la salida del programa.
- Con la demo de Spring PetClinic se puede verificar visualmente el procesamiento de solicitudes HTTP, el uso de plantillas y la integración con la base de datos.
- Actualmente está en etapa de prueba de concepto, puede no funcionar bien en todos los programas y tiene un alto overhead de rendimiento.
- Rastrea el origen de valores primitivos y objetos mediante análisis de flujo de datos y seguimiento de llamadas a métodos.
- Herramientas con funciones similares incluyen Dynatrace y New Relic.
1 comentarios
Opiniones de Hacker News
Se presenta una herramienta llamada FlowStorm para Clojure
Elogia lo excelentes que son las herramientas del ecosistema Java/JVM
Queda impresionado por la demo que rastrea desde elementos HTML hasta sentencias SQL
Le recuerda al entorno Smalltalk
Enfatiza que el video demo es muy útil
Comparte que experimentó con un concepto similar a HTML source maps
Menciona que es similar a una demo de Eve-lang
Recuerda un artículo similar a una herramienta que encuentra dinámicamente inyecciones SQL
Comparte que tuvo la visión de rastrear datos en internet
Agradece el intento de usar esta herramienta con VSCode y en proyectos