Browse Source
This commit permits the use of several PublicMetrics instances by default. Previously, only one PublicMetrics service could be specified and a user configuration would remove all the defaulting. VanillaPublicMetrics now takes a collection of PublicMetrics and invokes them in sequence to build the final collection of metrics. The system-related metrics have been moved to SystemPublicMetrics and are registered by default. Also updated the documentation to mention this feature and how it could be fully overridden. Fixes gh-1094pull/1253/merge
8 changed files with 334 additions and 144 deletions
@ -0,0 +1,136 @@
@@ -0,0 +1,136 @@
|
||||
/* |
||||
* 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.actuate.endpoint; |
||||
|
||||
import java.lang.management.ClassLoadingMXBean; |
||||
import java.lang.management.GarbageCollectorMXBean; |
||||
import java.lang.management.ManagementFactory; |
||||
import java.lang.management.MemoryUsage; |
||||
import java.lang.management.ThreadMXBean; |
||||
import java.util.Collection; |
||||
import java.util.LinkedHashSet; |
||||
import java.util.List; |
||||
|
||||
import org.springframework.boot.actuate.metrics.Metric; |
||||
import org.springframework.util.StringUtils; |
||||
|
||||
/** |
||||
* A {@link PublicMetrics} implementation that provides various |
||||
* system-related metrics. |
||||
* |
||||
* @author Dave Syer |
||||
* @author Stephane Nicoll |
||||
* @since 1.2.0 |
||||
*/ |
||||
public class SystemPublicMetrics implements PublicMetrics { |
||||
|
||||
private long timestamp; |
||||
|
||||
public SystemPublicMetrics() { |
||||
this.timestamp = System.currentTimeMillis(); |
||||
} |
||||
|
||||
@Override |
||||
public Collection<Metric<?>> metrics() { |
||||
Collection<Metric<?>> result = new LinkedHashSet<Metric<?>>(); |
||||
|
||||
addBasicMetrics(result); |
||||
addHeapMetrics(result); |
||||
addThreadMetrics(result); |
||||
addClassLoadingMetrics(result); |
||||
addGarbageCollectionMetrics(result); |
||||
|
||||
return result; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Add basic system metrics. |
||||
*/ |
||||
protected void addBasicMetrics(Collection<Metric<?>> result) { |
||||
result.add(new Metric<Long>("mem", |
||||
Runtime.getRuntime().totalMemory() / 1024)); |
||||
result.add(new Metric<Long>("mem.free", Runtime.getRuntime() |
||||
.freeMemory() / 1024)); |
||||
result.add(new Metric<Integer>("processors", Runtime.getRuntime() |
||||
.availableProcessors())); |
||||
// Add JVM up time in ms
|
||||
result.add(new Metric<Long>("uptime", ManagementFactory |
||||
.getRuntimeMXBean().getUptime())); |
||||
result.add(new Metric<Long>("instance.uptime", System.currentTimeMillis() |
||||
- this.timestamp)); |
||||
} |
||||
|
||||
/** |
||||
* 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", (long) threadMxBean |
||||
.getPeakThreadCount())); |
||||
result.add(new Metric<Long>("threads.daemon", (long) threadMxBean |
||||
.getDaemonThreadCount())); |
||||
result.add(new Metric<Long>("threads", (long) threadMxBean.getThreadCount())); |
||||
} |
||||
|
||||
/** |
||||
* Add class loading metrics. |
||||
*/ |
||||
protected void addClassLoadingMetrics(Collection<Metric<?>> result) { |
||||
ClassLoadingMXBean classLoadingMxBean = ManagementFactory.getClassLoadingMXBean(); |
||||
result.add(new Metric<Long>("classes", (long) classLoadingMxBean |
||||
.getLoadedClassCount())); |
||||
result.add(new Metric<Long>("classes.loaded", classLoadingMxBean |
||||
.getTotalLoadedClassCount())); |
||||
result.add(new Metric<Long>("classes.unloaded", classLoadingMxBean |
||||
.getUnloadedClassCount())); |
||||
} |
||||
|
||||
/** |
||||
* Add garbage collection metrics. |
||||
*/ |
||||
protected void addGarbageCollectionMetrics(Collection<Metric<?>> result) { |
||||
List<GarbageCollectorMXBean> garbageCollectorMxBeans = ManagementFactory |
||||
.getGarbageCollectorMXBeans(); |
||||
for (GarbageCollectorMXBean garbageCollectorMXBean : garbageCollectorMxBeans) { |
||||
String name = beautifyGcName(garbageCollectorMXBean.getName()); |
||||
result.add(new Metric<Long>("gc." + name + ".count", garbageCollectorMXBean.getCollectionCount())); |
||||
result.add(new Metric<Long>("gc." + name + ".time", garbageCollectorMXBean.getCollectionTime())); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Turn GC names like 'PS Scavenge' or 'PS MarkSweep' into something that is more |
||||
* metrics friendly. |
||||
*/ |
||||
private String beautifyGcName(String name) { |
||||
return StringUtils.replace(name, " ", "_").toLowerCase(); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,61 @@
@@ -0,0 +1,61 @@
|
||||
/* |
||||
* 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.actuate.endpoint; |
||||
|
||||
import static org.junit.Assert.*; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
import org.junit.Test; |
||||
|
||||
import org.springframework.boot.actuate.metrics.Metric; |
||||
|
||||
/** |
||||
* Tests for {@link SystemPublicMetrics} |
||||
* |
||||
* @author Stephane Nicoll |
||||
*/ |
||||
public class SystemPublicMetricsTests { |
||||
|
||||
@Test |
||||
public void testSystemMetrics() throws Exception { |
||||
SystemPublicMetrics publicMetrics = new SystemPublicMetrics(); |
||||
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.daemon")); |
||||
assertTrue(results.containsKey("threads")); |
||||
|
||||
assertTrue(results.containsKey("classes.loaded")); |
||||
assertTrue(results.containsKey("classes.unloaded")); |
||||
assertTrue(results.containsKey("classes")); |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue