L'outil open source de vérification des problèmes d'Alibaba ne fonctionnera pas? Voici la meilleure pratique!

L'outil open source de vérification des problèmes d'Alibaba ne fonctionnera pas? Voici la meilleure pratique!

△ Hollis, une personne avec une quête unique de codage △
L'outil open source de vérification des problèmes d'Alibaba ne fonctionnera pas?  Voici la meilleure pratique!
C'est le 291e
auteur original de partage de la
source de Hollis l Wang Ji l Hollis (ID: hollischuang)

Mise en route étape
installation

https://arthas.gitee.io/install-detail.html La
commande ci-dessus téléchargera le fichier de script de démarrage as.sh dans le répertoire courant. La méthode d'exécution:

curl -L https://alibaba.github.io/arthas/install.sh | sh

as.sh démarre:


curl -sk https://arthas.gitee.io/arthas-boot.jar -o ~/.arthas-boot.jar  && echo "alias as.sh='java -jar ~/.arthas-boot.jar --repo-mirror aliyun --use-http'" >> ~/.bashrc && source ~/.bashrc

Expérience de tutoriel en ligne

https://alibaba.github.io/arthas/arthas-tutorials?language=cn
bien sûr, vous pouvez également en faire l'expérience localement ~ en téléchargeant une démo d'expérience arthas-idea-plugin directement pour commencer localement
https://github.com/ Description de
la commande globale WangJi92 / arthas-plugin-demo :

-x 是展示结果属性遍历深度,默认为 1
-n 是执行的次数 ,q 退出

-c classloader 的hash值

退出 q ,关闭 stop

Comprendre les fonctions de suivi et de surveillance les plus couramment utilisées

Watch and Trace sont les fonctions les plus couramment utilisées dans le diagnostic arthas pour les développeurs pour résoudre des problèmes en ligne! Exemple de
trace de
base:

trace com.wangji92.arthas.plugin.demo.controller.CommonController getRandomInteger -n 5 '1==1'

https://arthas.gitee.io/trace.html

  • Optimisation des performances ~
  • Quel est le processus spécifique de cette méthode appelé! Il peut être vu à travers la chaîne d'appels.
  • S'il y a une exception, vous pouvez afficher les
    fonctions avancées de la pile d'exceptions : La
    commande trace ne suivra que les sous-appels dans la fonction correspondante et ne suivra pas plusieurs niveaux vers le bas. Étant donné que la trace est plus coûteuse, la trace multicouche peut entraîner un grand nombre de classes et de fonctions à tracer.
    Exemple:
    trace -E xxxClassA|xxxClassB method1 | method2

    Tel que:

    trace -E com.wangji92.arthas.plugin.demo.controller.CommonController|com.wangji92.arthas.plugin.demo.service.ArthasTestService traceE|doTraceE -n 5 '1==1'

    watch
    https://arthas.gitee.io/watch.html
    wathc est littéralement compris comme les informations de la valeur d'observation, vous pouvez afficher les paramètres d'entrée, les valeurs de retour, les exceptions, vous pouvez exécuter des expressions pour obtenir des variables statiques et target.xxx appelle l'implémentation cible Les champs, méthodes, etc. sont corrects ~ tant que vous ne voulez rien obtenir d'impossible ~
    exemple de base:

watch com.wangji92.arthas.plugin.demo.controller.CommonController traceE '{params,returnObj,throwExp}' -n 5 -x 3 '1==1'

variables de base de l'expression arthas


public class Advice {

    private final ClassLoader loader;

    private final Class<?> clazz;

    private final ArthasMethod method;

    private final Object target;

    private final Object[] params;

    private final Object returnObj;

    private final Throwable throwExp;

    private final boolean isBefore;

    private final boolean isThrow;

    private final boolean isReturn;

    // getter/setter  

}  

À partir de watch et trace, nous pouvons voir que le '1 == 1' suivant exécute une expression conditionnelle. Lorsque la valeur est true, une expression ognl est exécutée, watch observe params, returnObj, throwExp input parameters, return value, si L'exception est aussi une expression, alors que se passe-t-il?
Les expressions Spring el
n'ont pas étudié ognl. Spring qui l'a utilisé pendant de nombreuses années doit connaître ses expressions el. Il existe également un concept dans les expressions el appelé [Contexte et expression] comme indiqué ci-dessous, car le contexte simple peut être résolu. " La signification du script "booleanList [0]" ~ Ceci est très familier et facile à comprendre, donc les expressions ognl ne sont pas difficiles.

