Utiliser Glowroot¶
[Glowroot] (https://glowroot.org/) est un moniteur de performance d'application Java léger qui peut être très utile pour fournir un aperçu des problèmes de performance lors de l'exécution de DHIS2.
Le but de cette page est de vous donner un aperçu rapide afin de vous aider à commencer l'utilisation de Glowroot.
Installation¶
L'installation est assez simple et est décrite dans le [wiki] Glowroot (https://github.com/glowroot/glowroot/wiki/Agent-Installation-(with-Embedded-Collector)). Nous vous conseillons de suivre leurs instructions, qui couvrent une variété d'environnements différents.
Pour une configuration de base, quelques étapes simples suffisent :
Télécharger et décompresser Glowroot¶
Sélectionnez la dernière version de Glowroot sur leur page versions , et décompressez le fichier dans l'emplacement désiré.
Exemple :
# créer un emplacement pour installer glowroot. Je vais utiliser /opt/glowroot mkdir -p /opt/glowroot # télécharger la version choisie et décompresser cd /opt/glowroot wget https://github.com/glowroot/glowroot/releases/download/v0.13.6/glowroot-0.13.6-dist.zip unzip glowroot-0.13.6-dist.zip # il devrait maintenant y avoir un fichier appelé /opt/glowroot/glowroot.jar Remarque : assurez-vous que l'utilisateur qui exécute le serveur de DHIS2 dispose d'un accès en écriture au répertoire d'installation de glowroot. Par exemple, si le serveur de DHIS2 est exécuté sous tomcat en tant qu'utilisateur `dhis` : chown -R dhis : /opt/glowroot
Configurez votre serveur DHIS2 de manière à ce qu'il utilise glowroot¶
Ajoutez -javaagent:path/to/glowroot.jar aux args JVM de vos serveurs d'application. Cette étape est bien décrite [ici] (https://github.com/glowroot/glowroot/wiki/Where-are-my-application-server's-JVM-args%3F). Vous pouvez ensuite redémarrer DHIS2 pour commencer à utiliser glowroot. Par défaut, il sera accessible sur http://localhost:4000. Dans la plupart des cas, vous voudrez y accéder à distance...
Configurer un accès externe à glowroot¶
Si vous souhaitez accéder à glowroot via un proxy inverse, tel que nginx, vous devez le configurer de manière à ce qu'il soit redirigé vers l'instance de glowroot.
Par exemple, si vous utilisez nginx, sur un hôte appelé myserver.com , et que vous voulez accéder à glowroot à https://myserver.com/glowroot Dans ce cas, vous devez mettre en place une redirection dans la configuration de votre serveur nginx, comme par exemple :
location /glowroot {
proxy_pass http://127.0.0.1:4000/glowroot;
}
glowroot, vous devez également le définir dans la configuration de glowroot. Ceci peut être modifié en créant (ou en éditant) admin.json (dans le même répertoire que glowroot.jar), par exemple dans la section web : {
"web": {
"contextPath": "/glowroot",
}
}
Définir un mot de passe administrateur¶
Définissez un mot de passe pour le compte Admin sous Administration -> Utilisateurs dans l'interface utilisateur de Glowroot.
Conseils d'utilisation¶
L'interface de Glowroot est assez intuitive, et vous êtes encouragé à l'explorer, mais voici quelques conseils concernant les éléments à rechercher.
Onglet de Transactions¶
L'onglet Transactions fournit diverses informations en temps réel sur les différentes API servies par l'application, ainsi que les requêtes associées, les temps de réponse, les traces lentes, etc. Un aperçu de l'ensemble des transactions API s'affiche dans le volet gauche et, en sélectionnant un type de transaction API individuel, une description détaillée des traces de ralentissement, des temps de réponse et des requêtes peut être affichée. La surveillance en temps réel de cet onglet permet d'identifier les performances insuffisantes d'une API spécifique. La trace lente correspondante pour l'API peut être ouverte dans l'onglet Traces lentes qui donne des informations détaillées sur l'API spécifique. Les statistiques des threads JVM et les statistiques des requêtes sont utiles si elles sont extraites de la trace lente d'une API peu performante pour comprendre si le problème se situe au niveau d'une requête lente spécifique ou s'il y a une allocation de mémoire élevée, etc.
Onglet des Erreurs¶
L'onglet Erreurs montre la pile des exceptions qui se sont produites pendant l'exécution de n'importe quelle partie du système. En général, des informations provenant d'autres onglets sont nécessaires pour obtenir une image complète.
L'onglet JVM¶
Attention
Cet onglet doit être utilisé avec précaution car il existe des options pour forcer le GC ( Collection d'ordures), ou pour prendre le Heap dump ( vidage de tas) ou le Thread dump ( vidage de threads). L'utilisation inutile de ces options ajoutera une pression supplémentaire sur la JVM !
L'onglet JVM a certaines sous-sections qui sont utiles pour connaître l'état actuel de la JVM. Une zone utile à vérifier dans l'onglet est la section Mbean tree (arbre des Mbeans). Il y a plusieurs configurations exposées par les Mbeans dans DHIS2. Certaines d'entre elles sont la configuration du pool de connexion et son état actuel. Elle montre la configuration du pool de connexion comme le maxPoolSize et d'autres paramètres ainsi que l'état en temps réel des paramètres du pool de connexion comme numBusyConnections, numConnections, numIdleConnections et ainsi de suite, ce qui donne une idée de la façon dont le pool de connexion se comporte. Si vous remarquez que numBusyConnection est égal à la configuration maxPoolSize, et si la base de données n'est pas en manque de ressources, il serait sage d'augmenter la configuration maxPoolSize de dhis2 afin que le pool de connexion disponible soit plus grand.
L'onglet Rapports¶
L'onglet Rapports peut être utilisé pour exporter n'importe quelle mesure pour une date/heure spécifique. Il permet d'exporter des mesures telles que le temps de réponse ( Moyenne ou Percentile) ou le nombre de transactions à partir de l'onglet Transactions. Il permet également d'exporter des mesures liées à l'onglet JVM, qui incluent des mesures pour les différents espaces mémoire. Dans la plupart des cas, la surveillance et l'analyse en temps réel suffiront, mais il serait bon d'évaluer si l'exportation de mesures spécifiques est nécessaire pour une référence future.
Instrumentation¶
Par défaut, glowroot regroupe toutes les demandes adressées à un point d'accès dans un groupe de transactions. Cela peut être sous-optimal dans les cas où vous voulez faire des optimisations sur un flux spécifique et que vous voulez suivre les améliorations. Dans ces cas, glowroot peut être équipé d'instruments pour séparer les demandes en différents groupes de transactions basés sur la méthode java. Cela peut être fait dans Configuration -> Instrumentation.
Exemple : séparer les GET et POST vers / les instances d'entités suivies¶
La récupération des instances d'entités suivies peut être plus lente que la création, il peut donc être utile de surveiller séparément ces types de requêtes. La configuration suivante peut être importée dans glowroot au moyen de (Instrumentation -> Import).
{
"className": "org.hisp.dhis.webapi.controller.event.TrackedEntityInstanceController",
"methodName": "getTrackedEntityInstances",
"methodParameterTypes": [
".."
],
"captureKind": "other",
"transactionType": "Web",
"transactionNameTemplate": "/api/trackedEntityInstances: GET"
}
Exemple : surveiller les requêtes asynchrones¶
Certaines requêtes asynchrones ne peuvent pas être contrôlées facilement. L'un de ces cas est l'importation d'un tracker utilisant le endpoint /tracker, avec le paramètre async fixé à true (applicable à partir de la version 2.37). C'est parce que la requête initiale ne renvoie qu'un identifiant de travail et n'attend pas que le travail se termine. Pour pouvoir surveiller le processus interne d'importation du tracker, vous devez importer la configuration suivante (`Instrumentation -> Import).
{
"className": "org.hisp.dhis.tracker.report.DefaultTrackerImportService",
"methodName": "importTracker",
"methodParameterTypes": [
".."
],
"captureKind": "transaction",
"transactionType": "Web",
"transactionNameTemplate": "/api/tracker: import",
"alreadyInTransactionBehavior": "capture-new-transaction",
"traceEntryMessageTemplate": "{{0}}",
"traceEntryStackThresholdMillis": 1000,
"traceEntryCaptureSelfNested": true,
"timerName": "Timer"
}