SlideShare une entreprise Scribd logo
1  sur  17
Java Agent
en Action
Source: http://blog.takipi.com/double-agent-java-vs-native-agents/
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
Java Agents
JRebel
JProfiler
Plumbr
New Relic
AppDynamics
Dynatrace
DripStat
Chronon
Jacoco
Takipi
XRebel
VisualVM
Cobertura
Le votre ?
YourKit
> java -jar application.jar
> java -jar -javaagent:agent.jar application.jar
Mission : créer un outil de développement
➔Spring
➔CDI
➔Dagger
➔Guice
Visualiser des conteneurs
d’injection de dépendances
Par où commencer ?
class CustomerController {
@Inject
public CustomerController(
ShoppingService shoppingService) {
...
}
}
class CustomerController {
@Inject
public CustomerController(
ShoppingService shoppingService) {
// DependencyGraph.addDependency(this, shoppingService);
…
}
}
Démo
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
Source code can be found on http://findtheflow.io
Java Agent - Hello World
public class DIAgent {
public static void premain(
String args,
Instrumentation instrumentation) {
System.out.println("Hello World from Agent");
}
}
Java Agent - Hello World
Java Agent - Instrumentation du byte code
instrumentation.addTransformer(new ClassFileTransformer() {
@Override
public byte[] transform(
ClassLoader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
// Return modified or unchanged classfileBuffer
return classfileBuffer;
}
});
Java Agent - Byte Buddy
new AgentBuilder.Default().type(getTypeMatchers()).transform(new Transformer() {
@Override
public Builder<?> transform(Builder<?> builder, TypeDescription typeDescription) {
return builder
.invokable(isAnnotatedWith(named(INJECT_ANNOTATION))
.or(isAnnotatedWith(named(AUTOWIRED_ANNOTATION))))
.intercept(SuperMethodCall.INSTANCE
.andThen(MethodDelegation.to(InjectionInterceptor.class)));
}
}).installOn(instrumentation);
Java Agent - Byte Buddy
public class InjectionInterceptor {
public static void intercept(
@This Object currentInstance,
@AllArguments Object[] injectedInstances) {
DependencyGraphService.addDependency(currentInstance,
injectedInstances);
}
}
Java Agent - Byte Buddy
Java Agent - Serveur Web embarque
public static void premain(String args, Instrumentation instrumentation) {
System.out.println("Hello World from Agent");
startWebServer();
transformClasses(instrumentation);
}

Contenu connexe

Similaire à Java Agent en Action

Google Cloud Endpoints - DevFest - Nantes 2012
Google Cloud Endpoints -  DevFest - Nantes 2012Google Cloud Endpoints -  DevFest - Nantes 2012
Google Cloud Endpoints - DevFest - Nantes 2012Maxime Gréau
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueRossi Oddet
 
Ce qu'il faut retenir de la FrenchKit iOS
Ce qu'il faut retenir de la FrenchKit iOSCe qu'il faut retenir de la FrenchKit iOS
Ce qu'il faut retenir de la FrenchKit iOSNiji
 
Developpement dun site_web_developpement
Developpement dun site_web_developpementDeveloppement dun site_web_developpement
Developpement dun site_web_developpementmosalah38
 
Developpement_dun_site_web_Developpement.pdf
Developpement_dun_site_web_Developpement.pdfDeveloppement_dun_site_web_Developpement.pdf
Developpement_dun_site_web_Developpement.pdfSofianeHassine2
 
Selenium WebDriver avec Java
Selenium WebDriver avec Java Selenium WebDriver avec Java
Selenium WebDriver avec Java Ahmed HARRAK
 
AFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIAFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIRomain Cambien
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
20100225 Ippon Osgi Are You Ready
20100225 Ippon Osgi Are You Ready20100225 Ippon Osgi Are You Ready
20100225 Ippon Osgi Are You ReadyGeoffray Gruel
 
Hibernate Native : télécharger et configurer
Hibernate Native : télécharger et configurerHibernate Native : télécharger et configurer
Hibernate Native : télécharger et configurerProfLibre
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreStéphane Traumat
 
Application Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateApplication Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateInes Ouaz
 
Presentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationPresentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationStéphane Traumat
 
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016Tarik Zakaria Benmerar
 
Jquery
JqueryJquery
Jquerykrymo
 

Similaire à Java Agent en Action (20)

Soiree Maven 2
Soiree Maven 2Soiree Maven 2
Soiree Maven 2
 
