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