package com.bagri.test.tpox; import java.io.IOException; import java.net.MalformedURLException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Set; import javax.management.AttributeNotFoundException; import javax.management.InstanceNotFoundException; import javax.management.MBeanException; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.ReflectionException; import javax.management.openmbean.CompositeData; import javax.management.openmbean.TabularData; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import com.bagri.support.util.FileUtils; public class StatisticsCollector { private String jmxAddress; private String schema; private MBeanServerConnection mbsc; private JMXConnector jmxc; public static void main(String[] args) { String address = args[0]; String schema = args[1]; String kind = args[2]; String method = args[3]; String marker= args[4]; String file = args[5]; String clear = args[6]; System.out.println("got address: " + address + "; schema: " + schema + "; MBean: " + kind + "; method: " + method + "; clear: " + clear); try { StatisticsCollector sc = new StatisticsCollector(address, schema); String stats = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()) + "; " + marker; stats += "; " + sc.getActiveNodes(); stats += System.lineSeparator(); stats += sc.getStatistics(kind, method); System.out.println("got stats: " + stats + "will append to the file: " + file); stats += System.lineSeparator(); FileUtils.appendTextFile(file, stats); sc.resetStatistics(kind); if ("true".equalsIgnoreCase(clear)) { sc.clearSchema(true); } sc.jmxc.close(); } catch (Exception ex) { ex.printStackTrace(); } try { Thread.sleep(10000); } catch (InterruptedException ex) { ex.printStackTrace(); } } public StatisticsCollector(String jmxAddress, String schema) throws Exception { this.jmxAddress = jmxAddress; this.schema = schema; String url = "service:jmx:rmi:///jndi/rmi://" + jmxAddress + "/jmxrmi"; HashMap environment = new HashMap(); // TODO: get creds securely from outside.. //environment.put(JMXConnector.CREDENTIALS, new String[] {"SDV", "TPoX"}); environment.put(JMXConnector.CREDENTIALS, new String[] {"admin", "password"}); jmxc = JMXConnectorFactory.connect(new JMXServiceURL(url), environment); mbsc = jmxc.getMBeanServerConnection(); } public String getActiveNodes() throws Exception { ObjectName mName = new ObjectName("com.bagri.db:name=" + schema + ",type=Schema"); String[] nodes = (String[]) mbsc.getAttribute(mName, "ActiveNodes"); return Arrays.toString(nodes); } public String getStatistics(String kind, String method) throws Exception { ObjectName mName = new ObjectName("com.bagri.db:type=Schema,name=" + schema + ",kind=" + kind); TabularData data = (TabularData) mbsc.getAttribute(mName, "InvocationStatistics"); if (data != null) { CompositeData stats = data.get(new String[] {method}); if (stats != null) { StringBuffer buff = new StringBuffer(); for (String key: stats.getCompositeType().keySet()) { buff.append(key).append("=").append(stats.get(key)); buff.append("; "); } return buff.toString(); } } return ""; } public void resetStatistics(String kind) throws Exception { ObjectName mName = new ObjectName("com.bagri.db:type=Schema,name=" + schema + ",kind=" + kind); mbsc.invoke(mName, "resetStatistics", null, null); //jmxc.close(); } public void clearSchema(boolean evictOnly) throws Exception { ObjectName mName = new ObjectName("com.bagri.db:type=Schema,name=" + schema + ",kind=DocumentManagement"); mbsc.invoke(mName, "clear", new Object[] {evictOnly}, new String[] {boolean.class.getName()}); //jmxc.close(); } }