Google Cloud Endpoints - DevFest - Nantes 2012
Google Cloud Endpoints -  DevFest - Nantes 2012Google Cloud Endpoints -  DevFest - Nantes 2012
Google Cloud Endpoints - DevFest - Nantes 2012
 
gradle_lavajug
gradle_lavajuggradle_lavajug
gradle_lavajug
 
Gradle_LyonJUG
Gradle_LyonJUGGradle_LyonJUG
Gradle_LyonJUG
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratique
 
Ce qu'il faut retenir de la FrenchKit iOS
Ce qu'il faut retenir de la FrenchKit iOSCe qu'il faut retenir de la FrenchKit iOS
Ce qu'il faut retenir de la FrenchKit iOS
 
Developpement dun site_web_developpement
Developpement dun site_web_developpementDeveloppement dun site_web_developpement
Developpement dun site_web_developpement
 
Developpement_dun_site_web_Developpement.pdf
Developpement_dun_site_web_Developpement.pdfDeveloppement_dun_site_web_Developpement.pdf
Developpement_dun_site_web_Developpement.pdf
 
Selenium WebDriver avec Java
Selenium WebDriver avec Java Selenium WebDriver avec Java
Selenium WebDriver avec Java
 
AFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIAFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open API
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
20100225 Ippon Osgi Are You Ready
20100225 Ippon Osgi Are You Ready20100225 Ippon Osgi Are You Ready
20100225 Ippon Osgi Are You Ready
 
Hibernate Native : télécharger et configurer
Hibernate Native : télécharger et configurerHibernate Native : télécharger et configurer
Hibernate Native : télécharger et configurer
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libre
 
Cv analyste programmeur
Cv analyste programmeurCv analyste programmeur
Cv analyste programmeur
 
Application Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateApplication Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & Hibernate
 
gradle_nantesjug
gradle_nantesjuggradle_nantesjug
gradle_nantesjug
 
Presentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationPresentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub Foundation
 
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
Web Components et Polymer 2 - GDG Algiers DevFest 2016 - 3 Décembre 2016
 
Jquery
JqueryJquery
Jquery
 

Java Agent en Action

  • 1. Java Agent en Action Source: http://blog.takipi.com/double-agent-java-vs-native-agents/
  • 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
  • 4. > java -jar application.jar
  • 5. > java -jar -javaagent:agent.jar application.jar
  • 6. Mission : créer un outil de développement ➔Spring ➔CDI ➔Dagger ➔Guice Visualiser des conteneurs d’injection de dépendances
  • 7. Par où commencer ? class CustomerController { @Inject public CustomerController( ShoppingService shoppingService) { ... } } class CustomerController { @Inject public CustomerController( ShoppingService shoppingService) { // DependencyGraph.addDependency(this, shoppingService); … } }
  • 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
  • 10. Source code can be found on http://findtheflow.io
  • 11. Java Agent - Hello World public class DIAgent { public static void premain( String args, Instrumentation instrumentation) { System.out.println("Hello World from Agent"); } }
  • 12. Java Agent - Hello World
  • 13. Java Agent - Instrumentation du byte code instrumentation.addTransformer(new ClassFileTransformer() { @Override public byte[] transform( ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { // Return modified or unchanged classfileBuffer return classfileBuffer; } });
  • 14. Java Agent - Byte Buddy new AgentBuilder.Default().type(getTypeMatchers()).transform(new Transformer() { @Override public Builder<?> transform(Builder<?> builder, TypeDescription typeDescription) { return builder .invokable(isAnnotatedWith(named(INJECT_ANNOTATION)) .or(isAnnotatedWith(named(AUTOWIRED_ANNOTATION)))) .intercept(SuperMethodCall.INSTANCE .andThen(MethodDelegation.to(InjectionInterceptor.class))); } }).installOn(instrumentation);
  • 15. Java Agent - Byte Buddy public class InjectionInterceptor { public static void intercept( @This Object currentInstance, @AllArguments Object[] injectedInstances) { DependencyGraphService.addDependency(currentInstance, injectedInstances); } }
  • 16. Java Agent - Byte Buddy
  • 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

  1. 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/
  2. 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
  3. 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
  4. TODO: montrer byte code instructions a la place des 0 et 1 ?
  5. 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
  6. 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)
  7. On part en demo live, et si ca on a des problemes on passe aux slides suivantes qui montrent le code source interessant
  8. TODO: screenshot, lien vers findtheflow.io
  9. 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.
  10. 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
  11. 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 ?
  12. 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 ?
  13. 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)