Add more runtime metrics like information about heap, class loading and threads to the metrics infrastructure
This commit is contained in:
parent
a09722272e
commit
a66fc3030e
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2013 the original author or authors.
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -16,6 +16,10 @@
|
|||
|
||||
package org.springframework.boot.actuate.endpoint;
|
||||
|
||||
import java.lang.management.ClassLoadingMXBean;
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.MemoryUsage;
|
||||
import java.lang.management.ThreadMXBean;
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedHashSet;
|
||||
|
||||
|
|
@ -28,6 +32,7 @@ import org.springframework.util.Assert;
|
|||
* {@link MetricReader} along with memory information.
|
||||
*
|
||||
* @author Dave Syer
|
||||
* @author Christian Dupuis
|
||||
*/
|
||||
public class VanillaPublicMetrics implements PublicMetrics {
|
||||
|
||||
|
|
@ -44,13 +49,65 @@ public class VanillaPublicMetrics implements PublicMetrics {
|
|||
for (Metric<?> metric : this.reader.findAll()) {
|
||||
result.add(metric);
|
||||
}
|
||||
|
||||
addMetrics(result);
|
||||
addHeapMetrics(result);
|
||||
addThreadMetrics(result);
|
||||
addClassLoadingMetrics(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add basic system metrics.
|
||||
*/
|
||||
protected void addMetrics(Collection<Metric<?>> result) {
|
||||
result.add(new Metric<Long>("mem",
|
||||
new Long(Runtime.getRuntime().totalMemory()) / 1024));
|
||||
result.add(new Metric<Long>("mem.free", new Long(Runtime.getRuntime()
|
||||
.freeMemory()) / 1024));
|
||||
result.add(new Metric<Integer>("processors", Runtime.getRuntime()
|
||||
.availableProcessors()));
|
||||
return result;
|
||||
// Add JVM uptime in ms
|
||||
result.add(new Metric<Long>("uptime", new Long(ManagementFactory
|
||||
.getRuntimeMXBean().getUptime())));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add JVM heap metrics.
|
||||
*/
|
||||
protected void addHeapMetrics(Collection<Metric<?>> result) {
|
||||
MemoryUsage memoryUsage = ManagementFactory.getMemoryMXBean()
|
||||
.getHeapMemoryUsage();
|
||||
result.add(new Metric<Long>("heap.committed", memoryUsage.getCommitted() / 1024));
|
||||
result.add(new Metric<Long>("heap.init", memoryUsage.getInit() / 1024));
|
||||
result.add(new Metric<Long>("heap.used", memoryUsage.getUsed() / 1024));
|
||||
result.add(new Metric<Long>("heap", memoryUsage.getMax() / 1024));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add thread metrics.
|
||||
*/
|
||||
protected void addThreadMetrics(Collection<Metric<?>> result) {
|
||||
ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
|
||||
result.add(new Metric<Long>("threads.peak", new Long(threadMxBean
|
||||
.getPeakThreadCount())));
|
||||
result.add(new Metric<Long>("threads.deamon", new Long(threadMxBean
|
||||
.getDaemonThreadCount())));
|
||||
result.add(new Metric<Long>("threads", new Long(threadMxBean.getThreadCount())));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add class loading metrics.
|
||||
*/
|
||||
protected void addClassLoadingMetrics(Collection<Metric<?>> result) {
|
||||
ClassLoadingMXBean classLoadingMxBean = ManagementFactory.getClassLoadingMXBean();
|
||||
result.add(new Metric<Long>("classes", new Long(classLoadingMxBean
|
||||
.getLoadedClassCount())));
|
||||
result.add(new Metric<Long>("classes.loaded", new Long(classLoadingMxBean
|
||||
.getTotalLoadedClassCount())));
|
||||
result.add(new Metric<Long>("classes.unloaded", new Long(classLoadingMxBean
|
||||
.getUnloadedClassCount())));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2013 the original author or authors.
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -32,6 +32,7 @@ import static org.junit.Assert.assertTrue;
|
|||
* Tests for {@link VanillaPublicMetrics}.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
* @author Christian Dupuis
|
||||
*/
|
||||
public class VanillaPublicMetricsTests {
|
||||
|
||||
|
|
@ -48,4 +49,32 @@ public class VanillaPublicMetricsTests {
|
|||
assertTrue(results.containsKey("mem.free"));
|
||||
assertThat(results.get("a").getValue().doubleValue(), equalTo(0.5));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSystemMetrics() throws Exception {
|
||||
InMemoryMetricRepository repository = new InMemoryMetricRepository();
|
||||
repository.set(new Metric<Double>("a", 0.5, new Date()));
|
||||
VanillaPublicMetrics publicMetrics = new VanillaPublicMetrics(repository);
|
||||
Map<String, Metric<?>> results = new HashMap<String, Metric<?>>();
|
||||
for (Metric<?> metric : publicMetrics.metrics()) {
|
||||
results.put(metric.getName(), metric);
|
||||
}
|
||||
assertTrue(results.containsKey("mem"));
|
||||
assertTrue(results.containsKey("mem.free"));
|
||||
assertTrue(results.containsKey("processors"));
|
||||
assertTrue(results.containsKey("uptime"));
|
||||
|
||||
assertTrue(results.containsKey("heap.committed"));
|
||||
assertTrue(results.containsKey("heap.init"));
|
||||
assertTrue(results.containsKey("heap.used"));
|
||||
assertTrue(results.containsKey("heap"));
|
||||
|
||||
assertTrue(results.containsKey("threads.peak"));
|
||||
assertTrue(results.containsKey("threads.deamon"));
|
||||
assertTrue(results.containsKey("threads"));
|
||||
|
||||
assertTrue(results.containsKey("classes.loaded"));
|
||||
assertTrue(results.containsKey("classes.unloaded"));
|
||||
assertTrue(results.containsKey("classes"));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -578,16 +578,27 @@ decrement). Metrics for all HTTP requests are automatically recorded, so if you
|
|||
"counter.status.401.root": 4,
|
||||
"gauge.response.root": 2,
|
||||
"gauge.response.metrics": 3,
|
||||
"mem": 466944,
|
||||
"mem.free": 410117,
|
||||
"processors": 8
|
||||
"classes": 5808,
|
||||
"classes.loaded": 5808,
|
||||
"classes.unloaded": 0,
|
||||
"heap": 3728384,
|
||||
"heap.committed": 986624,
|
||||
"heap.init": 262144,
|
||||
"heap.used": 52765,
|
||||
"mem": 986624,
|
||||
"mem.free": 933858,
|
||||
"processors": 8,
|
||||
"threads": 15,
|
||||
"threads.deamon": 11,
|
||||
"threads.peak": 15,
|
||||
"uptime": 494836
|
||||
}
|
||||
----
|
||||
|
||||
Here we can see basic `memory` and `processor` information along with some HTTP metrics.
|
||||
In this instance the `root` (``/'') and `/metrics` URLs have returned `HTTP 200` responses
|
||||
`20` and `3` times respectively. It also appears that the `root` URL returned `HTTP 401`
|
||||
(unauthorized) `4` times.
|
||||
Here we can see basic `memory`, `heap`, `class loading`, `processor` and `thread pool`
|
||||
information along with some HTTP metrics. In this instance the `root` (``/'') and `/metrics`
|
||||
URLs have returned `HTTP 200` responses `20` and `3` times respectively. It also appears
|
||||
that the `root` URL returned `HTTP 401` (unauthorized) `4` times.
|
||||
|
||||
The `gauge` shows the last response time for a request. So the last request to `root` took
|
||||
`2ms` to respond and the last to `/metrics` took `3ms`.
|
||||
|
|
|
|||
Loading…
Reference in New Issue