class Simple {

    public List<Boolean> booleanList = new ArrayList<Boolean>();

}

Simple simple = new Simple();

simple.booleanList.add(true);

StandardEvaluationContext simpleContext = new StandardEvaluationContext(simple);

// false is passed in here as a string. SpEL and the conversion service will

// correctly recognize that it needs to be a Boolean and convert it

parser.parseExpression("booleanList[0]").setValue(simpleContext, "false");

// b will be false

Boolean b = simple.booleanList.get(0);

L'expression
ognl arthas est la même, sauf qu'un script appelé ognl est utilisé. Les variables de base sont son contexte, et ces champs peuvent être obtenus directement. Les champs params, returnObj et throwExp que watch observe sont ce que nous appelons le concept de contexte, observant des informations sur les paramètres, les valeurs de retour et les exceptions.
Voici le code pour l'évaluation des expressions et l'observation de la montre dans le code source arthas! Le conseil est un contexte, et une variable const est ajoutée ici. N'est-ce pas si simple après avoir su cela? ?
com.taobao.arthas.core.advisor.ReflectAdviceListenerAdapter # isConditionMet

/**

 * 判断条件是否满足,满足的情况下需要输出结果

 * @param conditionExpress 条件表达式

 * @param advice 当前的advice对象

 * @param cost 本次执行的耗时

 * @return true 如果条件表达式满足

 */

protected boolean isConditionMet(String conditionExpress, Advice advice, double cost) throws ExpressException {

    return StringUtils.isEmpty(conditionExpress) ||

            ExpressFactory.threadLocalExpress(advice).bind(Constants.COST_VARIABLE, cost).is(conditionExpress);

}

protected Object getExpressionResult(String express, Advice advice, double cost) throws ExpressException {

    return ExpressFactory.threadLocalExpress(advice)

            .bind(Constants.COST_VARIABLE, cost).get(express);

}

Expression pratique
arthas group demande souvent comment juger des méthodes surchargées, rien de plus que des conditions d'évaluation? Le nombre de paramètres et quel est le premier paramètre? Le type de valeur de retour, etc. peut être utilisé comme conditions d'évaluation. Dans la montre suivante, la première section est la valeur observée et la dernière section est l'évaluation de l'expression, qui n'est exécutée que lorsque les conditions sont remplies.
La longueur du paramètre d'entrée est supérieure à 0:

watch com.wangji92.arthas.plugin.demo.controller.CommonController traceE '{params,returnObj,throwExp}' -n 5 -x 3 'params.length >0'

La valeur de retour est String et la longueur est supérieure à 5:

watch com.wangji92.arthas.plugin.demo.controller.CommonController traceE '{params,returnObj,throwExp}' -n 5 -x 3 'returnObj instanceof java.lang.String && returnObj.length>5'

Les expressions conditionnelles + les tâches asynchrones
n'ont des bogues que dans des scénarios spécifiques Comment résoudre les bogues?
Comment résoudre le problème qui n'apparaît qu'une ou deux fois par jour?
Les expressions conditionnelles sont principalement utilisées pour le filtrage. Par exemple, certains scénarios n'apparaissent que dans des paramètres spécifiques et il faudra beaucoup de temps pour attendre. À ce stade, vous pouvez utiliser le filtrage d'expressions conditionnelles + les tâches asynchrones.

expression ognl

https://arthas.gitee.io/ognl.html
D'après ce qui précède, ognl est omnipotent dans watch and trace. En fait, tt utilise également des expressions ognl pour exécuter la logique. @ xxxClas @ xxxStaticField est la syntaxe des variables statiques Sugar ognl, regardez bien la documentation officielle.
Pour une utilisation spéciale de OGNL, veuillez vous référer à: https://github.com/alibaba/arthas/issues/71
Obtention de variables statiques Les variables
statiques peuvent être chargées par plusieurs chargeurs de classe dans un jvm, et le jvm est reconnu comme une instance est chargé par un chargeur de classe, il a donc besoin Connaître la valeur de hachage de la classe statique actuelle (sc -d com.wangji92.arthas.plugin.demo.controller.StaticTest) peut être obtenue via cette commande.

