Första fungerande version med grundläggande counters.
Showing
4 changed files
with
142 additions
and
75 deletions
LILJM/se/lil/jm/Collector.java
deleted
100644 → 0
| 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 |
| ... | @@ -2,6 +2,7 @@ package se.lil.jm; | ... | @@ -2,6 +2,7 @@ package se.lil.jm; |
| 2 | 2 | ||
| 3 | import java.io.IOException; | 3 | import java.io.IOException; |
| 4 | import java.net.MalformedURLException; | 4 | import java.net.MalformedURLException; |
| 5 | import java.util.HashMap; | ||
| 5 | import java.util.Set; | 6 | import java.util.Set; |
| 6 | import java.util.concurrent.locks.Lock; | 7 | import java.util.concurrent.locks.Lock; |
| 7 | import java.util.concurrent.locks.ReentrantLock; | 8 | import java.util.concurrent.locks.ReentrantLock; |
| ... | @@ -32,12 +33,39 @@ public class JmxMon { | ... | @@ -32,12 +33,39 @@ public class JmxMon { |
| 32 | Thread myThread = null; | 33 | Thread myThread = null; |
| 33 | ClassLoader myCL = null; | 34 | ClassLoader myCL = null; |
| 34 | 35 | ||
| 35 | Collector col = new Collector(); | ||
| 36 | |||
| 37 | int getDataCalls = 0; | 36 | int getDataCalls = 0; |
| 38 | int getDataSucess = 0; | 37 | int getDataSucess = 0; |
| 39 | 38 | ||
| 40 | public Object getAttributeValue(String name, String attribute) { | 39 | HashMap<String, LongDelta> longDeltaMap = new HashMap<String, LongDelta>(); |
| 40 | HashMap<String, DoubleDelta> doubleDeltaMap = new HashMap<String, DoubleDelta>(); | ||
| 41 | |||
| 42 | private void updateLongDelta (Long timestamp, String name, Long value) { | ||
| 43 | LongDelta ld = longDeltaMap.get(name); | ||
| 44 | if(ld == null) { | ||
| 45 | ld = new LongDelta(); | ||
| 46 | longDeltaMap.put(name, ld); | ||
| 47 | } | ||
| 48 | ld.update(timestamp, value); | ||
| 49 | } | ||
| 50 | |||
| 51 | private LongDelta getAttributeLongDelta(String name, String attribute) { | ||
| 52 | return longDeltaMap.get(name + ":" + attribute); | ||
| 53 | } | ||
| 54 | |||
| 55 | private void updateDoubleDelta (Long timestamp, String name, Double value) { | ||
| 56 | DoubleDelta dd = doubleDeltaMap.get(name); | ||
| 57 | if(dd == null) { | ||
| 58 | dd = new DoubleDelta(); | ||
| 59 | doubleDeltaMap.put(name, dd); | ||
| 60 | } | ||
| 61 | dd.update(timestamp, value); | ||
| 62 | } | ||
| 63 | |||
| 64 | private DoubleDelta getAttributeDoubleDelta(String name, String attribute) { | ||
| 65 | return doubleDeltaMap.get(name + ":" + attribute); | ||
| 66 | } | ||
| 67 | |||
| 68 | private Object getAttributeValue(String name, String attribute) { | ||
| 41 | Object ro = null; | 69 | Object ro = null; |
| 42 | if(mbsc != null) { | 70 | if(mbsc != null) { |
| 43 | try { | 71 | try { |
| ... | @@ -49,6 +77,28 @@ public class JmxMon { | ... | @@ -49,6 +77,28 @@ public class JmxMon { |
| 49 | return ro; | 77 | return ro; |
| 50 | } | 78 | } |
| 51 | 79 | ||
| 80 | private void fetchUpdateAttribute(String name, String attribute) { | ||
| 81 | String fullName = name + ":" + attribute; | ||
| 82 | Object obj = getAttributeValue(name, attribute); | ||
| 83 | Long ts = (Long)getAttributeValue("java.lang:type=Runtime", "Uptime"); | ||
| 84 | if(obj != null) { | ||
| 85 | if(obj.getClass().equals(java.lang.Long.class)) { | ||
| 86 | updateLongDelta(ts, fullName, (Long)obj); | ||
| 87 | } | ||
| 88 | if(obj.getClass().equals(java.lang.Integer.class)) { | ||
| 89 | Integer i = (Integer)obj; | ||
| 90 | updateLongDelta(ts, fullName, i.longValue()); | ||
| 91 | } | ||
| 92 | if(obj.getClass().equals(java.lang.Double.class)) { | ||
| 93 | updateDoubleDelta(ts, fullName, (Double)obj); | ||
| 94 | } | ||
| 95 | if(obj.getClass().equals(java.lang.Float.class)) { | ||
| 96 | Float f = (Float)obj; | ||
| 97 | updateDoubleDelta(ts, fullName, f.doubleValue()); | ||
| 98 | } | ||
| 99 | } | ||
| 100 | } | ||
| 101 | |||
| 52 | public int getDataCalled() { | 102 | public int getDataCalled() { |
| 53 | return getDataCalls; | 103 | return getDataCalls; |
| 54 | } | 104 | } |
| ... | @@ -143,19 +193,17 @@ public class JmxMon { | ... | @@ -143,19 +193,17 @@ public class JmxMon { |
| 143 | long startTSns = System.nanoTime(); | 193 | long startTSns = System.nanoTime(); |
| 144 | getDataCalls++; | 194 | getDataCalls++; |
| 145 | // Do the update of data | 195 | // Do the update of data |
| 146 | Object mb; | 196 | numCpus = (Integer)getAttributeValue("java.lang:type=OperatingSystem", "AvailableProcessors"); |
| 147 | mb = mbsc.getAttribute(new ObjectName("java.lang:type=OperatingSystem"), "ProcessCpuTime"); | 197 | fetchUpdateAttribute("java.lang:type=OperatingSystem", "ProcessCpuTime"); |
| 148 | System.out.println("Class: " + mb.getClass()); | 198 | fetchUpdateAttribute("java.lang:type=OperatingSystem", "OpenFileDescriptorCount"); |
| 149 | System.out.println("toString: " + mb.toString()); | 199 | fetchUpdateAttribute("java.lang:type=OperatingSystem", "MaxFileDescriptorCount"); |
| 150 | mb = mbsc.getAttribute(new ObjectName("java.lang:type=OperatingSystem"), "AvailableProcessors"); | 200 | fetchUpdateAttribute("java.lang:type=OperatingSystem", "TotalSwapSpaceSize"); |
| 151 | System.out.println("Class: " + mb.getClass()); | 201 | fetchUpdateAttribute("java.lang:type=OperatingSystem", "FreeSwapSpaceSize"); |
| 152 | System.out.println("toString: " + mb.toString()); | 202 | fetchUpdateAttribute("java.lang:type=OperatingSystem", "FreePhysicalMemorySize"); |
| 153 | mb = mbsc.getAttribute(new ObjectName("java.lang:type=OperatingSystem"), "OpenFileDescriptorCount"); | 203 | fetchUpdateAttribute("java.lang:type=OperatingSystem", "TotalPhysicalMemorySize"); |
| 154 | System.out.println("Class: " + mb.getClass()); | 204 | fetchUpdateAttribute("java.lang:type=OperatingSystem", "SystemLoadAverage"); |
| 155 | System.out.println("toString: " + mb.toString()); | 205 | fetchUpdateAttribute("java.lang:type=Threading", "ThreadCount"); |
| 156 | mb = mbsc.getAttribute(new ObjectName("java.lang:type=Runtime"), "Uptime"); | 206 | fetchUpdateAttribute("java.lang:type=ClassLoading", "LoadedClassCount"); |
| 157 | System.out.println("Class: " + mb.getClass()); | ||
| 158 | System.out.println("toString: " + mb.toString()); | ||
| 159 | // Finished updating data | 207 | // Finished updating data |
| 160 | getDataSucess++; | 208 | getDataSucess++; |
| 161 | lastFetchTSns = System.nanoTime(); | 209 | lastFetchTSns = System.nanoTime(); |
| ... | @@ -175,6 +223,59 @@ public class JmxMon { | ... | @@ -175,6 +223,59 @@ public class JmxMon { |
| 175 | return numCpus; | 223 | return numCpus; |
| 176 | } | 224 | } |
| 177 | 225 | ||
| 226 | public long getLoadedClassCount() { | ||
| 227 | LongDelta ld = getAttributeLongDelta("java.lang:type=ClassLoading", "LoadedClassCount"); | ||
| 228 | return ld.getCurrentValue(); | ||
| 229 | } | ||
| 230 | |||
| 231 | public double getCPUPercent() { | ||
| 232 | LongDelta ld = getAttributeLongDelta("java.lang:type=OperatingSystem", "ProcessCpuTime"); | ||
| 233 | double cpuDeltaMS = (double)ld.getDelta() / (1000D*1000D); | ||
| 234 | double spentMS = ld.getMilliSeconds(); | ||
| 235 | double perCPUMS = cpuDeltaMS / (double)numCpus; | ||
| 236 | double cpuPct = (perCPUMS / spentMS) * 100D; | ||
| 237 | return cpuPct; | ||
| 238 | } | ||
| 239 | |||
| 240 | public double getAverageLoad() { | ||
| 241 | DoubleDelta dd = getAttributeDoubleDelta("java.lang:type=OperatingSystem", "SystemLoadAverage"); | ||
| 242 | return dd.getCurrentValue(); | ||
| 243 | } | ||
| 244 | |||
| 245 | public double getAverageLoadPerCpu() { | ||
| 246 | DoubleDelta dd = getAttributeDoubleDelta("java.lang:type=OperatingSystem", "SystemLoadAverage"); | ||
| 247 | return dd.getCurrentValue()/(double)numCpus; | ||
| 248 | } | ||
| 249 | |||
| 250 | public long getThreads() { | ||
| 251 | LongDelta ld = getAttributeLongDelta("java.lang:type=Threading", "ThreadCount"); | ||
| 252 | return ld.getCurrentValue(); | ||
| 253 | } | ||
| 254 | |||
| 255 | public double getSystemMemoryPercentUsed() { | ||
| 256 | LongDelta ldf = getAttributeLongDelta("java.lang:type=OperatingSystem", "FreePhysicalMemorySize"); | ||
| 257 | LongDelta ldt = getAttributeLongDelta("java.lang:type=OperatingSystem", "TotalPhysicalMemorySize"); | ||
| 258 | double free = ldf.getCurrentValue(); | ||
| 259 | double total = ldt.getCurrentValue(); | ||
| 260 | return ((total - free)/(total)) * 100D; | ||
| 261 | } | ||
| 262 | |||
| 263 | public double getSystemSwapPercentUsed() { | ||
| 264 | LongDelta ldf = getAttributeLongDelta("java.lang:type=OperatingSystem", "FreeSwapSpaceSize"); | ||
| 265 | LongDelta ldt = getAttributeLongDelta("java.lang:type=OperatingSystem", "TotalSwapSpaceSize"); | ||
| 266 | double free = ldf.getCurrentValue(); | ||
| 267 | double total = ldt.getCurrentValue(); | ||
| 268 | return ((total - free)/(total)) * 100D; | ||
| 269 | } | ||
| 270 | |||
| 271 | public double getSystemFileDescriptorsPercentUsed() { | ||
| 272 | LongDelta ldo = getAttributeLongDelta("java.lang:type=OperatingSystem", "OpenFileDescriptorCount"); | ||
| 273 | LongDelta ldm = getAttributeLongDelta("java.lang:type=OperatingSystem", "MaxFileDescriptorCount"); | ||
| 274 | double open = ldo.getCurrentValue(); | ||
| 275 | double max = ldm.getCurrentValue(); | ||
| 276 | return (open/max) * 100D; | ||
| 277 | } | ||
| 278 | |||
| 178 | public JmxMon() { | 279 | public JmxMon() { |
| 179 | } | 280 | } |
| 180 | 281 | ... | ... |
| ... | @@ -32,6 +32,13 @@ class LongDelta { | ... | @@ -32,6 +32,13 @@ class LongDelta { |
| 32 | return 0; | 32 | return 0; |
| 33 | } | 33 | } |
| 34 | } | 34 | } |
| 35 | public long getDelta() { | ||
| 36 | if(lastValue != null && curValue != null) { | ||
| 37 | return curValue - lastValue; | ||
| 38 | } else { | ||
| 39 | return 0; | ||
| 40 | } | ||
| 41 | } | ||
| 35 | public long getCurrentValue() { | 42 | public long getCurrentValue() { |
| 36 | if(this.curValue != null) return this.curValue; | 43 | if(this.curValue != null) return this.curValue; |
| 37 | else return 0; | 44 | else return 0; | ... | ... |
| ... | @@ -19,31 +19,38 @@ public class TestRunner { | ... | @@ -19,31 +19,38 @@ public class TestRunner { |
| 19 | 19 | ||
| 20 | Long ts1 = System.currentTimeMillis(); | 20 | Long ts1 = System.currentTimeMillis(); |
| 21 | 21 | ||
| 22 | JmxMon mon1 = new JmxMon("service:jmx:rmi:///jndi/iiop://u30128:23032/weblogic.management.mbeanservers.runtime"); // 10.3.6.0.161018.2 | 22 | JmxMon mon1 = new JmxMon("service:jmx:iiop:///jndi/iiop://u30457:29722/weblogic.management.mbeanservers.runtime"); // 10.3.6.0.161018.2 |
| 23 | //JmxMon mon1 = new JmxMon("service:jmx:rmi:///jndi/iiop://u30009:26732/weblogic.management.mbeanservers.runtime"); // 10.3.6.0.12.1 | 23 | //JmxMon mon1 = new JmxMon("service:jmx:rmi:///jndi/iiop://u30128:23032/weblogic.management.mbeanservers.runtime"); // 10.3.6.0.161018.2 |
| 24 | //JmxMon mon2 = new JmxMon("service:jmx:rmi:///jndi/iiop://u30009:26732/weblogic.management.mbeanservers.runtime"); // 10.3.6.0.12.1 | ||
| 24 | mon1.open(); | 25 | mon1.open(); |
| 26 | //mon2.open(); | ||
| 25 | jmxList.add(mon1); | 27 | jmxList.add(mon1); |
| 28 | //jmxList.add(mon2); | ||
| 26 | 29 | ||
| 27 | Long time = System.currentTimeMillis() - ts1; | 30 | Long time = System.currentTimeMillis() - ts1; |
| 28 | 31 | ||
| 29 | System.out.println( | 32 | System.out.println( |
| 30 | "Open called on " + mon1.getConString() | 33 | "Open called on all jmx monitors" |
| 31 | + "\nTime: " + time + "ms\n" | 34 | + "\nTime: " + time + "ms\n" |
| 32 | ); | 35 | ); |
| 33 | 36 | ||
| 34 | System.out.println("Connected to server " + mon1.getServerName() + " on domain " + mon1.getDomainName() + " and machine " + mon1.getRuntimeName()); | 37 | int times = 10; |
| 35 | |||
| 36 | //mon1.listAllMBeans(); | ||
| 37 | //mon1.dumpAllMBeans("java.lang:*"); | ||
| 38 | /* | ||
| 39 | int times = 0; | ||
| 40 | while(times-- > 0) { | 38 | while(times-- > 0) { |
| 41 | for(JmxMon mon : jmxList) { | 39 | for(JmxMon mon : jmxList) { |
| 42 | ts1 = System.currentTimeMillis(); | 40 | ts1 = System.currentTimeMillis(); |
| 43 | long age = mon1.getAgeTs(); | ||
| 44 | mon.getData(); | 41 | mon.getData(); |
| 45 | time = System.currentTimeMillis() - ts1; | 42 | time = System.currentTimeMillis() - ts1; |
| 43 | System.out.println(mon.getServerName() + " called in " + time + "ms"); | ||
| 44 | System.out.println(mon.getServerName() + " Process CPU %: " + mon.getCPUPercent()); | ||
| 45 | System.out.println(mon.getServerName() + " Process Threads #: " + mon.getThreads()); | ||
| 46 | System.out.println(mon.getServerName() + " Process Loaded Classes #: " + mon.getLoadedClassCount()); | ||
| 47 | System.out.println(mon.getServerName() + " Process File Descriptors %: " + mon.getSystemFileDescriptorsPercentUsed()); | ||
| 48 | System.out.println(mon.getServerName() + " System Load (per cpu): " + mon.getAverageLoadPerCpu()); | ||
| 49 | System.out.println(mon.getServerName() + " System Load (total): " + mon.getAverageLoad()); | ||
| 50 | System.out.println(mon.getServerName() + " System Memory %: " + mon.getSystemMemoryPercentUsed()); | ||
| 51 | System.out.println(mon.getServerName() + " System Swap %: " + mon.getSystemSwapPercentUsed()); | ||
| 46 | 52 | ||
| 53 | System.out.println(); | ||
| 47 | } | 54 | } |
| 48 | Thread.sleep(15000); | 55 | Thread.sleep(15000); |
| 49 | } | 56 | } |
| ... | @@ -53,6 +60,6 @@ public class TestRunner { | ... | @@ -53,6 +60,6 @@ public class TestRunner { |
| 53 | mon.close(); | 60 | mon.close(); |
| 54 | System.out.println("Monitor closed. " + mon.getDataCalled() + " calls and " + mon.getDataSucceeded() + " succeeded and " + mon.getDataFailed() + " failed."); | 61 | System.out.println("Monitor closed. " + mon.getDataCalled() + " calls and " + mon.getDataSucceeded() + " succeeded and " + mon.getDataFailed() + " failed."); |
| 55 | } | 62 | } |
| 56 | */ | 63 | |
| 57 | } | 64 | } |
| 58 | } | 65 | } | ... | ... |
-
Please register or sign in to post a comment