shared project
This commit is contained in:
commit
57beece37a
22
crawler_jmx_java.iml
Normal file
22
crawler_jmx_java.iml
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output url="file://$MODULE_DIR$/../jmx_crawler/target/classes" />
|
||||
<output-test url="file://$MODULE_DIR$/../jmx_crawler/target/test-classes" />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="Maven: com.loafle.overflow:crawler:1.0.0-SNAPSHOT" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
|
||||
<orderEntry type="library" scope="RUNTIME" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
|
||||
<orderEntry type="library" scope="RUNTIME" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
|
||||
</component>
|
||||
</module>
|
29
pom.xml
Normal file
29
pom.xml
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>com.loafle</groupId>
|
||||
<artifactId>maven_parent_jar</artifactId>
|
||||
<version>1.0.0-RELEASE</version>
|
||||
</parent>
|
||||
|
||||
<groupId>com.loafle.overflow</groupId>
|
||||
<artifactId>crawler_jmx</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<name>com.loafle.overflow.crawler_jmx</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.loafle.overflow</groupId>
|
||||
<artifactId>crawler</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
|
||||
</project>
|
302
src/main/java/com/loafle/overflow/crawler/jmx/JmxCrawler.java
Normal file
302
src/main/java/com/loafle/overflow/crawler/jmx/JmxCrawler.java
Normal file
|
@ -0,0 +1,302 @@
|
|||
package com.loafle.overflow.crawler.jmx;
|
||||
|
||||
import com.loafle.overflow.crawler.Crawler;
|
||||
|
||||
import javax.management.*;
|
||||
import javax.management.openmbean.CompositeData;
|
||||
import javax.management.openmbean.CompositeType;
|
||||
import javax.management.openmbean.TabularData;
|
||||
import javax.management.openmbean.TabularType;
|
||||
import javax.management.remote.JMXConnector;
|
||||
import javax.management.remote.JMXConnectorFactory;
|
||||
import javax.management.remote.JMXServiceURL;
|
||||
import javax.management.remote.rmi.RMIConnectorServer;
|
||||
|
||||
import javax.naming.Context;
|
||||
import javax.rmi.ssl.SslRMIClientSocketFactory;
|
||||
import java.io.IOException;
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.util.*;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Created by geek on 2017-04-06.
|
||||
*/
|
||||
|
||||
public class JmxCrawler extends Crawler{
|
||||
private static final Logger logger = Logger.getLogger(JmxCrawler.class.getName());
|
||||
|
||||
private String jmxUrl;
|
||||
private String username;
|
||||
private String password;
|
||||
private boolean ssl;
|
||||
private MBeanReceiver receiver;
|
||||
|
||||
private List<Object> result = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public Object getInternal(Map<String, Object> map) throws Exception {
|
||||
|
||||
MBeanReceiver m = new MBeanReceiver() {
|
||||
@Override
|
||||
public void recordBean(String domain, LinkedList<String> attrKeys, String attrName, String attrType, String attrDescription, Object value) {
|
||||
Map<String, String> l = new HashMap<String, String>();
|
||||
l.put(attrName, attrType+" "+value);
|
||||
result.add(l);
|
||||
}
|
||||
};
|
||||
|
||||
String jmxUrl = (String) map.get("jmxUrl");
|
||||
String username = (String)map.get("username");
|
||||
String password = (String)map.get("password");
|
||||
Boolean isSSL = (Boolean)map.get("ssl");
|
||||
|
||||
JmxCrawler jmxCrawler = new JmxCrawler(
|
||||
jmxUrl,
|
||||
username,
|
||||
password,
|
||||
isSSL,
|
||||
m
|
||||
);
|
||||
|
||||
jmxCrawler.doCrawler();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static interface MBeanReceiver {
|
||||
void recordBean(String domain, LinkedList<String> attrKeys, String attrName, String attrType, String attrDescription, Object value);
|
||||
}
|
||||
|
||||
public JmxCrawler() {
|
||||
|
||||
}
|
||||
public JmxCrawler(String jmxUrl, String username, String password, boolean ssl, MBeanReceiver receiver) {
|
||||
this.jmxUrl = jmxUrl;
|
||||
this.username = username;
|
||||
this.password = password;
|
||||
this.ssl = ssl;
|
||||
this.receiver = receiver;
|
||||
}
|
||||
|
||||
// 커넥터 생성
|
||||
public void doCrawler() throws Exception {
|
||||
MBeanServerConnection beanCon;
|
||||
JMXConnector jmxconn = null;
|
||||
|
||||
if (this.jmxUrl.isEmpty()) {
|
||||
beanCon = ManagementFactory.getPlatformMBeanServer();
|
||||
} else {
|
||||
Map<String, Object> environment = getAuthority();
|
||||
jmxconn = JMXConnectorFactory.connect(new JMXServiceURL(this.jmxUrl), environment);
|
||||
beanCon = jmxconn.getMBeanServerConnection();
|
||||
}
|
||||
|
||||
try {
|
||||
Set<ObjectInstance> mBeanNames = new HashSet();
|
||||
List<ObjectName> objectNames = new LinkedList<ObjectName>();
|
||||
objectNames.add(null);
|
||||
|
||||
// for (ObjectName name : objectNames) {
|
||||
// Set<ObjectInstance> objectInstances = beanCon.queryMBeans(name, null);
|
||||
//
|
||||
// for (ObjectInstance oi : objectInstances ) {
|
||||
// System.out.println("oi = " + oi.getClassName());
|
||||
// }
|
||||
// mBeanNames.addAll(beanCon.queryMBeans(name, null));
|
||||
//// beanCon.queryMBeans(new ObjectName("Catalina:type=Engine"), null);
|
||||
// }
|
||||
|
||||
// for (ObjectInstance name : mBeanNames) {
|
||||
// crawlerBean(beanCon, name.getObjectName());
|
||||
// }
|
||||
|
||||
ObjectName on = new ObjectName("Catalina:type=*,*");
|
||||
// ObjectName on = new ObjectName("org.apache.cassandra.db:type=*,*");
|
||||
|
||||
mBeanNames.addAll(beanCon.queryMBeans(on,null));
|
||||
|
||||
for (ObjectInstance name : mBeanNames) {
|
||||
crawlerBean(beanCon, name.getObjectName());
|
||||
}
|
||||
}finally {
|
||||
if (jmxconn != null) {
|
||||
jmxconn.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 수집
|
||||
private void crawlerBean(MBeanServerConnection beanCon, ObjectName mbeanName) {
|
||||
MBeanInfo info;
|
||||
|
||||
try {
|
||||
info = beanCon.getMBeanInfo(mbeanName);
|
||||
} catch (IOException e) {
|
||||
logCrawler(mbeanName.toString(), "getMbeanInfo Fail: " + e);
|
||||
return;
|
||||
} catch (JMException e) {
|
||||
logCrawler(mbeanName.toString(), "getMbeanInfo Fail: " + e);
|
||||
return;
|
||||
}
|
||||
|
||||
MBeanAttributeInfo[] attrInfos = info.getAttributes();
|
||||
|
||||
for (int idx = 0; idx < attrInfos.length; ++idx) {
|
||||
MBeanAttributeInfo attr = attrInfos[idx];
|
||||
|
||||
if (!attr.isReadable()) {
|
||||
logCrawler(mbeanName, attr, "not readable");
|
||||
continue;
|
||||
}
|
||||
|
||||
Object value;
|
||||
|
||||
try {
|
||||
value = beanCon.getAttribute(mbeanName, attr.getName());
|
||||
} catch (Exception e) {
|
||||
logCrawler(mbeanName, attr, "Fail: " + e);
|
||||
continue;
|
||||
}
|
||||
|
||||
logCrawler(mbeanName, attr, "process");
|
||||
processBeanValue(
|
||||
mbeanName.getDomain(),
|
||||
new LinkedList<String>(),
|
||||
attr.getName(),
|
||||
attr.getType(),
|
||||
attr.getDescription(),
|
||||
value
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private void processBeanValue(String domain, LinkedList<String> attrKeys, String attrName, String attrType, String attrDescription, Object value) {
|
||||
if (value == null) {
|
||||
logCrawler("ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"+domain + attrName, "null");
|
||||
} else if (value instanceof Number || value instanceof String || value instanceof Boolean) {
|
||||
logCrawler(domain + attrName, value.toString());
|
||||
this.receiver.recordBean(domain, attrKeys, attrName, attrType, attrDescription,value);
|
||||
// JSON 결과 생성
|
||||
} else if (value instanceof CompositeData) {
|
||||
logCrawler("ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"+domain + attrName, "compositedata");
|
||||
CompositeData composite = (CompositeData)value;
|
||||
CompositeType type = composite.getCompositeType();
|
||||
attrKeys = new LinkedList<String>();
|
||||
attrKeys.add(attrName);
|
||||
|
||||
for (String key : type.keySet()) {
|
||||
String typ = type.getType(key).getTypeName();
|
||||
Object val = composite.get(key);
|
||||
|
||||
processBeanValue(domain, attrKeys, key, typ, type.getDescription(), val);
|
||||
}
|
||||
} else if (value instanceof TabularData) {
|
||||
logCrawler("ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"+domain + attrName, "tabulardata");
|
||||
TabularData tds = (TabularData)value;
|
||||
TabularType tt = tds.getTabularType();
|
||||
|
||||
CompositeType type = tt.getRowType();
|
||||
Set<String> valueKeys = new TreeSet<String>(type.keySet());
|
||||
|
||||
LinkedList<String> extendedAttrKeys = new LinkedList<String>(attrKeys);
|
||||
extendedAttrKeys.add(attrName);
|
||||
|
||||
for (Object valu : tds.values()) {
|
||||
if (valu instanceof CompositeData) {
|
||||
CompositeData composite = (CompositeData) valu;
|
||||
|
||||
for(String valueIdx : valueKeys) {
|
||||
LinkedList<String> attrNames = extendedAttrKeys;
|
||||
String typ = type.getType(valueIdx).getTypeName();
|
||||
String name = valueIdx;
|
||||
if (valueIdx.toLowerCase().equals("value")) {
|
||||
// Skip appending 'value' to the name
|
||||
attrNames = attrKeys;
|
||||
name = attrName;
|
||||
}
|
||||
processBeanValue(
|
||||
domain,
|
||||
attrNames,
|
||||
name,
|
||||
typ,
|
||||
type.getDescription(),
|
||||
composite.get(valueIdx));
|
||||
}
|
||||
} else {
|
||||
logCrawler(domain, "not a correct tabulardata format");
|
||||
}
|
||||
}
|
||||
} else if (value.getClass().isArray()) {
|
||||
logCrawler(domain, "arrays are unsupported");
|
||||
} else {
|
||||
logCrawler(domain, attrType + "is not exported");
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Object> getAuthority() {
|
||||
|
||||
Map<String, Object> environment = new HashMap<String, Object>();
|
||||
|
||||
if (this.username != null && this.username.length() != 0 && this.password != null && this.password.length() != 0) {
|
||||
String[] credent = new String[] {this.username, this.password};
|
||||
environment.put(JMXConnector.CREDENTIALS, credent);
|
||||
}
|
||||
|
||||
if (this.ssl) {
|
||||
environment.put(Context.SECURITY_PROTOCOL, "ssl");
|
||||
SslRMIClientSocketFactory clientSocketFactory = new SslRMIClientSocketFactory();
|
||||
environment.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE, clientSocketFactory);
|
||||
environment.put("com.sun.jndi.rmi.factory.socket", clientSocketFactory);
|
||||
}
|
||||
|
||||
return environment;
|
||||
}
|
||||
|
||||
private static void logCrawler(String name, String msg) {
|
||||
logger.log(Level.FINE, "crawler : '" + name + "': " + msg);
|
||||
}
|
||||
|
||||
private static void logCrawler(ObjectName mbeanName, MBeanAttributeInfo attr, String msg) {
|
||||
logCrawler(mbeanName + "'_'" + attr.getName(), msg);
|
||||
}
|
||||
|
||||
private static class StdoutWriter implements MBeanReceiver {
|
||||
public void recordBean(
|
||||
String domain,
|
||||
LinkedList<String> attrKeys,
|
||||
String attrName,
|
||||
String attrType,
|
||||
String attrDescription,
|
||||
Object value) {
|
||||
|
||||
System.out.println(domain +
|
||||
" " + attrKeys + " " +
|
||||
" " + attrName + " " +
|
||||
" " + attrDescription + " " +
|
||||
" " + value);
|
||||
}
|
||||
}
|
||||
|
||||
// public static void main(String[] args) throws Exception {
|
||||
|
||||
// JmxCrawler jmxCrawler = new JmxCrawler(
|
||||
//// "service:jmx:rmi:///jndi/rmi://192.168.1.207:7199/jmxrmi",
|
||||
// "service:jmx:rmi:///jndi/rmi://192.168.1.103:9840/jmxrmi",
|
||||
//// "",
|
||||
// "",
|
||||
// "",
|
||||
// false,
|
||||
// new StdoutWriter()
|
||||
// );
|
||||
//
|
||||
// jmxCrawler.doCrawler();
|
||||
|
||||
// JmxCrawler d = new JmxCrawler();
|
||||
// Map<String, Object> m = new HashMap<>();
|
||||
// m.put("ip","service:jmx:rmi:///jndi/rmi://192.168.1.207:7199/jmxrmi");
|
||||
//
|
||||
// Object r = d.getInternal(m);
|
||||
// System.out.println("r = " + r);
|
||||
// }
|
||||
}
|
0
src/main/resources/_
Normal file
0
src/main/resources/_
Normal file
28
src/test/java/com/loafle/AppTest.java
Normal file
28
src/test/java/com/loafle/AppTest.java
Normal file
|
@ -0,0 +1,28 @@
|
|||
|
||||
package com.loafle;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import com.loafle.overflow.crawler.jmx.JmxCrawler;
|
||||
import org.junit.Test;
|
||||
|
||||
public class AppTest {
|
||||
@Test
|
||||
public void testSum() {
|
||||
assertEquals(1,1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void TestDoCrawler() {
|
||||
// JmxCrawler jmxCrawler = new JmxCrawler(
|
||||
//// "service:jmx:rmi:///jndi/rmi://192.168.1.207:7199/jmxrmi",
|
||||
// "service:jmx:rmi:///jndi/rmi://192.168.1.103:9840/jmxrmi",
|
||||
//// "",
|
||||
// "",
|
||||
// "",
|
||||
// false,
|
||||
// new JmxCrawler.StdoutWriter()
|
||||
// );
|
||||
//
|
||||
// jmxCrawler.doCrawler();
|
||||
}
|
||||
}
|
17
src/test/resources/logback.xml
Normal file
17
src/test/resources/logback.xml
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration scan="true" scanPeriod="3 seconds">
|
||||
<contextName>jmx_crawler</contextName>
|
||||
<!-- TRACE > DEBUG > INFO > WARN > ERROR -->
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>
|
||||
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{32} - %msg%n
|
||||
</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<root level="DEBUG">
|
||||
<appender-ref ref="STDOUT" />
|
||||
</root>
|
||||
<logger name="com.loafle.overflow" level="ALL" />
|
||||
</configuration>
|
Loading…
Reference in New Issue
Block a user