Автор | Агент
Руководство по использованию команды Arthas watch
Arthas — мой любимый инструмент разработки и отладки в области Java.
Каждый раз, когда возникает проблема с тестом, когда другие повторно присылают код для добавления лога, я с радостью достаю своего Артаса и говорю им: мальчик, тебе не нужно беспокоиться о повторной отправке кода для добавления Войти. Артас, ты это заслужил.
На этот раз я хочу представить одну из функций, которые я использую чаще всего:watch
. Хотя у Артаса много функций, эта мне больше всего нравится. использоватьwatch
После этого мне больше не нужно входить в журнал, чтобы наблюдать за вызовами функций.
Что такое Артас
ArthasОфициальный сайт описывает себя так:
Arthas — это инструмент диагностики Java с открытым исходным кодом от Alibaba, который очень популярен среди разработчиков. Артас может помочь вам, когда вы столкнулись с такими проблемами, как:
- Из какого пакета jar загружается этот класс? Почему сообщается о различных исключениях, связанных с классом?
- Почему код, который я изменил, не выполняется? Это потому, что я не совершал? Ветвь неправильная?
- Если вы столкнулись с проблемой и не можете отладить ее онлайн, можете ли вы опубликовать ее повторно, только добавив журнал?
- Есть проблема с обработкой данных пользователя онлайн, но ее нельзя отладить онлайн или воспроизвести офлайн!
- Есть ли глобальный вид, чтобы увидеть работоспособность системы?
- Есть ли способ отслеживать рабочее состояние JVM в реальном времени?
- Как быстро найти горячие точки приложения и сгенерировать график пламени?
Установка и запуск Arthas в один клик
- Способ 1. Внедрение удаленной диагностики Arthas одним щелчком мыши с помощью Cloud Toolkit.
Cloud Toolkit — это бесплатный локальный подключаемый модуль IDE, выпущенный Alibaba Cloud, чтобы помочь разработчикам более эффективно разрабатывать, тестировать, диагностировать и развертывать приложения. С помощью подключаемых модулей локальные приложения можно развернуть на любом сервере или даже в облаке (ECS, EDAS, ACK, ACR и облако апплетов и т. д.) одним щелчком мыши, а диагностика Arthas, инструмент Dubbo, терминальный терминал, загрузка файлов, функция расчет и инструменты, такие как MySQL Executor. Не только основная версия IntelliJ IDEA, но и другие версии, такие как Eclipse, Pycharm, Maven и т. д.
Рекомендуется использовать плагин IDEA для загрузки Cloud Toolkit для использования Arthas:He. Special. Talent/2A5CB HW VE ox…
- Способ 2: Прямая загрузка
адрес:GitHub.com/Alibaba/art….
curl -O https://alibaba.github.io/arthas/arthas-boot.jar && java -Dfile.encoding=UTF-8 -jar arthas-boot.jar
Объясните немного о команде оболочки выше. Команда разделена на две части,&&
Первая часть — загрузить Артаса, а следующая часть — запустить Артаса.
Вы можете быть удивлены, почему загружаемый файл неwget
Вместо этого используйтеcurl
? Это связано с тем, что некоторые серверы не предустановленыwget
Да, но он в основном предустановленcurl
. Если ваш сервер предустановленwget
Вы можете полностью изменить «завиток» наwget
.
При использовании wget команду можно изменить на:
# wget 版命令
wget https://alibaba.github.io/arthas/arthas-boot.jar && java -Dfile.encoding=UTF-8 -jar arthas-boot.jar
Еще один момент, который нужно объяснить, заключается в том, что-Dfile.encoding=UTF-8
, этот параметр Java позволяет Артасу выводить китайский язык без искаженных символов, вы можете прочитать мою предыдущую статью об этом.Мышление Java по умолчанию, вызванное искажением китайского языка Arthas.
Команда часов Артаса
watch
Позволяет легко наблюдать за вызовом указанного метода. Наблюдаемый диапазон:返回值
,抛出异常
,入参
(Вы также можете наблюдать за объектом, который выполняет саму функцию, я не знаю, почему это не было упомянуто в официальном введении». Написав выражения OGNL, вы можете просмотреть соответствующие переменные.
# watch -h
# USAGE
watch [-b] [-e] [-x <value>] [-f] [-h] [-n <value>] [-E] [-M <value>] [-s] class-pattern method-pattern express [condition-express]
1. Метод наблюдения возвращает результатreturnObj
Способ его использования выглядит сложным, но на самом деле он очень прост. Вот самый простой пример: предположим, мы хотим наблюдать строку в следующем кодеcontains
метод.
public class App {
public static void main(String[] args) throws IOException {
String hello = "Hello Arthas";
while (true) {
boolean contains = StringUtils.contains(hello, "Arthas");
System.out.println(contains);
}
}
}
Вы можете использовать следующее утверждение:
## 观察 contains 返回结果
[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains returnObj -n 3
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 68 ms.
# ts=2020-05-02 16:46:04; [cost=2.424254ms] result=@Boolean[true]
# ts=2020-05-02 16:46:05; [cost=0.21033ms] result=@Boolean[true]
# ts=2020-05-02 16:46:06; [cost=0.165514ms] result=@Boolean[true]
-n 3
Указывает, что он выполняется только три раза.Этот параметр очень распространен, в противном случае его легко стереть с помощью вывода.
2. Отфильтруйте звонки, которые вам не нужныcondition-express
Очевидно, что реальный случай определенно не так прост, как пример выше. В реальном сервисном коде должно быть более одного места для вызова функции String.contains
метод. Нам нужно отфильтровать посторонние звонки.
## 观察 contains 返回结果,并且过滤掉无关调用
[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains returnObj 'params[1]=="Arthas"'
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 29 ms.
# ts=2020-05-02 16:48:50; [cost=0.331109ms] result=@Boolean[true]
# ts=2020-05-02 16:48:51; [cost=0.175224ms] result=@Boolean[true]
# ts=2020-05-02 16:48:52; [cost=0.138984ms] result=@Boolean[true]
Входные параметры — это способ легко различать разные вызовы поparams[1]=="Arthas"
этоcondition-express
, мы можем оставить только второй входной параметрArthas
вызов функции.
3. Одновременное наблюдение за вводом и результатами
[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains {params,returnObj} 'params[1]=="Arthas"'
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 33 ms.
# ts=2020-05-02 16:51:27; [cost=0.507486ms] result=@ArrayList[
# @Object[][isEmpty=false;size=2],
# @Boolean[true],
# ]
пройти через{}
Оборачивая поля, вы можете одновременно наблюдать за теми полями, которые хотите наблюдать. Можно отметить один момент,params
это массив, но печатаетparams
Когда конкретный контент не распечатан, его можно использовать в это время.-x 2
указать свойство глубины обхода объекта печати.
arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains {params,returnObj} 'params[1]=="Arthas"' -x 2
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 35 ms.
# ts=2020-05-02 16:51:33; [cost=0.391218ms] result=@ArrayList[
# @Object[][
# @String[Hello Arthas],
# @String[Arthas],
# ],
# @Boolean[true],
# ]
4. Позвольте мне привести несколько примеров, которые я действительно использую
Когда Momo разрабатывает динамические рекомендации, во время тестирования часто приходится проверять, включил ли пользователь соответствующий бизнес-переключатель, и часто необходимо проверить, включен ли определенный экспериментальный переключатель.
## 查看陌陌用户 1234567 是否开启 ElasticSearch 开关
watch com.momo.Experiment enableElasticSearch returnObj 'target.momoId=="1234567"'
# ts=2020-05-02 20:09:46; [cost=24.443527ms] result=@Boolean[true]
Я также часто выношу суждения на основе идентификатора пользователя Momo, участвовавшего в участии, и проверяю возвращенные результаты или исключения:
## 查看 MorecControlFlow 类的 process 方法返回结果
## process 方法第一个参数的 momoId 属性值为 “123454567” 才生效
## 类路径和陌陌号都非真实数据
watch com.momo.MorecControlFlow process returnObj 'params[0].momoId=="123454567"'
# ts=2019-03-18 21:09:46; [cost=264.434972ms] result=@Boolean[true]
## 查看 IMorecShuffler 类的 shuffle 抛的异常
## process 方法第一个参数的 momoId 属性值为 “123454567” 才生效
watch com.momo.plugins.shuffler.IMorecShuffler shuffle throwExp 'params[0].morecRequest.momoId=="123454567"'
# ts=2019-03-27 20:54:29; [cost=46.642339ms] result=java.lang.IndexOutOfBoundsException: Index: 12, Size: 11
at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:665)
at java.util.ArrayList.add(ArrayList.java:477)
at com.momo.plugin.shuffler.RoomShuffler.shuffle(RoomShuffler:45)
несколько советов
Выше я перечислил лишь общие методы наблюдения и параметры, есть еще много команд, поддерживаемых часами, вы можете проверить команду часов Артаса.официальная документация.
Его также можно использовать после запуска команды arthas.watch -h
Проверить.
В процессе использования Arthas многие считают, что получить полное имя класса очень сложно, на самом деле это можно сделать с помощью Idea.Copy Refrence
решение для сочетания клавиш. Горячие клавиши, которые я определил сам,⌥⇧⌘C
.
Еще один момент заключается в том, что при написании кода лучше всего разбить код и попытаться инкапсулировать небольшие функции в отдельные функции.Когда вам нужно использовать Arthas для наблюдения за вызовами функций, вы вернетесь, чтобы поблагодарить себя.
Arthas Call for Papers в самом разгаре
Артас держит призыв к бумагам, если у вас есть:
- Устранение неполадок с Артасом
- Интерпретация исходного кода Артаса
- Сделать предложение Артасу
- Не ограничено, другой контент, связанный с Артасом
Приглашаем принять участие в писательской деятельности, и есть призы, которые можно выиграть~Нажмите, чтобы отправить
"Облачная нативная платформа AlibabaСосредоточьтесь на микросервисах, бессерверных технологиях, контейнерах, Service Mesh и других технических областях, сосредоточьтесь на популярных тенденциях облачных технологий и практиках крупномасштабного внедрения облачных технологий, а также станьте официальной учетной записью самых облачных разработчиков. "