/* * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.tools.visualvm.modules.tracer.jvmstat; import com.sun.management.UnixOperatingSystemMXBean; import com.sun.tools.visualvm.application.Application; import com.sun.tools.visualvm.modules.tracer.TracerPackage; import com.sun.tools.visualvm.tools.jvmstat.JvmstatModel; import com.sun.tools.visualvm.tools.jvmstat.JvmstatModelFactory; import static com.sun.tools.visualvm.modules.tracer.jvmstat.JvmstatCounterFormatter.*; import java.net.URISyntaxException; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import sun.jvmstat.monitor.Monitor; import sun.jvmstat.monitor.MonitoredHost; import sun.jvmstat.monitor.MonitoredVm; import sun.jvmstat.monitor.MonitorException; import sun.jvmstat.monitor.VmIdentifier; /** * * @author Tomas Hurka */ class JvmstatCountersPackages { private static final Logger LOGGER = Logger.getLogger(JvmstatCountersPackage.class.getName()); private static final String Variability_INVALID = "Invalid"; // NOI18N private static final String Variability_CONSTANT = "Constant"; // NOI18N private Application application; private MonitoredVm monitoredVm; JvmstatCountersPackages(Application app) { application = app; monitoredVm = getMonitoredHost(); } TracerPackage<Application>[] getPackages() { if (monitoredVm != null) { return computePackages(); } return new TracerPackage[0]; } private MonitoredVm getMonitoredHost() { JvmstatModel jvmstat = JvmstatModelFactory.getJvmstatFor(application); if (jvmstat != null) { String connectionId = jvmstat.getConnectionId(); try { VmIdentifier vmId = new VmIdentifier(connectionId); MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost(vmId); return monitoredHost.getMonitoredVm(vmId); } catch (URISyntaxException ex) { LOGGER.log(Level.WARNING,ex.getLocalizedMessage(),ex); } catch (Exception ex) { // MonitoredHostProvider.getMonitoredVm can throw java.lang.Exception on Windows, // when opening shared memory file (java.lang.Exception: Could not open PerfMemory) LOGGER.log(Level.INFO,"getMonitoredVm failed",ex); // NOI18N } } return null; } private TracerPackage<Application>[] computePackages() { List counters; Iterator it; Map<String,JvmstatCountersPackage> packages = new HashMap(); try { counters = monitoredVm.findByPattern(".*"); Collections.sort(counters,new Comparator<Monitor>() { public int compare(Monitor o1, Monitor o2) { return o1.getName().compareTo(o2.getName()); } }); it = counters.iterator(); for (int i=0;it.hasNext();i++) { Monitor monitor = (Monitor) it.next(); String unitsName = Utils.getUnits(monitor).toString(); String var = Utils.getVariability(monitor).toString(); String name = monitor.getName(); String baseName = monitor.getBaseName(); if (unitsName.equals(Units_STRING) || unitsName.equals(Units_INVALID) || unitsName.equals(Units_NONE)) { continue; } if (var.equals(Variability_INVALID) || var.equals(Variability_CONSTANT)) { continue; } if (monitor.isVector()) { continue; } getPackage(packages,monitor,i,name); } } catch (MonitorException ex) { LOGGER.log(Level.INFO,"findByPattern failed",ex); // NOI18N } return packages.values().toArray(new TracerPackage[0]); } private void getPackage(Map<String,JvmstatCountersPackage> packages, Monitor monitor, int pos, String name) { String pckName; String probeName; JvmstatCountersPackage pck; int dots = 0; int i; for (i = 0; i< name.length(); i++) { char ch = name.charAt(i); if (ch == '.') { dots++; if (dots == 2) { break; } } } if (dots == 2) { pckName = name.substring(0,i); probeName = name.substring(i+1); pck = packages.get(pckName); if (pck == null) { pck = new JvmstatCountersPackage(this,pckName,packages.size()); packages.put(pckName,pck); } pck.addProbe(monitor,pos,probeName); } } void setInterval(int refresh) { monitoredVm.setInterval(refresh); // System.out.println("New refresh "+refresh); } }