文章目录
-
-
- 实现指标
- 注册MBean
- JMXServer
- JMXReport
- JmxRequest
- 总结
-
最近看kafka,flink源码发现,监控指标都是通过jmx进行上报的,于是我也决定自己实现一个
流程图
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL1sGROlXSq1UeJpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyUTOyIzM1MjMxADOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
实现指标
Metrix
public interface Metric {
}
Meter
public interface Meter extends Metric {
/**
* Mark occurrence of an event.
*/
void markEvent();
}
MeterView
public class MeterView implements Meter {
private long count;
// 指标增长方式
public void markEvent() {
count++;
}
public Long getCount(){
return count;
}
}
注册MBean
JmxMetricMBean
public interface JmxMetricMBean {
// 方法规范
public long getCount();
public void setCount();
}
JmxMetric
// 类名必须为JmxMetric,MBean的规范
public class JmxMetric implements JmxMetricMBean {
MeterView meterView;
public JmxMetric() {
meterView = new MeterView();
}
// 属性为Count
public long getCount() {
return meterView.getCount();
}
public void setCount(){
}
}
JMXServer
public class JmxService {
private Registry rmiRegistry;
private JMXConnectorServer connector;
public void start() {
try {
startRmiRegistry();
startJmxService();
} catch (IOException e) {
e.printStackTrace();
}
}
private void startJmxService() throws IOException {
String serviceUrl = "service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi";
JMXServiceURL url;
try {
url = new JMXServiceURL(serviceUrl);
} catch (MalformedURLException e) {
throw new IllegalArgumentException("Malformed service url created " + serviceUrl, e);
}
connector = JMXConnectorServerFactory.newJMXConnectorServer(url, null, ManagementFactory.getPlatformMBeanServer());
connector.start();
}
private void startRmiRegistry() throws IOException {
rmiRegistry = LocateRegistry.createRegistry(9999);
}
}
JMXReport
public class JmxReport {
private final MBeanServer mBeanServer;
public JmxReport() {
this.mBeanServer = ManagementFactory.getPlatformMBeanServer();
}
public void init(){
JmxService service = new JmxService();
service.start();
}
public void addMetric() {
JmxMetric bean = new JmxMetric();
try {
// objectName按照规范走
ObjectName name = new ObjectName("com.test:type=JmxMeter");
try {
// 注册MBean
mBeanServer.registerMBean(bean, name);
//模拟指标增长
start(bean);
} catch (InstanceAlreadyExistsException e) {
e.printStackTrace();
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
e.printStackTrace();
}
} catch (MalformedObjectNameException e) {
e.printStackTrace();
}
}
public void start(JmxMetric bean) {
while (true) {
bean.meterView.markEvent();
System.out.println("aa");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
JmxRequest
public class JmxRequest {
public static void main(String[] args) {
String urlString = "service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi";
try {
JMXServiceURL serviceURL = new JMXServiceURL(urlString);
JMXConnector connect = JMXConnectorFactory.connect(serviceURL);
MBeanServerConnection mBeanServerConnection = connect.getMBeanServerConnection();
//和注册的一一对应
ObjectName name = new ObjectName("com.test:type=JmxMetric");
String va[] = {"Count"};
AttributeList attributes = mBeanServerConnection.getAttributes(name, va);
for (int i = 0; i < attributes.size(); i++) {
System.out.println(attributes.get(i));
}
} catch (IOException e) {
e.printStackTrace();
} catch (InstanceNotFoundException e) {
e.printStackTrace();
} catch (ReflectionException e) {
e.printStackTrace();
} catch (MalformedObjectNameException e) {
e.printStackTrace();
}
}
}
总结
1.很多分布式系统都通过这种方式上报监控数据,值得我们在工作中学习借鉴。