http://jerrypeng.me/2014/08/08/server-side-java-monitoring-java/
这个漫长的系列文章今天要迎来最后一篇了,也是真正与 Java 有关的部分。前面介绍了我们的监控方案的 Ganglia 和 Nagios 及其整合的部分,这一次则介绍如何记录 Java 应用内的性能参数并将其暴露给监控系统。
主要介绍的内容有 JMX 以及将监控 JMX 并发送数据到 Ganglia 的 jmxtrans,同时还会介绍我实现的一个简单的记录性能参数的方法。
1. JMX
JMX 基本上是 Java 应用监控的标准解决方案,JVM 本身的诸多性能指标如内存使用、GC、线程等都有对应的 JMX 参数可供监控。自定义 MBean 也是十分简单的一件事。可以用两种方式来定义 MBean,第一种是通过自定义接口和对应的实现类,另一种则是实现 javax.management.DynamicMBean 接口来定义动态的 MBean。我们采用的是第二种方式,因此略过第一种方式的介绍,有兴趣的读者请参考Java Tutorial 里的教程和 Javalobby 上的文章。
下面是我们内部使用的 MetricMBean,使用 DynamicMBean 实现:
public class MetricsMBean implementsDynamicMBean {private final Mapmetrics;public MetricsMBean(Mapmetrics) {this.metrics = new HashMap<>(metrics);
}
@OverridepublicObject getAttribute(String attribute)throwsAttributeNotFoundException,
MBeanException,
ReflectionException {
Metric metric=metrics.get(attribute);if (metric == null) {throw new AttributeNotFoundException("Attribute " + attribute + " not found");
}returnmetric.getValue();
}
@Overridepublic voidsetAttribute(Attribute attribute)throwsAttributeNotFoundException,
InvalidAttributeValueException,
MBeanException,
ReflectionException {//我们仅仅需要做监控,没有设置属性的需要,所以直接抛异常
throw new UnsupportedOperationException("Setting attribute is not supported");
}
@OverridepublicAttributeList getAttributes(String[] attributes) {
AttributeList attrList= newAttributeList();for(String attr : attributes) {
Metric metric=metrics.get(attr);if (metric != null)
attrList.add(newAttribute(attr, metric.getValue()));
}returnattrList;
}
@OverridepublicAttributeList setAttributes(AttributeList attributes) {//我们仅仅需要做监控,没有设置属性的需要,所以直接抛异常
throw new UnsupportedOperationException("Setting attribute is not supported");
}
@OverridepublicObject invoke(String actionName,
Object[] params,
String[] signature)throwsMBeanException, ReflectionException {//方法调用也是不需要实现的
throw new UnsupportedOperationException("Invoking is not supported");
}
@OverridepublicMBeanInfo