Surveillance de l'état des applications Java à l'aide d'Elasticsearch

introduction

É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.

Comparaison des méthodes de suivi des performances

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éparation de l'environnement Kibana + Elasticsearch + APM Server

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

Construire Spring Pet Clinic

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

SpringPetClinic.png

Surveillance à l'aide d'APM

Télécharger APM

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.

Paramètres post-démarrage

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.

apm_check.png

Informations pouvant être obtenues

Capture d'écran du résultat du bon fonctionnement de l'écran Pet Clinic

Tableau de bord APM

apm_dash_1.png

Demande de statut de traitement

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.

apm_request.png

Détails de la demande

À 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.

apm_transaction_1.png apm_transaction_2.png apm_transaction_3.png

Erreur d'application Java

apm_error.png apm_error_detail.png

Surveillance à l'aide de Metricbeat

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

  1. Connectez-vous avec JMX et accédez via le mode proxy de Jolokia

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.

Paramètres initiaux de Metricbeat

terminal


curl -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-6.5.1-linux-x86_64.tar.gz

paramètres metricbeat.yml

Définissez l'URL de la recherche élastique.

metricbeat.yml


output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:9200"]

Paramètres Jolokia

1. Lors de la coexistence du service JVM Agent de Jolokia dans une application Java

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

Options Java

terminal


java -javaagent:jolokia-jvm-1.6.0-agent.jar -jar target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar

Confirmation de démarrage de Jolokia

Si vous oubliez / à la fin, la réponse JSON ne sera pas retournée.

terminal


curl http://localhost:8778/jolokia/ | jq

paramètres metricbeat pour l'agent Jolokia jvm

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

Paramètres de Jolokia.yml

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

Contrôle de fonctionnement du module Jolokia

terminal


./metricbeat test modules

Démarrez metricbeat et vérifiez son fonctionnement

Je vais omettre le service de metricbeat et comment utiliser Kibana.

terminal


./metricbeat

heap_usage.png

2. Connectez-vous avec JMX et accédez via le mode proxy de Jolokia

Puisqu'il existe de nombreux paramètres, procédez dans l'ordre suivant.

Activer JMX pour le serveur d'applications

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.

jmc.png

Connexion à un serveur d'applications en utilisant le mode proxy de Jolokia

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)

paramètres du serveur de jetée

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>

Confirmation du démarrage du serveur Jolokia

Si vous oubliez / à la fin, la réponse JSON ne sera pas retournée.

tarminal


curl -O http://localhost:8081/jolokia/ | jq

Vérification de la connexion en mode proxy du serveur Jolokia

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.

Définition du mode proxy Jolokia pour Metricbeat

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

Paramètres de jolokia.yml

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'

Contrôle de fonctionnement du module Jolokia

terminal


./metricbeat test modules

À partir de là, le contrôle de fonctionnement ci-dessus est le même, il est donc omis.

en conclusion

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

Surveillance de l'état des applications Java à l'aide d'Elasticsearch
Vérifiez l'état des applications Java sans utiliser d'outils de surveillance
Résumé de la programmation orientée objet utilisant Java
J'ai essayé d'utiliser Google HttpClient de Java
La version d'Elasticsearch que vous utilisez est-elle compatible avec Java 11?
Essayez d'utiliser le framework Java Nablarch [Application Web]
J'ai essayé d'utiliser l'API Elasticsearch en Java
ERRORCODE = -4471 se produit dans une application Java qui utilise Db2.
Mesure de la mémoire des applications Java sous Windows
Acquisition du contenu d'entrée à l'aide de Scanner (Java)
Rôle de JSP dans les applications Web [Java]
Vérification de l'impact sur les performances lors de l'utilisation de Java volatile
Essayez une recherche similaire de recherche d'images à l'aide du SDK Java [Recherche]
Un exemple où il est plus rapide d'utiliser l'addition que d'utiliser StringBuilder (Java)
Histoire de l'automatisation des tests avec Appium [Android / java]
[Java] Présentation de Java
Vérifiez l'état de l'application de la limite de débit de docker pull
[Java10] Veillez à utiliser ensemble var et génériques
Collection expirée de java
Tri à l'aide du comparateur java
Caractéristiques prévues de Java
[Java] Importance de serialVersionUID
Utilisation de l'API Java Elasticsearch (agrégation)
NIO.2 examen de Java
Avis sur Java Shilber
java --Unification des commentaires
Pratique de grattage avec Java ②
Histoire des annotations Java
Pratique du grattage avec Java ①
Examen NIO de Java
[Java] Trois fonctionnalités de Java
Résumé de l'utilisation de DBFlow
Résumé du support Java 2018
Histoire de créer une application de gestion de tâches avec Swing, Java
[Java] Méthode de comparaison de chaînes de caractères et méthode de comparaison utilisant des expressions régulières
Utilisation de plusieurs versions de Java avec Brew sur Mac + jEnv
Commande pour vérifier le nombre et l'état des threads Java
[Java] Essayez de modifier les éléments de la chaîne Json à l'aide de la bibliothèque
Opération Elasticsearch via l'API REST à l'aide d'Apache HttpClient en Java
L'histoire de la transmission de Java à Heroku à l'aide du pipeline BitBucket
Idées fausses courantes sur la limitation des ressources d'application Java lors de l'utilisation de Kubernetes