HN en accès libre : FlowTracker – suivi du flux de données dans les programmes Java
(github.com/coekie)FlowTracker : suivi du flux de données d’un programme Java
FlowTracker est un agent Java qui suit la manière dont un programme lit, manipule et écrit des données. Il permet d’inspecter les E/S de fichiers et réseau, et relie les entrées aux sorties pour montrer d’où provient une sortie. Cela aide à comprendre ce que signifie la sortie d’un programme Java.
Démo
Spring PetClinic est une application de démonstration du framework Spring. Pour montrer les capacités de FlowTracker, on observe comment PetClinic traite des requêtes HTTP et génère des pages HTML à partir de modèles et de la base de données. Vous pouvez lancer la démo dans le navigateur ou regarder la vidéo.
- Traitement HTTP : FlowTracker montre quel code a produit quelle sortie. Par exemple, si vous cliquez sur
"HTTP/1.1"ou sur des en-têtes HTTP, vous pouvez voir que cette partie a été générée par des classes du packageorg.apache.coyote. - Modèles Thymeleaf : il montre comment l’entrée lue par le programme (le modèle HTML) est reliée à la sortie. En cliquant sur le nom d’une balise HTML, vous pouvez voir que cette partie provient du fichier
layout.html. - Base de données : il montre que les informations présentes dans le tableau de la page HTML proviennent de la base de données. Par exemple, si vous cliquez sur
Georgedans le tableau, vous pouvez voir que cette valeur vient de la base de données.
Cette démo utilise une base de données en mémoire, ce qui permet de remonter jusqu’aux scripts SQL. En utilisant une base de données MySQL, il est possible de remonter jusqu’à la connexion à la base.
Utilisation
FlowTracker est actuellement au stade de preuve de concept et peut ne pas bien fonctionner avec tous les programmes. Il ajoute également beaucoup d’overhead, ce qui ralentit l’exécution du programme. Il s’utilise en téléchargeant le fichier jar de l’agent FlowTracker et en l’ajoutant à la ligne de commande Java.
Fonctionnement interne
Explication simple
FlowTracker injecte du code dans les fichiers de classes (bytecode) pour suivre les données en mémoire et leur origine. Il suit principalement les données textuelles et binaires (String, tableaux de char et de byte).
- Il remplace les appels de méthodes du JDK par des appels aux méthodes de FlowTracker.
- Il injecte du code à des endroits clés du JDK pour suivre les entrées et les sorties.
- Il effectue une analyse de flux de données et une instrumentation plus poussée afin de suivre les valeurs des variables locales et de la pile dans les méthodes.
- Il ajoute du code avant et après les appels de méthode, ainsi qu’au début et à la fin des méthodes, pour suivre les arguments et les valeurs de retour.
Modèle de données : Tracker
Classes et concepts au cœur du modèle de données de FlowTracker :
- Tracker : conserve des informations sur le contenu d’un objet suivi et sur son origine.
- content : le contenu qui a traversé les données. Exemple : tous les octets passés par un
InputStreamou unOutputStream. - source : relie des plages de contenu à des plages source d’autres trackers.
- content : le contenu qui a traversé les données. Exemple : tous les octets passés par un
- TrackerRepository : contient une map globale reliant les objets intéressants à leurs trackers.
- TrackerPoint : pointe vers une position dans un tracker représentant une seule valeur primitive.
Instrumentation de base
Pour garder les trackers à jour, FlowTracker insère des appels à ses méthodes hook lors de certains appels de méthodes du JDK. Par exemple, un appel à System.arraycopy est remplacé par un appel à com.coekie.flowtracker.hook.SystemHook.arraycopy.
Valeurs primitives, analyse de flux de données
Le suivi des valeurs primitives est un défi plus important. Par exemple, pour suivre une valeur byte, le tracker est stocké dans une variable locale à l’intérieur de la méthode.
Appels de méthode
Il modélise la manière dont les valeurs primitives circulent vers d’autres méthodes comme arguments d’appel et valeurs de retour. Invocation est utilisé pour stocker les PointTracker des arguments et des valeurs de retour.
Utiliser le code lui-même comme origine
Il suit les valeurs provenant du code lui-même, comme les constantes primitives et les constantes String. Un tracker est créé pour chaque classe, et ce tracker est référencé lorsqu’une constante est utilisée.
Littéraux String
Les littéraux String sont recopiés, et le contenu de la chaîne est relié à ClassOriginTracker. Par exemple, String s = "abc"; est réécrit en String s = StringHook.constantString("abc", 1234, 81);.
Méthode de repli pour les valeurs non suivies
Toutes les valeurs du programme ne sont pas suivies. Lorsqu’une valeur non suivie atteint un emplacement qui doit être suivi, elle est traitée de manière similaire à une constante.
Résumé de GN⁺
- FlowTracker suit le flux de données des programmes Java pour aider à comprendre la sortie du programme.
- La démo Spring PetClinic permet de visualiser le traitement des requêtes HTTP, l’utilisation des modèles et l’intégration avec la base de données.
- L’outil est actuellement au stade de preuve de concept, peut ne pas bien fonctionner sur tous les programmes et entraîne un overhead de performance important.
- Il suit l’origine des valeurs primitives et des objets via l’analyse de flux de données et le suivi des appels de méthode.
- Des outils proposant des fonctionnalités similaires incluent Dynatrace et New Relic.
1 commentaires
Commentaires sur Hacker News
Présentation d’un outil appelé FlowStorm pour Clojure
Éloge de l’excellente qualité des outils de l’écosystème Java/JVM
Impressionné par la démo qui suit un élément HTML jusqu’à une requête SQL
Cela rappelle l’environnement Smalltalk
Insiste sur le fait que la vidéo de démo est très utile
Partage une expérience d’expérimentation d’un concept similaire aux source maps HTML
Mentionne une similarité avec la démo Eve-lang
Se souvient d’un article similaire sur un outil permettant de détecter dynamiquement les injections SQL
Partage avoir eu une vision consistant à tracer les données sur Internet
Remercie pour l’idée d’essayer cet outil avec VSCode et dans un projet