Les agents java permettent d’observer et de modifier des programmes exécutés sur une JVM. Bien que présents depuis le JDK 1.5, ils sont très peu utilisés hormis par des outils avancés comme New Relic, JProfiler ou JRebel.
A travers un exemple concret, on verra sur quels principes les agents se reposent et comment en créer un facilement.
L'exemple est un java agent qui permet de visualiser dans un navigateur web des conteneurs d'injection de dependances (Spring, CDI, Dagger, and Guice).
L'instrumentation du byte code est faite grace a Byte Buddy (http://bytebuddy.net/).
Source code : https://github.com/YoannBuch/DependencyInjectionAgent
Fait par l'equipe de http://findtheflow.io, un outil qui permet d'analyser et visualiser des executions d'applications Java.
2. Qui sommes nous ?
➔ 2 développeurs
➔ Lancent une entreprise autour d’outils de développement
http://findtheflow.io
➔ Focalisent sur la visualisation et analyse des exécutions de programmes
➔ Utilisent un java agent
Yoann Buch & Yiquan Zhou
9. Récap
➔Très simple de créer un java agent
➔Instrumentation du byte code simplifiée grâce à ASM, Byte Buddy, etc.
➔Pas limité qu’au profiling
➔Pas limité qu’à l’instrumentation du byte code
➔Non-intrusif
11. Java Agent - Hello World
public class DIAgent {
public static void premain(
String args,
Instrumentation instrumentation) {
System.out.println("Hello World from Agent");
}
}
17. Java Agent - Serveur Web embarque
public static void premain(String args, Instrumentation instrumentation) {
System.out.println("Hello World from Agent");
startWebServer();
transformClasses(instrumentation);
}
Notes de l'éditeur
Checklist:
change resolution
Presentation perspective
Close all tabs
Reset -javagent arg
Web browser open
source: http://blog.takipi.com/double-agent-java-vs-native-agents/
TODO: donner nos noms, nom de la boite, site? + redire completement pourquoi on utilise un agent, “on utilise un agent java pour collecter les evenements d’executions de programme”
2 developpeurs Java
objectif de creer une boite autour d’outils de developpement
focalise sur la collecte, stockage, visualisation et analyse des donnees d’execution de programmes => a mettre dans la slide ?
pour la partie collecte on utilise un agent java et a travers cette presentation on veut partager ce que l’on a appris
C’est utilise par pas mal d’outils bien puissants
java agent != forcement profiling
C’est pas si complique a en faire un et donc on veut encourager les gens a en faire pour des cas plus modestes
fonctionnalites transverses (IoC, logging, securite, transaction, profiling), frameworks, etc.
on ne pourrait garder dans l’application que le metier
since 1.5 java.lang.instrument
TODO: montrer byte code instructions a la place des 0 et 1 ?
Explique pourquoi c’est quelque chose d’utile
Difference statique vs dynamique
Possibilite de fixer des contraintes pour montrer que certaines techniques sont a exclure d’entree:
AOP => on ne veut pas de dependances
Generer java code ou byte code => on ne veut pas modifier le systeme de build
2 raisons :
on ne veut pas que ca aille en prod
on n’a pas forcement access au code source ou le control du systeme de build
TODO: penser a lier avec slide 5
Le point commun:
@Inject/@Autowired (merci la JSR)
Injection par constructeurs et setters
Injection par fields (pas bon mais on pourrait le gerer)
Methode:
Intercepter ces appels ou sont injecter les dependances
Creer le graphe de dependances
Notre agent va nous permettre d’inserer cette logique sans toucher a l’application !
Bien faire une pause parce que la slide d’apres est bien differente
TODO: trouver une bonne transition avec slides suivantes
Pre-compliation ? insertion source / librairie
Compilation ? ajout de byte code avec AOP
Runtime ? class loaders ou java agents
java agent : pas besoin de modifier l’application cible ou le systeme de build (plutot cool pour un outil de dev)
On part en demo live, et si ca on a des problemes on passe aux slides suivantes qui montrent le code source interessant
TODO: screenshot, lien vers findtheflow.io
agent le plus simple: premain avec un println
creation de di-agent.jar
java -jar -javaagent…
expliquer comment on cree un projet pour creer un agent, meme chose que que projet classique mais a la place d’un main on utilise un premain, etc.
expliquer parametre Instrumentation du premain
ClassFileTransformer
Montrer entree de bytes et sortie de bytes (avec rappel du schema)
Montrer que toucher directement au byte code c’est tres dur
Librairies existent : ASM (bas niveau), CGLIB, JavaAssist, mais on va utiliser Byte Buddy
Utilisation de byte buddy pour intercepter methodes annotees par @Inject et Autowired
Librarie pour comprendre/modifier byte code
Focaliser sur matchers et interceptors
Stockage des dependances en memoire
Visualisation dans les logs
Comment les visualiser dans un navigateur web ?
TODO: scinder en deux, formatter toutes les snippets, et rajouter une slide de console pour chaque
Utilisation de byte buddy pour intercepter methodes annotees par @Inject et Autowired
Librarie pour comprendre/modifier byte code
Focaliser sur matchers et interceptors
Stockage des dependances en memoire
Visualisation dans les logs
Comment les visualiser dans un navigateur web ?
Les agents ce n’est pas que pour faire de l’instrumentation de byte code
Appel d’un module qui demarre un serveur web
Une page web est maintenant disponible avec le graphe de deps
Ca part pas en prod!
Et pour finir tester agent sur spring pet clinic (version avec java config)