1 package org.munin.plugin.jmx; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.lang.management.GarbageCollectorMXBean; 6 import java.lang.management.ManagementFactory; 7 import java.util.ArrayList; 8 import java.util.Collection; 9 import java.util.Set; 10 import java.util.TreeSet; 11 12 import javax.management.MalformedObjectNameException; 13 import javax.management.ObjectName; 14 15 public abstract class GarbageCollectionInfo extends 16 AbstractAnnotationGraphsProvider { 17 GarbageCollectionInfo(Config config)18 protected GarbageCollectionInfo(Config config) { 19 super(config); 20 } 21 22 private Collection<GarbageCollectorMXBean> collectors; 23 getCollectors()24 private Collection<GarbageCollectorMXBean> getCollectors() { 25 if (collectors == null) { 26 try { 27 ObjectName gcName = new ObjectName( 28 ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE 29 + ",*"); 30 31 // ensure that the MBeans are sorted consistently 32 Set<ObjectName> mbeans = new TreeSet<ObjectName>(getConnection() 33 .queryNames(gcName, null)); 34 collectors = new ArrayList<GarbageCollectorMXBean>(mbeans 35 .size()); 36 for (ObjectName objectName : mbeans) { 37 GarbageCollectorMXBean collector = ManagementFactory 38 .newPlatformMXBeanProxy(getConnection(), objectName 39 .getCanonicalName(), 40 GarbageCollectorMXBean.class); 41 collectors.add(collector); 42 } 43 } catch (IOException e) { 44 e.printStackTrace(); 45 } catch (MalformedObjectNameException e) { 46 e.printStackTrace(); 47 } 48 } 49 return collectors; 50 } 51 52 @Override printFieldsConfig(PrintWriter out)53 protected void printFieldsConfig(PrintWriter out) { 54 for (GarbageCollectorMXBean collector : getCollectors()) { 55 String name = getFieldName(collector); 56 String label = getFieldLabel(collector); 57 String info = getFieldInfo(collector); 58 printFieldConfig(out, name, label, info, "DERIVE", null, null, 0, 59 Double.NaN); 60 } 61 } 62 63 @Override printValues(PrintWriter out)64 public void printValues(PrintWriter out) { 65 for (GarbageCollectorMXBean collector : getCollectors()) { 66 String name = getFieldName(collector); 67 printFieldAttribute(out, name, "value", getValue(collector)); 68 } 69 } 70 getFieldName(GarbageCollectorMXBean collector)71 protected abstract String getFieldName(GarbageCollectorMXBean collector); 72 getFieldLabel(GarbageCollectorMXBean collector)73 protected abstract String getFieldLabel(GarbageCollectorMXBean collector); 74 getFieldInfo(GarbageCollectorMXBean collector)75 protected abstract String getFieldInfo(GarbageCollectorMXBean collector); 76 getValue(GarbageCollectorMXBean collector)77 protected abstract Object getValue(GarbageCollectorMXBean collector); 78 getCollectorInfo(GarbageCollectorMXBean collector)79 protected String getCollectorInfo(GarbageCollectorMXBean collector) { 80 StringBuilder builder = new StringBuilder(collector.getName()); 81 builder.append(" collector (handles these memory pools: "); 82 boolean first = true; 83 for (String poolName : collector.getMemoryPoolNames()) { 84 builder.append(poolName); 85 if (first) { 86 first = false; 87 } else { 88 builder.append(", "); 89 } 90 } 91 builder.append(")"); 92 return builder.toString(); 93 } 94 95 @Graph(title = "Garbage Collection Count", vlabel = "count", info = "Shows the number of garbage collections for all existing garbage collectors in the target JVM.") 96 public static class Count extends GarbageCollectionInfo { Count(Config config)97 public Count(Config config) { 98 super(config); 99 } 100 101 @Override getFieldName(GarbageCollectorMXBean collector)102 protected String getFieldName(GarbageCollectorMXBean collector) { 103 return "count_" + toFieldName(collector.getName()); 104 } 105 106 @Override getFieldLabel(GarbageCollectorMXBean collector)107 public String getFieldLabel(GarbageCollectorMXBean collector) { 108 return "Collection count of " + collector.getName(); 109 } 110 111 @Override getFieldInfo(GarbageCollectorMXBean collector)112 protected String getFieldInfo(GarbageCollectorMXBean collector) { 113 return "Number of collections that have occurred of the " 114 + getCollectorInfo(collector); 115 } 116 117 @Override getValue(GarbageCollectorMXBean collector)118 public Object getValue(GarbageCollectorMXBean collector) { 119 return collector.getCollectionCount(); 120 } 121 main(String args[])122 public static void main(String args[]) { 123 runGraph(args); 124 } 125 126 } 127 128 @Graph(title = "Garbage Collection Time", vlabel = "ms", info = "Shows the time spent in garbage collections for all existing garbage collectors in the target JVM.") 129 public static class Time extends GarbageCollectionInfo { Time(Config config)130 public Time(Config config) { 131 super(config); 132 // TODO Auto-generated constructor stub 133 } 134 135 @Override getFieldName(GarbageCollectorMXBean collector)136 protected String getFieldName(GarbageCollectorMXBean collector) { 137 return "time_" + toFieldName(collector.getName()); 138 } 139 140 @Override getFieldLabel(GarbageCollectorMXBean collector)141 public String getFieldLabel(GarbageCollectorMXBean collector) { 142 return "Collection time of " + collector.getName(); 143 } 144 145 @Override getFieldInfo(GarbageCollectorMXBean collector)146 protected String getFieldInfo(GarbageCollectorMXBean collector) { 147 return "Approximate collection elapsed time in milliseconds of the " 148 + getCollectorInfo(collector); 149 } 150 151 @Override getValue(GarbageCollectorMXBean collector)152 public Object getValue(GarbageCollectorMXBean collector) { 153 return collector.getCollectionTime(); 154 } 155 main(String args[])156 public static void main(String args[]) { 157 runGraph(args); 158 } 159 160 } 161 } 162