2 puntos por GN⁺ 2024-09-15 | 1 comentarios | Compartir por WhatsApp

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 paquete org.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 George en 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 InputStream o OutputStream.
    • source: conecta rangos del contenido con rangos de origen de otros trackers.
  • 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

 
GN⁺ 2024-09-15
Opiniones de Hacker News
  • Se presenta una herramienta llamada FlowStorm para Clojure

    • Hace un fork del compilador oficial de Clojure e inserta bytecode adicional
    • Como la mayoría de los valores son inmutables, se pueden tomar snapshots manteniendo punteros
    • Se proporciona un enlace a una demo de depuración de una app web: Demo de FlowStorm
  • Elogia lo excelentes que son las herramientas del ecosistema Java/JVM

    • Le impresionó a un nivel similar a jitwatch
    • FlowTracker le recuerda al análisis de taint
    • Palabras clave relacionadas: "dynamic taint tracking/analysis"
    • Enlaces a proyectos relacionados:
  • Queda impresionado por la demo que rastrea desde elementos HTML hasta sentencias SQL

    • Una herramienta así podría convertirse en la primera línea de defensa para resolver bugs
  • Le recuerda al entorno Smalltalk

    • Se pueden rastrear e interactuar todos los objetos y mensajes
  • Enfatiza que el video demo es muy útil

    • Sería útil al explorar una base de código desconocida
  • Comparte que experimentó con un concepto similar a HTML source maps

    • Las herramientas de desarrollo web se beneficiarían enormemente de este tipo de propiedades full-stack
    • Integrarlo en frameworks existentes es un gran desafío
    • Enlace a proyecto relacionado: 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

    • Es un paso hacia rastrear el origen de una imagen o la ruta de una cadena de texto
  • Agradece el intento de usar esta herramienta con VSCode y en proyectos

    • Actualmente está en pausa, pero planea volver a intentarlo