com.metamx.metrics.JvmMonitor Maven / Gradle / Ivy
/*
* Copyright 2012 Metamarkets Group Inc.
*
* 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 com.metamx.metrics;
import com.google.common.collect.ImmutableMap;
import com.metamx.emitter.service.ServiceEmitter;
import com.metamx.emitter.service.ServiceMetricEvent;
import java.lang.management.BufferPoolMXBean;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryType;
import java.lang.management.MemoryUsage;
import java.util.Map;
public class JvmMonitor extends AbstractMonitor
{
private final KeyedDiff gcDiff = new KeyedDiff();
@Override
public boolean doMonitor(ServiceEmitter emitter)
{
// I have no idea why, but jvm/mem is slightly more than the sum of jvm/pool. Let's just include
// them both.
// jvm/mem
final Map usages = ImmutableMap.of(
"heap", ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(),
"nonheap", ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
);
for (Map.Entry entry : usages.entrySet()) {
final String kind = entry.getKey();
final MemoryUsage usage = entry.getValue();
final ServiceMetricEvent.Builder builder = new ServiceMetricEvent.Builder()
.setUser1(kind);
emitter.emit(builder.build("jvm/mem/max", usage.getMax()));
emitter.emit(builder.build("jvm/mem/committed", usage.getCommitted()));
emitter.emit(builder.build("jvm/mem/used", usage.getUsed()));
emitter.emit(builder.build("jvm/mem/init", usage.getInit()));
}
// jvm/pool
for (MemoryPoolMXBean pool : ManagementFactory.getMemoryPoolMXBeans()) {
final String kind = pool.getType() == MemoryType.HEAP ? "heap" : "nonheap";
final MemoryUsage usage = pool.getUsage();
final ServiceMetricEvent.Builder builder = new ServiceMetricEvent.Builder()
.setUser1(kind)
.setUser2(pool.getName());
emitter.emit(builder.build("jvm/pool/max", usage.getMax()));
emitter.emit(builder.build("jvm/pool/committed", usage.getCommitted()));
emitter.emit(builder.build("jvm/pool/used", usage.getUsed()));
emitter.emit(builder.build("jvm/pool/init", usage.getInit()));
}
// jvm/gc
for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) {
final Map diff = gcDiff.to(gc.getName(), ImmutableMap.of(
"jvm/gc/time", gc.getCollectionTime(),
"jvm/gc/count", gc.getCollectionCount()
));
if (diff != null) {
final ServiceMetricEvent.Builder builder = new ServiceMetricEvent.Builder()
.setUser1(gc.getName());
for (Map.Entry entry : diff.entrySet()) {
emitter.emit(builder.build(entry.getKey(), entry.getValue()));
}
}
}
// direct memory usage
for (BufferPoolMXBean pool : ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class)) {
final ServiceMetricEvent.Builder builder = new ServiceMetricEvent.Builder()
.setUser2(pool.getName());
emitter.emit(builder.build("jvm/bufferpool/capacity", pool.getTotalCapacity()));
emitter.emit(builder.build("jvm/bufferpool/used", pool.getMemoryUsed()));
emitter.emit(builder.build("jvm/bufferpool/count", pool.getCount()));
}
return true;
}
}