From 4faefc44a0ca2c1ef5267ca489a010b61013b863 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Sun, 24 Apr 2022 20:48:07 +0800 Subject: [PATCH] vmtool command support http api. #2141 --- .../core/command/model/VmToolModel.java | 58 +++++++++++++++++++ .../command/monitor200/VmToolCommand.java | 10 ++-- .../core/command/view/ResultViewResolver.java | 1 + .../arthas/core/command/view/VmToolView.java | 28 +++++++++ 4 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 core/src/main/java/com/taobao/arthas/core/command/model/VmToolModel.java create mode 100644 core/src/main/java/com/taobao/arthas/core/command/view/VmToolView.java diff --git a/core/src/main/java/com/taobao/arthas/core/command/model/VmToolModel.java b/core/src/main/java/com/taobao/arthas/core/command/model/VmToolModel.java new file mode 100644 index 000000000..ae73a635e --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/command/model/VmToolModel.java @@ -0,0 +1,58 @@ +package com.taobao.arthas.core.command.model; + +import java.util.Collection; + +/** + * + * @author hengyunabc 2022-04-24 + * + */ +public class VmToolModel extends ResultModel { + private Object value; + private int expand = 1; + + private Collection matchedClassLoaders; + private String classLoaderClass; + + + @Override + public String getType() { + return "vmtool"; + } + + public Object getValue() { + return value; + } + + public VmToolModel setValue(Object value) { + this.value = value; + return this; + } + + public int getExpand() { + return expand; + } + + public VmToolModel setExpand(int expand) { + this.expand = expand; + return this; + } + + public String getClassLoaderClass() { + return classLoaderClass; + } + + public VmToolModel setClassLoaderClass(String classLoaderClass) { + this.classLoaderClass = classLoaderClass; + return this; + } + + public Collection getMatchedClassLoaders() { + return matchedClassLoaders; + } + + public VmToolModel setMatchedClassLoaders(Collection matchedClassLoaders) { + this.matchedClassLoaders = matchedClassLoaders; + return this; + } +} diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/VmToolCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/VmToolCommand.java index 133b14f3b..83fa5ea38 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/VmToolCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/VmToolCommand.java @@ -21,6 +21,7 @@ import com.taobao.arthas.core.command.express.ExpressException; import com.taobao.arthas.core.command.express.ExpressFactory; import com.taobao.arthas.core.command.model.ClassLoaderVO; import com.taobao.arthas.core.command.model.SearchClassModel; +import com.taobao.arthas.core.command.model.VmToolModel; import com.taobao.arthas.core.shell.cli.Completion; import com.taobao.arthas.core.shell.cli.CompletionUtils; import com.taobao.arthas.core.shell.cli.OptionCompleteHandler; @@ -179,9 +180,10 @@ public class VmToolCommand extends AnnotatedCommand { } else if (matchedClassLoaders.size() > 1) { Collection classLoaderVOList = ClassUtils .createClassLoaderVOList(matchedClassLoaders); - SearchClassModel searchclassModel = new SearchClassModel().setClassLoaderClass(classLoaderClass) + + VmToolModel vmToolModel = new VmToolModel().setClassLoaderClass(classLoaderClass) .setMatchedClassLoaders(classLoaderVOList); - process.appendResult(searchclassModel); + process.appendResult(vmToolModel); process.end(-1, "Found more than one classloader by class name, please specify classloader with '-c '"); return; @@ -216,8 +218,8 @@ public class VmToolCommand extends AnnotatedCommand { } } - process.write(new ObjectView(value, this.expand).draw()); - process.write("\n"); + VmToolModel vmToolModel = new VmToolModel().setValue(value).setExpand(expand); + process.appendResult(vmToolModel); process.end(); } } else if (VmToolAction.forceGc.equals(action)) { diff --git a/core/src/main/java/com/taobao/arthas/core/command/view/ResultViewResolver.java b/core/src/main/java/com/taobao/arthas/core/command/view/ResultViewResolver.java index 9905f44ae..fc9ffad07 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/view/ResultViewResolver.java +++ b/core/src/main/java/com/taobao/arthas/core/command/view/ResultViewResolver.java @@ -78,6 +78,7 @@ public class ResultViewResolver { registerView(TimeTunnelView.class); registerView(TraceView.class); registerView(WatchView.class); + registerView(VmToolView.class); } catch (Throwable e) { logger.error("register result view failed", e); diff --git a/core/src/main/java/com/taobao/arthas/core/command/view/VmToolView.java b/core/src/main/java/com/taobao/arthas/core/command/view/VmToolView.java new file mode 100644 index 000000000..a9641f178 --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/command/view/VmToolView.java @@ -0,0 +1,28 @@ +package com.taobao.arthas.core.command.view; + +import com.taobao.arthas.core.command.model.VmToolModel; +import com.taobao.arthas.core.shell.command.CommandProcess; +import com.taobao.arthas.core.util.StringUtils; +import com.taobao.arthas.core.view.ObjectView; + +/** + * + * @author hengyunabc 2022-04-24 + * + */ +public class VmToolView extends ResultView { + @Override + public void draw(CommandProcess process, VmToolModel model) { + if (model.getMatchedClassLoaders() != null) { + process.write("Matched classloaders: \n"); + ClassLoaderView.drawClassLoaders(process, model.getMatchedClassLoaders(), false); + process.write("\n"); + return; + } + + int expand = model.getExpand(); + Object value = model.getValue(); + String resultStr = StringUtils.objectToString(expand >= 0 ? new ObjectView(value, expand).draw() : value); + process.write(resultStr).write("\n"); + } +}