Étant donné qu'Elastic Stack 6.3 prend en charge Java pour APM (Beta), j'ai fait une petite recherche sur la surveillance des performances des applications.
Il surveille également Spring Pet Clinic, qui est un exemple d'application de Spring Boot.
Il existe généralement deux façons de surveiller les performances Java:
Lors de l'utilisation d'Elastic Stack, les méthodes suivantes peuvent être envisagées pour obtenir des informations relatives à Java.
Comparaison de chaque méthode
Méthode | Méthode d'enregistrement | Contenu enregistré | Ajout aux options Java | Remarques |
---|---|---|---|---|
JMX | PC connecté avec jmc | L'utilisateur définit les éléments pouvant être acquis par le serveur MBean | Ouverture et autorisations du port JMX | Inclus avec JDK |
JFR | PC avec enregistreur de vol démarré localement ou à jmc | Eléments enregistrés par JFR | Option de démarrage pour l'enregistrement JFR. Ajoutez les mêmes paramètres que JMX lors de l'enregistrement avec jmc | |
Elastic APM | Obtenez-le avec APM Client et accédez à la recherche élastique via le serveur APM | Informations pour les applications Web | Jar APM ou adresse du serveur APM | API client APM |
Metricbeat | Obtenu de Jolokia et de Metricbeat à Elasticsearch | L'utilisateur définit les éléments pouvant être acquis par le serveur MBean | Ajoutez le jar Jolokia ou ouvrez le port JMX et les autorisations | Jolokia |
Préparez l'environnement minimum en utilisant l'image officielle émise par Elastic.
https://www.docker.elastic.co/
docker-compose.yml
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.5.1
volumes:
- ./esdata:/usr/share/elasticsearch/data
ports:
- 9200:9200
kibana:
image: docker.elastic.co/kibana/kibana:6.5.1
ports:
- 5601:5601
apm:
image: docker.elastic.co/apm/apm-server:6.5.1
ports:
- 8200:8200
Cette fois, nous allons construire en utilisant OpenJDK 11 d'Ubuntu Server 18.04. Cependant, il ne peut pas être construit tel quel, donc cela prend du temps.
terminal
sudo apt install default-jdk
git clone https://github.com/spring-projects/spring-petclinic.git
cd spring-petclinic
Un tracas
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
Construire
terminal
./mvnw package
Commencez
terminal
java -jar target/*.jar
OK si vous accédez au navigateur et que l'écran s'affiche
terminal
curl -O https://search.maven.org/remotecontent?filepath=co/elastic/apm/elastic-apm-agent/1.0.1/elastic-apm-agent-1.0.1.jar
Ajoutez le client APM aux arguments d'exécution Java. Pour connaître la méthode de configuration détaillée, consultez Officiel et les instructions de configuration de Kibana.
terminal(Exemple supplémentaire)
java -javaagent:elastic-apm-agent-1.0.1.jar -Delastic.apm.service_name=petclinic -Delastic.apm.application_packages=org.example -Delastic.apm.server_urls=http://localhost:8200 -jar target/*.jar
Si PetClinic démarre, APM fonctionne correctement. S'il ne peut pas être démarré, un message d'erreur devrait s'afficher dans le terminal, vérifiez donc le message d'erreur.
Sélectionnez APM Setup Instructions from Kibana et appuyez sur le bouton Load Kibana objects en bas. En cas de succès, les données surveillées seront lues.
Capture d'écran du résultat du bon fonctionnement de l'écran Pet Clinic
Vous pouvez consulter la liste des délais moyens de traitement des demandes. Pour les demandes dont vous souhaitez vérifier les détails, vous pouvez passer à l'écran des détails en cliquant sur l'URL dans le tableau en bas de l'écran.
À partir du temps requis pour chaque processus, vous pouvez vérifier des détails tels que l'état d'émission de la requête et les paramètres de la requête.
Il existe deux types de configurations de surveillance utilisant Metricbeat.
1.Faire coexister l'application Java avec le service JVM Agent de Jolokia et war
Cette fois, je vais expliquer chacun d'eux. Étant donné que chaque méthode d'installation est différente, veuillez sélectionner en fonction de votre environnement. Par exemple, lors de la création d'un nouveau serveur, ajoutez au préalable le jar apm et le jar Jolokia aux paramètres de démarrage. Lors de l'ajout à un service existant, connectez-vous au serveur d'applications existant en utilisant le mode proxy de Jolokia, qui se connecte au serveur d'applications existant avec JMX, afin que le service existant ne soit pas affecté de manière significative.
Le plan est comme suit. Pour le premier, utilisez le mode JVM Anget. Quant à la guerre, elle n'est déployée que sur le serveur d'application, donc cette fois elle est proche de ce dernier, donc je vais l'omettre. Concernant ce dernier, nous allons l'utiliser en lançant un serveur d'applications Web léger et en y déployant war. Dans les deux cas, metricbeat sera exploité sur le même serveur.
Veuillez également vous reporter à Officiel pour savoir comment configurer Jolokia et ce que vous pouvez faire.
terminal
curl -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-6.5.1-linux-x86_64.tar.gz
Définissez l'URL de la recherche élastique.
metricbeat.yml
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["localhost:9200"]
Téléchargez l'agent JVM de Jolokia.
terminal
curl -O http://search.maven.org/remotecontent?filepath=org/jolokia/jolokia-jvm/1.6.0/jolokia-jvm-1.6.0-agent.jar
terminal
java -javaagent:jolokia-jvm-1.6.0-agent.jar -jar target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar
Si vous oubliez / à la fin, la réponse JSON ne sera pas retournée.
terminal
curl http://localhost:8778/jolokia/ | jq
Activez le module Jolokia. Cette fois, pour des raisons d'explication, les informations sur le module système ne sont pas nécessaires, il est donc désactivé.
terminal
./metricbeat modules disable system
./metricbeat modules enable jolokia
Cette fois, l'heure de démarrage de la JVM et le taux d'utilisation de la mémoire du tas sont acquis. Sélectionnez les informations que vous souhaitez acquérir en vous connectant réellement à jmc, etc.
yml:module.d/jolokia.yml
- module: jolokia
metricsets: ["jmx"]
period: 10s
hosts: ["localhost:8778"]
path: "/jolokia/?ignoreErrors=true&canonicalNaming=false"
namespace: "metrics"
jmx.mappings:
- mbean: 'java.lang:type=Runtime'
attributes:
- attr: Uptime
field: uptime
- mbean: 'java.lang:type=Memory'
attributes:
- attr: HeapMemoryUsage
field: memory.heap_usage
- attr: NonHeapMemoryUsage
field: memory.non_heap_usage
terminal
./metricbeat test modules
Je vais omettre le service de metricbeat et comment utiliser Kibana.
terminal
./metricbeat
Puisqu'il existe de nombreux paramètres, procédez dans l'ordre suivant.
Cette fois, les paramètres de démarrage minimum ont été ajoutés sans effectuer de paramètres de sécurité tels que l'authentification. Le module Jolokia de metricbeat prend en charge l'authentification par ID utilisateur et mot de passe.
termainl
java -Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar
Vérifiez la connexion à l'aide de JMC.
Comment se connecter à l'application Java cible avec JMX en utilisant le mode proxy de Jolokia Cliquez ici pour obtenir des détails techniques et des paramètres détaillés (https://jolokia.org/reference/html/proxy.html)
Téléchargez le serveur de jetée et modifiez le numéro de port, etc. Cette fois, PetClinic utilise le port 8080, alors changez-le en port 8081. Sélectionnez la version de la jetée dans Officiel selon vos besoins.
terminal
curl -O https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.14.v20181114/jetty-distribution-9.4.14.v20181114.tar.gz
tar xf jetty-distribution-9.4.14.v20181114.tar.gz
cd jetty-distribution-9.4.14.v20181114/
start.ini
## Connector port to listen on
jetty.http.port=8081
Ensuite, si vous souhaitez vous connecter en utilisant le mode proxy de Jolokia, vous devez ajouter une option. Cette fois, ajoutez les paramètres nécessaires à web.xml. De plus, la fonction d'authentification ne peut pas être activée dans cette configuration, elle est donc désactivée.
terminal
cd webapps/
curl -O http://search.maven.org/remotecontent?filepath=org/jolokia/jolokia-war/1.6.0/jolokia-war-1.6.0.war
mv jolokia-war-1.6.0.war jolokia.war
mkdir jolokia
cd jolokia
jar xf ../jolokia.war
Ajoutez les paramètres suivants dans la balise servlet.
WEB-INF/web.xml
<servlet>
<init-param>
<param-name>dispatcherClasses</param-name>
<param-value>org.jolokia.jsr160.Jsr160RequestDispatcher</param-value>
</init-param>
...
</servlet>
Désactivez la partie liée à la fonction d'authentification.
WEB-INF/web.xml
<web-app>
...
<!--
Security enabled by default. Please update to match you specific security setup (e.g. the auth-method)
-->
<!--
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>jolokia</realm-name>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>Jolokia-Agent Access</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>jolokia</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>jolokia</role-name>
</security-role>
-->
</web-app>
Si vous oubliez / à la fin, la réponse JSON ne sera pas retournée.
tarminal
curl -O http://localhost:8081/jolokia/ | jq
tarminal(demande)
curl -X POST -H 'Content-Type:application/json' -d '{"type":"read","mbean":"Tomcat:type=Server", "attribute" : "serverInfo", "target" : { "url": "service:jmx:rmi:///jndi/rmi://localhost:7091/jmxrmi" } }' http://localhost:8081/jolokia/ | jq
terminal(Exemple de résultat)
{
"request": {
"mbean": "Tomcat:type=Server",
"attribute": "serverInfo",
"type": "read",
"target": {
"url": "service:jmx:rmi:///jndi/rmi://localhost:7091/jmxrmi"
}
},
"value": "Apache Tomcat/9.0.12",
"timestamp": 1543418665,
"status": 200
}
Si les paramètres sont insuffisants, un message d'erreur s'affiche, vérifiez donc le contenu et corrigez-le.
Activez le module Jolokia. Cette fois, pour des raisons d'explication, les informations sur le module système ne sont pas nécessaires, il est donc désactivé.
terminal
./metricbeat modules disable system
./metricbeat modules enable jolokia
Cette fois, l'heure de démarrage de la JVM et le taux d'utilisation de la mémoire du tas sont acquis. Sélectionnez les informations que vous souhaitez acquérir en vous connectant réellement à jmc, etc. Nous avons également ajouté un MBean pour obtenir la version Tomcat à des fins de test afin de voir si elle est réellement récupérée à distance.
yml:module.d/jolokia.yml
- module: jolokia
metricsets: ["jmx"]
period: 10s
hosts: ["localhost:8081"]
path: "/jolokia/?ignoreErrors=true&canonicalNaming=false"
namespace: "metrics"
jmx.mappings:
- mbean: 'java.lang:type=Runtime'
attributes:
- attr: Uptime
field: uptime
target:
url: 'service:jmx:rmi:///jndi/rmi://localhost:7091/jmxrmi'
- mbean: 'java.lang:type=Memory'
attributes:
- attr: HeapMemoryUsage
field: memory.heap_usage
- attr: NonHeapMemoryUsage
field: memory.non_heap_usage
target:
url: 'service:jmx:rmi:///jndi/rmi://localhost:7091/jmxrmi'
- mbean: 'Tomcat:type=Server'
attributes:
- attr: serverInfo
field: tomcat.serverInfo
target:
url: 'service:jmx:rmi:///jndi/rmi://localhost:7091/jmxrmi'
terminal
./metricbeat test modules
À partir de là, le contrôle de fonctionnement ci-dessus est le même, il est donc omis.
En utilisant l'agent apm, j'ai pu facilement obtenir les métriques de l'application Web. J'ai trouvé que c'était très compatible avec les micro-services. Vous devriez envisager d'introduire une application Web nouvellement créée.
Le module Jolokia de metricbeat est attractif pour l'acquisition de données flexible à l'aide de MBeans. Il peut être appliqué à d'autres applications que les applications Web. Vous pouvez également obtenir des métriques pour les services existants tant que JMX est prêt.
Recommended Posts