public static Metric getOSMetric(String name) throws Exception { MetricPoller poller = new JmxMetricPoller(new LocalJmxConnector(), new ObjectName("java.lang:type=OperatingSystem"), MATCH_NONE); RegexMetricFilter filter = new RegexMetricFilter(null, Pattern.compile(name), false, false); List<Metric> metrics = poller.poll(filter); assertEquals(metrics.size(), 1); return metrics.get(0); } }
@Test public void testDefaultTags() throws Exception { MetricPoller poller = new JmxMetricPoller( new LocalJmxConnector(), Collections.singletonList(new ObjectName("java.lang:type=OperatingSystem")), MATCH_ALL, true, Collections.singletonList(Tags.newTag("HostName", "localhost"))); List<Metric> metrics = poller.poll(MATCH_ALL); for (Metric m : metrics) { Map<String, String> tags = m.getConfig().getTags().asMap(); assertEquals(tags.get("HostName"), "localhost"); } }
@Test public void testNonNumericMetrics() throws Exception { MapMXBean mapMXBean = new MapMXBean(); try { MetricPoller poller = new JmxMetricPoller( new LocalJmxConnector(), Collections.singletonList(new ObjectName("com.netflix.servo.test:*")), MATCH_ALL, false, null); List<Metric> metrics = poller.poll(config -> config.getName().equals("StringValue")); assertEquals(metrics.size(), 1); assertEquals(metrics.get(0).getValue(), "AStringResult"); } finally { mapMXBean.destroy(); } } }
@Test public void testBasic() throws Exception { MetricPoller poller = new JmxMetricPoller( new LocalJmxConnector(), new ObjectName("java.lang:type=OperatingSystem"), MATCH_NONE); boolean found = false; List<Metric> metrics = poller.poll(MATCH_ALL); for (Metric m : metrics) { if ("AvailableProcessors".equals(m.getConfig().getName())) { found = true; Map<String, String> tags = m.getConfig().getTags().asMap(); assertEquals(tags.get("JmxDomain"), "java.lang"); assertEquals(tags.get("Jmx.type"), "OperatingSystem"); assertEquals(tags.get("ClassName"), "com.netflix.servo.publish.JmxMetricPoller"); assertEquals(tags.get(DataSourceType.KEY), "GAUGE"); } } assertTrue(found); }
@Test public void testCounterFilter() throws Exception { MetricPoller poller = new JmxMetricPoller( new LocalJmxConnector(), new ObjectName("java.lang:type=OperatingSystem"), MATCH_ALL); boolean found = false; List<Metric> metrics = poller.poll(MATCH_ALL); for (Metric m : metrics) { if ("AvailableProcessors".equals(m.getConfig().getName())) { found = true; Map<String, String> tags = m.getConfig().getTags().asMap(); assertEquals(tags.get("JmxDomain"), "java.lang"); assertEquals(tags.get("Jmx.type"), "OperatingSystem"); assertEquals(tags.get("ClassName"), "com.netflix.servo.publish.JmxMetricPoller"); assertEquals(tags.get(DataSourceType.KEY), "COUNTER"); } } assertTrue(found); }
/** * Tabular JMX values are very useful for cases where we want the same behavior as CompositePath but we * don't know up front what the values are going to be. */ @Test public void testTabularData() throws Exception { MapMXBean mapMXBean = new MapMXBean(); try { MetricPoller poller = new JmxMetricPoller( new LocalJmxConnector(), new ObjectName("com.netflix.servo.test:*"), MATCH_ALL); List<Metric> metrics = poller.poll(config -> config.getName().equals("Count")); assertEquals(metrics.size(), 2); Map<String, Integer> values = new HashMap<>(); for (Metric m : metrics) { values.put(m.getConfig().getTags().getTag("JmxCompositePath").getValue(), (Integer) m.getValue()); } assertEquals(values.get("Entry1"), (Integer) 111); assertEquals(values.get("Entry2"), (Integer) 222); } finally { mapMXBean.destroy(); } }
/** * Creates customized {@link PollRunnable} for {@link JmxMetricPoller}, which is capable of polling for JVM values. * * @param observers the list of observers that will react on the polled values, e.g. graphite * @param jmxMetricFilters a list of regex of type {@link ObjectName} filters to be used in {@link RegexMetricFilter} * , * in order to restrict the set of JVM metrics that are polled * @return customized {@link PollRunnable} for polling JVM values */ public PollRunnable createJvmMetricsTask(final List<MetricObserver> observers, final List<ObjectName> jmxMetricFilters) { // Create prefix filter on the metric name, default to match none if // no match is found so that by default metrics will be GAUGEs final MetricFilter counterFilter = new PrefixMetricFilter(null, BasicMetricFilter.MATCH_NONE, new TreeMap<String, MetricFilter>()); // Create a new poller for the local JMX server that queries Memory // metrics from the java.lang domain // poller = new JmxMetricPoller(new LocalJmxConnector(), new ObjectName(jmxMetricFilter), counterFilter); final MetricPoller poller = new JmxMetricPoller(new LocalJmxConnector(), jmxMetricFilters == null ? Collections.<ObjectName>emptyList() : jmxMetricFilters, counterFilter); // Filter to restrict the set of metrics returned final MetricFilter filter = new RegexMetricFilter(null, Pattern.compile(".*Supported$|.*Enabled$|^Valid$|^Verbose$"), false, true); // Schedule metrics to be collected in the background every 10 // seconds return new PollRunnable(poller, filter, observers != null ? observers : Collections.<MetricObserver>emptyList()); }