aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/sk89q/warmroast/WarmRoast.java
diff options
context:
space:
mode:
authorLuck <git@lucko.me>2018-05-26 22:52:58 +0100
committerLuck <git@lucko.me>2018-05-27 00:02:02 +0100
commit429eeb35876576d861404cd199b6e9763fc4e5b0 (patch)
tree624e1c05433e8ab5775a0177ecf5d5982de54805 /src/main/java/com/sk89q/warmroast/WarmRoast.java
parent3fe5e5517b1c529d95cf9f43fd8420c66db0092a (diff)
downloadspark-429eeb35876576d861404cd199b6e9763fc4e5b0.tar.gz
spark-429eeb35876576d861404cd199b6e9763fc4e5b0.tar.bz2
spark-429eeb35876576d861404cd199b6e9763fc4e5b0.zip
Initial commit for spark
Diffstat (limited to 'src/main/java/com/sk89q/warmroast/WarmRoast.java')
-rw-r--r--src/main/java/com/sk89q/warmroast/WarmRoast.java335
1 files changed, 0 insertions, 335 deletions
diff --git a/src/main/java/com/sk89q/warmroast/WarmRoast.java b/src/main/java/com/sk89q/warmroast/WarmRoast.java
deleted file mode 100644
index 9923cb8..0000000
--- a/src/main/java/com/sk89q/warmroast/WarmRoast.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * WarmRoast
- * Copyright (C) 2013 Albert Pham <http://www.sk89q.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package com.sk89q.warmroast;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.lang.management.ManagementFactory;
-import java.lang.management.ThreadInfo;
-import java.lang.management.ThreadMXBean;
-import java.net.InetSocketAddress;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.TreeMap;
-
-import javax.management.MBeanServerConnection;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-import javax.management.remote.JMXConnector;
-import javax.management.remote.JMXConnectorFactory;
-import javax.management.remote.JMXServiceURL;
-
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.HandlerList;
-import org.eclipse.jetty.server.handler.ResourceHandler;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-
-import com.beust.jcommander.JCommander;
-import com.sun.tools.attach.AgentInitializationException;
-import com.sun.tools.attach.AgentLoadException;
-import com.sun.tools.attach.AttachNotSupportedException;
-import com.sun.tools.attach.VirtualMachine;
-import com.sun.tools.attach.VirtualMachineDescriptor;
-
-public class WarmRoast extends TimerTask {
-
- private static final String SEPARATOR =
- "------------------------------------------------------------------------";
-
- private final int interval;
- private final VirtualMachine vm;
- private final Timer timer = new Timer("Roast Pan", true);
- private final McpMapping mapping = new McpMapping();
- private final SortedMap<String, StackNode> nodes = new TreeMap<>();
- private JMXConnector connector;
- private MBeanServerConnection mbsc;
- private ThreadMXBean threadBean;
- private String filterThread;
- private long endTime = -1;
-
- public WarmRoast(VirtualMachine vm, int interval) {
- this.vm = vm;
- this.interval = interval;
- }
-
- public Map<String, StackNode> getData() {
- return nodes;
- }
-
- private StackNode getNode(String name) {
- StackNode node = nodes.get(name);
- if (node == null) {
- node = new StackNode(name);
- nodes.put(name, node);
- }
- return node;
- }
-
- public McpMapping getMapping() {
- return mapping;
- }
-
- public String getFilterThread() {
- return filterThread;
- }
-
- public void setFilterThread(String filterThread) {
- this.filterThread = filterThread;
- }
-
- public long getEndTime() {
- return endTime;
- }
-
- public void setEndTime(long l) {
- this.endTime = l;
- }
-
- public void connect()
- throws IOException, AgentLoadException, AgentInitializationException {
- // Load the agent
- String connectorAddr = vm.getAgentProperties().getProperty(
- "com.sun.management.jmxremote.localConnectorAddress");
- if (connectorAddr == null) {
- String agent = vm.getSystemProperties().getProperty("java.home")
- + File.separator + "lib" + File.separator
- + "management-agent.jar";
- vm.loadAgent(agent);
- connectorAddr = vm.getAgentProperties().getProperty(
- "com.sun.management.jmxremote.localConnectorAddress");
- }
-
- // Connect
- JMXServiceURL serviceURL = new JMXServiceURL(connectorAddr);
- connector = JMXConnectorFactory.connect(serviceURL);
- mbsc = connector.getMBeanServerConnection();
- try {
- threadBean = getThreadMXBean();
- } catch (MalformedObjectNameException e) {
- throw new IOException("Bad MX bean name", e);
- }
- }
-
- private ThreadMXBean getThreadMXBean()
- throws IOException, MalformedObjectNameException {
- ObjectName objName = new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME);
- Set<ObjectName> mbeans = mbsc.queryNames(objName, null);
- for (ObjectName name : mbeans) {
- return ManagementFactory.newPlatformMXBeanProxy(
- mbsc, name.toString(), ThreadMXBean.class);
- }
- throw new IOException("No thread MX bean found");
- }
-
- @Override
- public synchronized void run() {
- if (endTime >= 0) {
- if (endTime <= System.currentTimeMillis()) {
- cancel();
- System.err.println("Sampling has stopped.");
- return;
- }
- }
-
- ThreadInfo[] threadDumps = threadBean.dumpAllThreads(false, false);
- for (ThreadInfo threadInfo : threadDumps) {
- String threadName = threadInfo.getThreadName();
- StackTraceElement[] stack = threadInfo.getStackTrace();
-
- if (threadName == null || stack == null) {
- continue;
- }
-
- if (filterThread != null && !filterThread.equals(threadName)) {
- continue;
- }
-
- StackNode node = getNode(threadName);
- node.log(stack, interval);
- }
- }
-
- public void start(InetSocketAddress address) throws Exception {
- timer.scheduleAtFixedRate(this, interval, interval);
-
- Server server = new Server(address);
-
- ServletContextHandler context = new ServletContextHandler();
- context.setContextPath("/");
- context.addServlet(new ServletHolder(new DataViewServlet(this)), "/stack");
-
- ResourceHandler resources = new ResourceHandler();
- String filesDir = WarmRoast.class.getResource("/www").toExternalForm();
- resources.setResourceBase(filesDir);
- resources.setDirectoriesListed(true);
- resources.setWelcomeFiles(new String[]{ "index.html" });
-
- HandlerList handlers = new HandlerList();
- handlers.addHandler(context);
- handlers.addHandler(resources);
- server.setHandler(handlers);
-
- server.start();
- server.join();
- }
-
- public static void main(String[] args) throws AgentLoadException {
- RoastOptions opt = new RoastOptions();
- JCommander jc = new JCommander(opt, args);
- jc.setProgramName("warmroast");
-
- if (opt.help) {
- jc.usage();
- System.exit(0);
- }
-
- System.err.println(SEPARATOR);
- System.err.println("WarmRoast");
- System.err.println("http://github.com/sk89q/warmroast");
- System.err.println(SEPARATOR);
- System.err.println("");
-
- VirtualMachine vm = null;
-
- if (opt.pid != null) {
- try {
- vm = VirtualMachine.attach(String.valueOf(opt.pid));
- System.err.println("Attaching to PID " + opt.pid + "...");
- } catch (AttachNotSupportedException | IOException e) {
- System.err.println("Failed to attach VM by PID " + opt.pid);
- e.printStackTrace();
- System.exit(1);
- }
- } else if (opt.vmName != null) {
- for (VirtualMachineDescriptor desc : VirtualMachine.list()) {
- if (desc.displayName().contains(opt.vmName)) {
- try {
- vm = VirtualMachine.attach(desc);
- System.err.println("Attaching to '" + desc.displayName() + "'...");
-
- break;
- } catch (AttachNotSupportedException | IOException e) {
- System.err.println("Failed to attach VM by name '" + opt.vmName + "'");
- e.printStackTrace();
- System.exit(1);
- }
- }
- }
- }
-
- if (vm == null) {
- List<VirtualMachineDescriptor> descriptors = VirtualMachine.list();
- System.err.println("Choose a VM:");
-
- Collections.sort(descriptors, new Comparator<VirtualMachineDescriptor>() {
- @Override
- public int compare(VirtualMachineDescriptor o1,
- VirtualMachineDescriptor o2) {
- return o1.displayName().compareTo(o2.displayName());
- }
- });
-
- // Print list of VMs
- int i = 1;
- for (VirtualMachineDescriptor desc : descriptors) {
- System.err.println("[" + (i++) + "] " + desc.displayName());
- }
-
- // Ask for choice
- System.err.println("");
- System.err.print("Enter choice #: ");
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- String s;
- try {
- s = reader.readLine();
- } catch (IOException e) {
- return;
- }
-
- // Get the VM
- try {
- int choice = Integer.parseInt(s) - 1;
- if (choice < 0 || choice >= descriptors.size()) {
- System.err.println("");
- System.err.println("Given choice is out of range.");
- System.exit(1);
- }
- vm = VirtualMachine.attach(descriptors.get(choice));
- } catch (NumberFormatException e) {
- System.err.println("");
- System.err.println("That's not a number. Bye.");
- System.exit(1);
- } catch (AttachNotSupportedException | IOException e) {
- System.err.println("");
- System.err.println("Failed to attach VM");
- e.printStackTrace();
- System.exit(1);
- }
- }
-
- InetSocketAddress address = new InetSocketAddress(opt.bindAddress, opt.port);
-
- WarmRoast roast = new WarmRoast(vm, opt.interval);
- if (opt.mappingsDir != null) {
- File dir = new File(opt.mappingsDir);
- File joined = new File(dir, "joined.srg");
- File methods = new File(dir, "methods.csv");
- try {
- roast.getMapping().read(joined, methods);
- } catch (IOException e) {
- System.err.println(
- "Failed to read the mappings files (joined.srg, methods.csv) " +
- "from " + dir.getAbsolutePath() + ": " + e.getMessage());
- System.exit(2);
- }
- }
-
- System.err.println(SEPARATOR);
-
- roast.setFilterThread(opt.threadName);
-
- if (opt.timeout != null && opt.timeout > 0) {
- roast.setEndTime(System.currentTimeMillis() + opt.timeout * 1000);
- System.err.println("Sampling set to stop in " + opt.timeout + " seconds.");
- }
-
- System.err.println("Starting a server on " + address.toString() + "...");
- System.err.println("Once the server starts (shortly), visit the URL in your browser.");
- System.err.println("Note: The longer you wait before using the output of that " +
- "webpage, the more accurate the results will be.");
-
- try {
- roast.connect();
- roast.start(address);
- } catch (Throwable t) {
- t.printStackTrace();
- System.exit(3);
- }
- }
-
-}