New library: LILJM for JMX Monitoring
Showing
10 changed files
with
417 additions
and
0 deletions
LILJM/.classpath
0 → 100644
LILJM/.project
0 → 100644
| 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | <projectDescription> | ||
| 3 | <name>LILJM Library</name> | ||
| 4 | <comment></comment> | ||
| 5 | <projects> | ||
| 6 | </projects> | ||
| 7 | <buildSpec> | ||
| 8 | <buildCommand> | ||
| 9 | <name>org.eclipse.jdt.core.javabuilder</name> | ||
| 10 | <arguments> | ||
| 11 | </arguments> | ||
| 12 | </buildCommand> | ||
| 13 | </buildSpec> | ||
| 14 | <natures> | ||
| 15 | <nature>org.eclipse.jdt.core.javanature</nature> | ||
| 16 | </natures> | ||
| 17 | </projectDescription> |
LILJM/.settings/org.eclipse.jdt.core.prefs
0 → 100644
| 1 | eclipse.preferences.version=1 | ||
| 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled | ||
| 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 | ||
| 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve | ||
| 5 | org.eclipse.jdt.core.compiler.compliance=1.6 | ||
| 6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate | ||
| 7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate | ||
| 8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate | ||
| 9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error | ||
| 10 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error | ||
| 11 | org.eclipse.jdt.core.compiler.source=1.6 |
LILJM/se/lil/jm/.gitignore
0 → 100644
LILJM/se/lil/jm/Collector.java
0 → 100644
| 1 | package se.lil.jm; | ||
| 2 | |||
| 3 | import java.util.ArrayList; | ||
| 4 | |||
| 5 | class Collector { | ||
| 6 | ArrayList<LongDelta> listLong = new ArrayList<LongDelta>(); | ||
| 7 | |||
| 8 | public void updateValue(Long ts, String name, Long value) { | ||
| 9 | LongDelta myDelta = null; | ||
| 10 | for(int x = 0; x<listLong.size() && myDelta == null; x++) { | ||
| 11 | if(name.equals(listLong.get(x).name)) { | ||
| 12 | myDelta = listLong.get(x); | ||
| 13 | } | ||
| 14 | } | ||
| 15 | if(myDelta != null) { | ||
| 16 | myDelta.update(ts, value); | ||
| 17 | } else { | ||
| 18 | myDelta = new LongDelta(ts, value); | ||
| 19 | listLong.add(myDelta); | ||
| 20 | } | ||
| 21 | } | ||
| 22 | |||
| 23 | public long getCurrentValue(String name) { | ||
| 24 | LongDelta myDelta = null; | ||
| 25 | for(int x = 0; x<listLong.size() && myDelta == null; x++) { | ||
| 26 | if(name.equals(listLong.get(x).name)) { | ||
| 27 | myDelta = listLong.get(x); | ||
| 28 | } | ||
| 29 | } | ||
| 30 | if(myDelta != null) | ||
| 31 | return myDelta.getCurrentValue(); | ||
| 32 | else | ||
| 33 | return 0; | ||
| 34 | } | ||
| 35 | |||
| 36 | public double getPerSecValue(String name) throws Throwable { | ||
| 37 | LongDelta myDelta = null; | ||
| 38 | for(int x = 0; x<listLong.size() && myDelta == null; x++) { | ||
| 39 | if(name.equals(listLong.get(x).name)) { | ||
| 40 | myDelta = listLong.get(x); | ||
| 41 | } | ||
| 42 | } | ||
| 43 | if(myDelta != null) | ||
| 44 | return myDelta.getPerSecondValue(); | ||
| 45 | else | ||
| 46 | return 0; | ||
| 47 | } | ||
| 48 | } | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
LILJM/se/lil/jm/DoubleDelta.java
0 → 100644
| 1 | package se.lil.jm; | ||
| 2 | |||
| 3 | public class DoubleDelta { | ||
| 4 | public String name = null; | ||
| 5 | public Double curValue = null; | ||
| 6 | public Double lastValue = null; | ||
| 7 | public Long lastFetch = null; | ||
| 8 | public Long curFetch = null; | ||
| 9 | |||
| 10 | public DoubleDelta() { | ||
| 11 | } | ||
| 12 | |||
| 13 | public DoubleDelta(Long timestamp, Double value) { | ||
| 14 | this.curFetch = timestamp; | ||
| 15 | this.curValue = value; | ||
| 16 | } | ||
| 17 | |||
| 18 | public void update(Long timestamp, Double value) { | ||
| 19 | this.lastFetch = this.curFetch; | ||
| 20 | this.curFetch = timestamp; | ||
| 21 | this.lastValue = this.curValue; | ||
| 22 | this.curValue = value; | ||
| 23 | } | ||
| 24 | |||
| 25 | public double getPerSecondValue() { | ||
| 26 | if(this.curValue != null && this.lastValue != null && this.lastFetch != null && this.curFetch != null) { | ||
| 27 | // We have values, calculate the number of gets per second | ||
| 28 | double numMilliSeconds = this.curFetch - this.lastFetch; | ||
| 29 | double delta = this.curValue - this.lastValue; | ||
| 30 | double perMilli = delta/numMilliSeconds; | ||
| 31 | return perMilli * 1000; | ||
| 32 | } else { | ||
| 33 | return 0; | ||
| 34 | } | ||
| 35 | } | ||
| 36 | public double getCurrentValue() { | ||
| 37 | if(this.curValue != null) return this.curValue; | ||
| 38 | else return 0; | ||
| 39 | } | ||
| 40 | public double getSeconds() { | ||
| 41 | if(this.lastFetch != null && this.curFetch != null) { | ||
| 42 | double numSeconds = this.curFetch - this.lastFetch; | ||
| 43 | return numSeconds/1000; | ||
| 44 | } | ||
| 45 | return 0; | ||
| 46 | } | ||
| 47 | public long getMilliSeconds() { | ||
| 48 | if(this.lastFetch != null && this.curFetch != null) { | ||
| 49 | return this.curFetch - this.lastFetch; | ||
| 50 | } | ||
| 51 | return 0; | ||
| 52 | } | ||
| 53 | } |
LILJM/se/lil/jm/JmxMon.java
0 → 100644
| 1 | package se.lil.jm; | ||
| 2 | |||
| 3 | import java.io.IOException; | ||
| 4 | import java.net.MalformedURLException; | ||
| 5 | import java.util.concurrent.locks.Lock; | ||
| 6 | import java.util.concurrent.locks.ReentrantLock; | ||
| 7 | |||
| 8 | import javax.management.JMX; | ||
| 9 | import javax.management.MBeanServerConnection; | ||
| 10 | import javax.management.ObjectName; | ||
| 11 | import javax.management.remote.JMXConnector; | ||
| 12 | import javax.management.remote.JMXConnectorFactory; | ||
| 13 | import javax.management.remote.JMXServiceURL; | ||
| 14 | import javax.management.openmbean.CompositeData; | ||
| 15 | |||
| 16 | public class JmxMon { | ||
| 17 | String conUser = "system"; | ||
| 18 | String conPass = "passw0rd"; | ||
| 19 | String domain = null; | ||
| 20 | |||
| 21 | JMXServiceURL url = null; | ||
| 22 | JMXConnector jmxc = null; | ||
| 23 | MBeanServerConnection mbsc = null; | ||
| 24 | |||
| 25 | Collector col = new Collector(); | ||
| 26 | |||
| 27 | int getDataCalls = 0; | ||
| 28 | int getDataSucess = 0; | ||
| 29 | |||
| 30 | public int getDataCalled() { | ||
| 31 | return getDataCalls; | ||
| 32 | } | ||
| 33 | |||
| 34 | public int getDataSucceeded() { | ||
| 35 | return getDataSucess; | ||
| 36 | } | ||
| 37 | |||
| 38 | public int getDataFailed() { | ||
| 39 | return getDataCalls - getDataSucess; | ||
| 40 | } | ||
| 41 | |||
| 42 | public String getConString() { | ||
| 43 | if(this.url != null) return this.url.toString(); | ||
| 44 | else return null; | ||
| 45 | } | ||
| 46 | |||
| 47 | public void open() throws IOException { | ||
| 48 | if(url != null) { | ||
| 49 | jmxc = JMXConnectorFactory.connect(url); | ||
| 50 | mbsc = jmxc.getMBeanServerConnection(); | ||
| 51 | domain = mbsc.getDefaultDomain(); | ||
| 52 | } | ||
| 53 | } | ||
| 54 | |||
| 55 | public void open(String serviceURL) throws IOException, MalformedURLException { | ||
| 56 | url = new JMXServiceURL(serviceURL); | ||
| 57 | open(); | ||
| 58 | } | ||
| 59 | |||
| 60 | public void close() throws IOException { | ||
| 61 | if(jmxc != null) jmxc.close(); | ||
| 62 | jmxc = null; | ||
| 63 | mbsc = null; | ||
| 64 | } | ||
| 65 | |||
| 66 | long lastRTns = 0; | ||
| 67 | public long getLastRTms() { | ||
| 68 | return lastRTns / (1000 * 1000); | ||
| 69 | } | ||
| 70 | |||
| 71 | long lastFetchTSns = 0; | ||
| 72 | public boolean getData(long ageTs) throws Throwable { | ||
| 73 | if (getAgeTs() > ageTs ) return getData(); | ||
| 74 | else return false; | ||
| 75 | } | ||
| 76 | |||
| 77 | public long getAgeTs() { | ||
| 78 | if(lastFetchTSns > 0) return (System.nanoTime() - lastFetchTSns)/(1000*1000*1000); | ||
| 79 | else return 0; | ||
| 80 | } | ||
| 81 | |||
| 82 | Lock lock = new ReentrantLock(); | ||
| 83 | |||
| 84 | public boolean getData() throws Throwable { | ||
| 85 | // Start thread safe | ||
| 86 | // Try to get a lock | ||
| 87 | boolean haveLock = lock.tryLock(); | ||
| 88 | if( haveLock == false) { | ||
| 89 | // We could not get the lock, someone else is updating. Wait for it to complete by waiting for a lock, then unlock and return. | ||
| 90 | try { | ||
| 91 | lock.lock(); | ||
| 92 | } finally { | ||
| 93 | lock.unlock(); | ||
| 94 | } | ||
| 95 | return false; | ||
| 96 | } | ||
| 97 | // We do have the lock. Do the rest in a try catch everything and if we catch anything, re throw the catch but always release the lock. | ||
| 98 | try { | ||
| 99 | long startTSns = System.nanoTime(); | ||
| 100 | getDataCalls++; | ||
| 101 | // Do the update of data | ||
| 102 | Object mb; | ||
| 103 | mb = mbsc.getAttribute(new ObjectName("java.lang:type=OperatingSystem"), "ProcessCpuTime"); | ||
| 104 | System.out.println("Class: " + mb.getClass()); | ||
| 105 | System.out.println("toString: " + mb.toString()); | ||
| 106 | mb = mbsc.getAttribute(new ObjectName("java.lang:type=OperatingSystem"), "AvailableProcessors"); | ||
| 107 | System.out.println("Class: " + mb.getClass()); | ||
| 108 | System.out.println("toString: " + mb.toString()); | ||
| 109 | mb = mbsc.getAttribute(new ObjectName("java.lang:type=OperatingSystem"), "OpenFileDescriptorCount"); | ||
| 110 | System.out.println("Class: " + mb.getClass()); | ||
| 111 | System.out.println("toString: " + mb.toString()); | ||
| 112 | mb = mbsc.getAttribute(new ObjectName("java.lang:type=Runtime"), "Uptime"); | ||
| 113 | System.out.println("Class: " + mb.getClass()); | ||
| 114 | System.out.println("toString: " + mb.toString()); | ||
| 115 | // Finished updating data | ||
| 116 | getDataSucess++; | ||
| 117 | lastFetchTSns = System.nanoTime(); | ||
| 118 | lastRTns = lastFetchTSns - startTSns; | ||
| 119 | return true; | ||
| 120 | } catch (Throwable e) { | ||
| 121 | throw (e); | ||
| 122 | } finally { | ||
| 123 | lock.unlock(); | ||
| 124 | } | ||
| 125 | // End thread safe | ||
| 126 | } | ||
| 127 | |||
| 128 | //NUM_CPUS | ||
| 129 | int numCpus = 0; | ||
| 130 | public long getNumberOfCPUs() { | ||
| 131 | return numCpus; | ||
| 132 | } | ||
| 133 | |||
| 134 | public JmxMon() { | ||
| 135 | } | ||
| 136 | |||
| 137 | public JmxMon(String serviceURL) throws MalformedURLException { | ||
| 138 | this.url = new JMXServiceURL(serviceURL); | ||
| 139 | } | ||
| 140 | } |
LILJM/se/lil/jm/LongDelta.java
0 → 100644
| 1 | package se.lil.jm; | ||
| 2 | |||
| 3 | class LongDelta { | ||
| 4 | public String name = null; | ||
| 5 | public Long curValue = null; | ||
| 6 | public Long lastValue = null; | ||
| 7 | public Long lastFetch = null; | ||
| 8 | public Long curFetch = null; | ||
| 9 | |||
| 10 | public LongDelta() { | ||
| 11 | } | ||
| 12 | |||
| 13 | public LongDelta(Long timestamp, Long value) { | ||
| 14 | this.curFetch = timestamp; | ||
| 15 | this.curValue = value; | ||
| 16 | } | ||
| 17 | |||
| 18 | public void update(Long timestamp, Long value) { | ||
| 19 | this.lastFetch = this.curFetch; | ||
| 20 | this.curFetch = timestamp; | ||
| 21 | this.lastValue = this.curValue; | ||
| 22 | this.curValue = value; | ||
| 23 | } | ||
| 24 | public double getPerSecondValue() { | ||
| 25 | if(this.curValue != null && this.lastValue != null && this.lastFetch != null && this.curFetch != null) { | ||
| 26 | // We have values, calculate the number of gets per second | ||
| 27 | double numMilliSeconds = this.curFetch - this.lastFetch; | ||
| 28 | double delta = this.curValue - this.lastValue; | ||
| 29 | double perMilli = delta/numMilliSeconds; | ||
| 30 | return perMilli * 1000; | ||
| 31 | } else { | ||
| 32 | return 0; | ||
| 33 | } | ||
| 34 | } | ||
| 35 | public long getCurrentValue() { | ||
| 36 | if(this.curValue != null) return this.curValue; | ||
| 37 | else return 0; | ||
| 38 | } | ||
| 39 | public double getSeconds() { | ||
| 40 | if(this.lastFetch != null && this.curFetch != null) { | ||
| 41 | double numSeconds = this.curFetch - this.lastFetch; | ||
| 42 | return numSeconds/1000; | ||
| 43 | } | ||
| 44 | return 0; | ||
| 45 | } | ||
| 46 | public long getMilliSeconds() { | ||
| 47 | if(this.lastFetch != null && this.curFetch != null) { | ||
| 48 | return this.curFetch - this.lastFetch; | ||
| 49 | } | ||
| 50 | return 0; | ||
| 51 | } | ||
| 52 | } | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
LILJM/se/lil/jm/Registry.java
0 → 100644
| 1 | package se.lil.jm; | ||
| 2 | |||
| 3 | import java.net.MalformedURLException; | ||
| 4 | import java.util.ArrayList; | ||
| 5 | |||
| 6 | public class Registry { | ||
| 7 | private static ArrayList<JmxMon> jmxList = null; | ||
| 8 | public static boolean test = true; | ||
| 9 | |||
| 10 | public static synchronized ArrayList<JmxMon> getList() { | ||
| 11 | if (jmxList == null) { | ||
| 12 | jmxList = new ArrayList<JmxMon>(); | ||
| 13 | } | ||
| 14 | return jmxList; | ||
| 15 | } | ||
| 16 | |||
| 17 | public static synchronized JmxMon findOrCreate(String conStr) throws MalformedURLException { | ||
| 18 | for (JmxMon item : getList()) { | ||
| 19 | if(item.getConString().equals(conStr)) { | ||
| 20 | return item; | ||
| 21 | } | ||
| 22 | } | ||
| 23 | // Not found, create it | ||
| 24 | JmxMon monitor = new JmxMon(conStr); | ||
| 25 | jmxList.add(monitor); | ||
| 26 | return monitor; | ||
| 27 | } | ||
| 28 | } |
LILJM/se/lil/jm/TestRunner.java
0 → 100644
| 1 | package se.lil.jm; | ||
| 2 | |||
| 3 | import java.util.ArrayList; | ||
| 4 | |||
| 5 | public class TestRunner { | ||
| 6 | |||
| 7 | public TestRunner() { | ||
| 8 | // TODO Auto-generated constructor stub | ||
| 9 | } | ||
| 10 | |||
| 11 | /** | ||
| 12 | * @param args | ||
| 13 | */ | ||
| 14 | public static void main(String[] args) throws Throwable{ | ||
| 15 | // TODO Auto-generated method stub | ||
| 16 | |||
| 17 | //ArrayList<OraMon> oraList = new ArrayList<OraMon>(); | ||
| 18 | ArrayList<JmxMon> jmxList = Registry.getList(); | ||
| 19 | |||
| 20 | Long ts1 = System.currentTimeMillis(); | ||
| 21 | |||
| 22 | JmxMon mon1 = new JmxMon("service:jmx:iiop:///jndi/iiop://u01892.ef.kap.rsv.se:17020/weblogic.management.mbeanservers.runtime"); | ||
| 23 | mon1.open(); | ||
| 24 | jmxList.add(mon1); | ||
| 25 | |||
| 26 | Long time = System.currentTimeMillis() - ts1; | ||
| 27 | |||
| 28 | System.out.println( | ||
| 29 | "Open called on " + mon1.getConString() | ||
| 30 | + "\nTime: " + time + "ms\n" | ||
| 31 | ); | ||
| 32 | |||
| 33 | int times = 3; | ||
| 34 | while(times-- > 0) { | ||
| 35 | for(JmxMon mon : jmxList) { | ||
| 36 | ts1 = System.currentTimeMillis(); | ||
| 37 | long age = mon1.getAgeTs(); | ||
| 38 | mon.getData(); | ||
| 39 | time = System.currentTimeMillis() - ts1; | ||
| 40 | |||
| 41 | System.out.println( | ||
| 42 | "GetData called on " + mon.domain + " (age was " + age + "s)" | ||
| 43 | + "\nTime: " + time + "ms\n\n" | ||
| 44 | ); | ||
| 45 | |||
| 46 | } | ||
| 47 | Thread.sleep(15000); | ||
| 48 | } | ||
| 49 | |||
| 50 | // Close all mon objects | ||
| 51 | for(JmxMon mon : jmxList) { | ||
| 52 | mon.close(); | ||
| 53 | System.out.println("Monitor closed. " + mon.getDataCalled() + " calls and " + mon.getDataSucceeded() + " succeeded and " + mon.getDataFailed() + " failed."); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | } |
-
Please register or sign in to post a comment