1 /* 2 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package sun.tools.jstat; 27 28 import java.util.*; 29 import sun.jvmstat.monitor.*; 30 import sun.jvmstat.monitor.event.*; 31 32 /** 33 * Application to output jvmstat statistics exported by a target Java 34 * Virtual Machine. The jstat tool gets its inspiration from the suite 35 * of 'stat' tools, such as vmstat, iostat, mpstat, etc., available in 36 * various UNIX platforms. 37 * 38 * @author Brian Doherty 39 * @since 1.5 40 */ 41 public class Jstat { 42 private static Arguments arguments; 43 44 public static void main(String[] args) { 45 try { 46 arguments = new Arguments(args); 47 } catch (IllegalArgumentException e) { 48 System.err.println(e.getMessage()); 49 Arguments.printUsage(System.err); 50 System.exit(1); 51 } 52 53 if (arguments.isHelp()) { 54 Arguments.printUsage(System.out); 55 System.exit(0); 56 } 57 58 if (arguments.isOptions()) { 59 OptionLister ol = new OptionLister(arguments.optionsSources()); 60 ol.print(System.out); 61 System.exit(0); 62 } 63 64 try { 65 if (arguments.isList()) { 66 logNames(); 67 } else if (arguments.isSnap()) { 68 logSnapShot(); 69 } else { 70 logSamples(); 71 } 72 } catch (MonitorException e) { 73 if (e.getMessage() != null) { 74 System.err.println(e.getMessage()); 75 } else { 76 Throwable cause = e.getCause(); 77 if ((cause != null) && (cause.getMessage() != null)) { 78 System.err.println(cause.getMessage()); 79 } else { 80 e.printStackTrace(); 81 } 82 } 83 System.exit(1); 84 } 85 System.exit(0); 86 } 87 88 static void logNames() throws MonitorException { 89 VmIdentifier vmId = arguments.vmId(); 90 int interval = arguments.sampleInterval(); 91 MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost(vmId); 92 MonitoredVm monitoredVm = monitoredHost.getMonitoredVm(vmId, interval); 93 JStatLogger logger = new JStatLogger(monitoredVm); 94 logger.printNames(arguments.counterNames(), arguments.comparator(), 95 arguments.showUnsupported(), System.out); 96 monitoredHost.detach(monitoredVm); 97 } 98 99 static void logSnapShot() throws MonitorException { 100 VmIdentifier vmId = arguments.vmId(); 101 int interval = arguments.sampleInterval(); 102 MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost(vmId); 103 MonitoredVm monitoredVm = monitoredHost.getMonitoredVm(vmId, interval); 104 JStatLogger logger = new JStatLogger(monitoredVm); 105 logger.printSnapShot(arguments.counterNames(), arguments.comparator(), 106 arguments.isVerbose(), arguments.showUnsupported(), 107 System.out); 108 monitoredHost.detach(monitoredVm); 109 } 110 111 static void logSamples() throws MonitorException { 112 final VmIdentifier vmId = arguments.vmId(); 113 int interval = arguments.sampleInterval(); 114 final MonitoredHost monitoredHost = 115 MonitoredHost.getMonitoredHost(vmId); 116 MonitoredVm monitoredVm = monitoredHost.getMonitoredVm(vmId, interval); 117 final JStatLogger logger = new JStatLogger(monitoredVm); 118 OutputFormatter formatter = null; 119 120 if (arguments.isSpecialOption()) { 121 OptionFormat format = arguments.optionFormat(); 122 formatter = new OptionOutputFormatter(monitoredVm, format); 123 } else { 124 List<Monitor> logged = monitoredVm.findByPattern(arguments.counterNames()); 125 Collections.sort(logged, arguments.comparator()); 126 List<Monitor> constants = new ArrayList<Monitor>(); 127 128 for (Iterator i = logged.iterator(); i.hasNext(); /* empty */) { 129 Monitor m = (Monitor)i.next(); 130 if (!(m.isSupported() || arguments.showUnsupported())) { 131 i.remove(); 132 continue; 133 } 134 if (m.getVariability() == Variability.CONSTANT) { 135 i.remove(); 136 if (arguments.printConstants()) constants.add(m); 137 } else if ((m.getUnits() == Units.STRING) 138 && !arguments.printStrings()) { 139 i.remove(); 140 } 141 } 142 143 if (!constants.isEmpty()) { 144 logger.printList(constants, arguments.isVerbose(), 145 arguments.showUnsupported(), System.out); 146 if (!logged.isEmpty()) { 147 System.out.println(); 148 } 149 } 150 151 if (logged.isEmpty()) { 152 monitoredHost.detach(monitoredVm); 153 return; 154 } 155 156 formatter = new RawOutputFormatter(logged, 157 arguments.printStrings()); 158 } 159 160 // handle user termination requests by stopping sampling loops 161 Runtime.getRuntime().addShutdownHook(new Thread() { 162 public void run() { 163 logger.stopLogging(); 164 } 165 }); 166 167 // handle target termination events for targets other than ourself 168 HostListener terminator = new HostListener() { 169 public void vmStatusChanged(VmStatusChangeEvent ev) { 170 Integer lvmid = new Integer(vmId.getLocalVmId()); 171 if (ev.getTerminated().contains(lvmid)) { 172 logger.stopLogging(); 173 } else if (!ev.getActive().contains(lvmid)) { 174 logger.stopLogging(); 175 } 176 } 177 178 public void disconnected(HostEvent ev) { 179 if (monitoredHost == ev.getMonitoredHost()) { 180 logger.stopLogging(); 181 } 182 } 183 }; 184 185 if (vmId.getLocalVmId() != 0) { 186 monitoredHost.addHostListener(terminator); 187 } 188 189 logger.logSamples(formatter, arguments.headerRate(), 190 arguments.sampleInterval(), arguments.sampleCount(), 191 System.out); 192 193 // detach from host events and from the monitored target jvm 194 if (terminator != null) { 195 monitoredHost.removeHostListener(terminator); 196 } 197 monitoredHost.detach(monitoredVm); 198 } 199 }