ognl  -x  3 '@com.wangji92.arthas.plugin.demo.controller.StaticTest@INVOKE_STATIC_DOUBLE' -c e374b99

Appelez la méthode Spring?
watch exécute la syntaxe ognl pour obtenir le contexte spring puis appelle la méthode bean

watch -x 3 -n 1 
org.springframework.web.servlet.DispatcherServlet doDispatch '@org.springframework.web.context.support.WebApplicationContextUtils@getWebApplicationContext(params[0].getServletContext()).getBean("commonController").getRandomInteger()'

ognl exécute un contexte de ressort statique puis appelle les méthodes bean

ognl -x 3 '#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getBean("commonController").getRandomInteger()' -c e374b99

Envie de décoller, omnipotent! Le principe est que vous devez maîtriser une grammaire simple d'ognl!

Achevée

Pour le dépannage en ligne, je pense que ces commandes sont suffisantes pour vous.Il existe d'autres décompilations, graphiques de flamme, .. tunnel temporel, modification du niveau de l'enregistreur, informations d'environnement jvm, etc. Je pense qu'il n'y a pas de fréquences au-dessus. Haut, après tout, les informations JVM sont spécialement surveillées ~ Même sans arthas, vous pouvez trouver de meilleurs outils pour analyser la pile et les pannes JVM.
Certains cas d'utilisateurs particuliers méritent d'être étudiés et réfléchis: https://github.com/alibaba/arthas/issues?q=label%3Auser-case est
terminé?
quelle? Je ne me souviens pas de tant de commandes, et une certaine syntaxe ognl avancée est cool ... Et si vous voulez obtenir toutes les variables d'environnement Spring? Je n'ai pas assez expérimenté ces deux commandes, trace et montre? Comment puis-je être plus avancé! D'accord, veuillez voir ci-dessous.


Prémisse avancée

Le principe est que vous avez une compréhension générale d'arthas, les commandes de base sont quelque peu conceptuelles et la syntaxe simple de ognl peut être comprise. Des expressions conditionnelles simples seront utilisées. Nous avons déjà dit qu'il y a tellement de commandes dans les arthas, il est donc indispensable de se souvenir d'un petit livre! Je me sens mal à l'aise et je veux pleurer ~ Ne vous inquiétez pas, frère Wang résoudra le problème pour vous.
À l'heure actuelle, les outils officiels d'Arthas ne sont pas assez simples. Certaines commandes doivent être mémorisées, en particulier certaines grammaires de haut niveau qui sont particulièrement extensibles, comme ognl pour obtenir le contexte du printemps et faire ce qu'ils veulent, regarder et tracer ne sont pas assez simples, et certaines informations sur les outils de commande doivent être construites. Vous n'avez besoin que d'un plug-in capable de gérer simplement les informations de chaîne. Lorsqu'il s'agit de problèmes en ligne, les commandes les plus rapides et les plus pratiques sont nécessaires, de sorte que le plugin arthas idea a toujours un sens et une valeur.
Le sens du plugin arthas idea
n'est pas de traiter des problèmes au niveau du protocole, mais de résoudre le problème de la génération de commandes. Puisque le projet est géré dans l'idée, vous pensez à la catégorie que vous voulez regarder. Ce plugin le sait, vous aidant plus pratique et plus rapide La commande build. Vous devez comprendre cela lorsque vous utilisez le plugin d'idée arthas! Principalement pour résoudre le problème de la structure de la commande
L'outil open source de vérification des problèmes d'Alibaba ne fonctionnera pas?  Voici la meilleure pratique!

résoudre le problème

Problème de priorité des variables d'environnement Spring Obtenir des variables statiques Intégration de graphes de flammes Logger intégration de commandes intégration de décompilation intégration trace -E intégration tt intégration ...... Fondamentalement, toutes les fonctions que vous pouvez voir sur arths y sont intégrées! Recherchez l'idée d'arths directement dans l'idée de l'installer.

Problèmes d'utilisation spéciaux courants

Les variables statiques
peuvent être obtenues directement par ognl

ognl  -x  3 '@com.wangji92.arthas.plugin.demo.controller.StaticTest@INVOKE_STATIC_DOUBLE' -c e374b99

Peut être obtenu par montre (le curseur est placé sur le terrain)

watch com.wangji92.arthas.plugin.demo.controller.StaticTest * '{params,returnObj,throwExp,@com.wangji92.arthas.plugin.demo.controller.StaticTest@INVOKE_STATIC_DOUBLE}' -n 5 -x 3 '1==1'

Les variables générales
peuvent être obtenues via spring context.getBean (). Field (il s'agit de configurer un contexte de ressort statique pour voir la documentation d'utilisation) tt, watch sont également possibles ~ le même principe

ognl -x 3 '#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getBean("staticTest").filedValue' -c e374b99

Regardez être placé sur le terrain

watch com.wangji92.arthas.plugin.demo.controller.StaticTest * '{params,returnObj,throwExp,target.filedValue}' -n 5 -x 3 'method.initMethod(),method.constructor!=null || [email protected]@isStatic(method.method.getModifiers())'

La valeur de l'élément de configuration sélectionné springContext.getEnvironment () (il s'agit de configurer un contexte de printemps statique voir le document d'utilisation

ognl -x 3 '#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getEnvironment().getProperty("custom.name")' -c e374b99

Obtenir les valeurs de tous les éléments de configuration Regarder Obtenir le contexte de ressort tt et statique Il est également possible d'obtenir le même principe.


watch -x 3 -n 1  org.springframework.web.servlet.DispatcherServlet doDispatch '#springContext=@org.springframework.web.context.support.WebApplicationContextUtils@getWebApplicationContext(params[0].getServletContext()),#allProperties={},#standardServletEnvironment=#propertySourceIterator=#springContext.getEnvironment(),#propertySourceIterator=#standardServletEnvironment.getPropertySources().iterator(),#propertySourceIterator.{#key=#this.getName(),#allProperties.add("                "),#allProperties.add("------------------------- name:"+#key),#this.getSource() instanceof java.util.Map ?#this.getSource().entrySet().iterator.{#key=#this.key,#allProperties.add(#key+"="+#standardServletEnvironment.getProperty(#key))}:#{}},#allProperties'

Adresse du plug-in: https://plugins.jetbrains.com/plugin/13581-arthas-idea
Arthas organise officiellement un événement d'essai, si vous en avez

  • Problèmes vérifiés avec Arthas
  • Interprétation du code source d'Arthas
  • Suggestions à Arthas
  • Illimité, autre contenu lié à Arthas

Bienvenue à participer à l'activité de rédaction, et il y a des prix à obtenir ~
L'outil open source de vérification des problèmes d'Alibaba ne fonctionnera pas?  Voici la meilleure pratique!
Cliquez pour lire le texte original pour accéder à l'adresse de l'activité de rédaction.

Temps de bien-être

TEMPS CADEAU

La communauté technique Arthas a spécialement parrainé une partie des cadeaux (1 haut-parleur Bluetooth, 10 boules cérébrales de décompression) de cette activité d'essai aux lecteurs de Hollis

Ce cadeau n'a pas besoin d'être commenté, ni transmis, en
utilisant la méthode de loterie la plus équitable.
Pas d'inquiétude publique: le programmeur interviewe sur place
L'outil open source de vérification des problèmes d'Alibaba ne fonctionnera pas?  Voici la meilleure pratique!
un numéro public dans les coulisses Re: Essai
pour participer à des tirages au sort
L'outil open source de vérification des problèmes d'Alibaba ne fonctionnera pas?  Voici la meilleure pratique!
face à Java 329: Quelle commande pour surveiller l'état des machines virtuelles exécutant une variété d'informations?
Problème de concurrence en profondeur 013: Extension de l'optimisation du verrouillage synchronisé
L'outil open source de vérification des problèmes d'Alibaba ne fonctionnera pas?  Voici la meilleure pratique!
Si vous aimez cet article,
appuyez et maintenez le code QR et suivez Hollis.

La transmission au cercle d'amis est mon plus grand soutien.

Un point ressemblant
à une sensation de
regarder un support
↘↘↘

Je suppose que tu aimes

Origine blog.51cto.com/13626762/2544073
conseillé
Classement