changeset 2657:209c6fbeab9c

Get actual start time of running JVMs. Reviewed-By: ebaron Review-Thread: http://icedtea.classpath.org/pipermail/thermostat/2017-May/023193.html
author Joshua Matsuoka <jmatsuok@redhat.com>
date Tue, 23 May 2017 14:10:33 -0400
parents 12b1a2662939
children 4f1f13f48d0e
files system-backend/src/main/java/com/redhat/thermostat/backend/system/internal/JvmStatDataExtractor.java system-backend/src/main/java/com/redhat/thermostat/backend/system/internal/JvmStatHostListener.java system-backend/src/test/java/com/redhat/thermostat/backend/system/internal/JvmStatHostListenerTest.java
diffstat 3 files changed, 20 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/system-backend/src/main/java/com/redhat/thermostat/backend/system/internal/JvmStatDataExtractor.java	Fri May 19 11:58:05 2017 +0200
+++ b/system-backend/src/main/java/com/redhat/thermostat/backend/system/internal/JvmStatDataExtractor.java	Tue May 23 14:10:33 2017 -0400
@@ -98,5 +98,9 @@
         return MonitoredVmUtil.jvmArgs(vm);
     }
 
+    public long getVmStartTime() throws MonitorException {
+        return (long) vm.findByName("sun.rt.vmInitDoneTime").getValue();
+    }
+
 }
 
--- a/system-backend/src/main/java/com/redhat/thermostat/backend/system/internal/JvmStatHostListener.java	Fri May 19 11:58:05 2017 +0200
+++ b/system-backend/src/main/java/com/redhat/thermostat/backend/system/internal/JvmStatHostListener.java	Tue May 23 14:10:33 2017 -0400
@@ -127,9 +127,8 @@
         if (vm != null) {
             JvmStatDataExtractor extractor = new JvmStatDataExtractor(vm);
             String vmId = UUID.randomUUID().toString();
-            long startTime = System.currentTimeMillis();
             long stopTime = Long.MIN_VALUE;
-            VmInfo info = createVmInfo(vmId, vmPid, startTime, stopTime, extractor);
+            VmInfo info = createVmInfo(vmId, vmPid, stopTime, extractor);
 
             // Check blacklist
             if (!blacklist.isBlacklisted(info.getMainClass())) {
@@ -146,14 +145,14 @@
         }
     }
 
-    VmInfo createVmInfo(String vmId, Integer vmPid, long startTime, long stopTime,
+    VmInfo createVmInfo(String vmId, Integer vmPid, long stopTime,
             JvmStatDataExtractor extractor) throws MonitorException {
         Map<String, String> properties = new HashMap<String, String>();
         Map<String, String> environment = InfoBuilderFactory.INSTANCE.createProcessEnvironmentBuilder().build(vmPid);
         // TODO actually figure out the loaded libraries.
         String[] loadedNativeLibraries = new String[0];
         ProcessUserInfo userInfo = userInfoBuilder.build(vmPid);
-        VmInfo info = new VmInfo(writerId.getWriterID(), vmId, vmPid, startTime, stopTime,
+        VmInfo info = new VmInfo(writerId.getWriterID(), vmId, vmPid, extractor.getVmStartTime(), stopTime,
                 extractor.getJavaVersion(), extractor.getJavaHome(),
                 extractor.getMainClass(), extractor.getCommandLine(),
                 extractor.getVmName(), extractor.getVmInfo(), extractor.getVmVersion(), extractor.getVmArguments(),
--- a/system-backend/src/test/java/com/redhat/thermostat/backend/system/internal/JvmStatHostListenerTest.java	Fri May 19 11:58:05 2017 +0200
+++ b/system-backend/src/test/java/com/redhat/thermostat/backend/system/internal/JvmStatHostListenerTest.java	Tue May 23 14:10:33 2017 -0400
@@ -40,6 +40,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.AdditionalMatchers.not;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
@@ -69,6 +70,7 @@
 import com.redhat.thermostat.storage.model.VmInfo;
 
 import sun.jvmstat.monitor.HostIdentifier;
+import sun.jvmstat.monitor.Monitor;
 import sun.jvmstat.monitor.MonitorException;
 import sun.jvmstat.monitor.MonitoredHost;
 import sun.jvmstat.monitor.MonitoredVm;
@@ -88,6 +90,7 @@
     private static String INFO_VMVER = "90.01";
     private static long INFO_VMUSERID = 2000;
     private static String INFO_VMUSERNAME = "User";
+    private static final long INFO_STARTTIME = Long.MIN_VALUE;
 
     private JvmStatHostListener hostListener;
     private MonitoredHost host;
@@ -116,19 +119,22 @@
         monitoredVm1 = mock(MonitoredVm.class);
         monitoredVm2 = mock(MonitoredVm.class);
         StringMonitor monitor = mock(StringMonitor.class);
+        Monitor monitor2 = mock(Monitor.class);
         VmIdentifier vmId1 = new VmIdentifier("1");
         VmIdentifier vmId2 = new VmIdentifier("2");
-        
+
+        when(monitor2.getValue()).thenReturn(100l);
         when(host.getHostIdentifier()).thenReturn(hostId);
         when(host.getMonitoredVm(eq(vmId1))).thenReturn(monitoredVm1);
         when(host.getMonitoredVm(eq(vmId2))).thenReturn(monitoredVm2);
         when(hostId.resolve(eq(vmId1))).thenReturn(vmId1);
         when(hostId.resolve(eq(vmId2))).thenReturn(vmId2);
-        when(monitoredVm1.findByName(any(String.class))).thenReturn(monitor);
-        when(monitoredVm2.findByName(any(String.class))).thenReturn(monitor);
+        when(monitoredVm1.findByName("sun.rt.vmInitDoneTime")).thenReturn(monitor2);
+        when(monitoredVm2.findByName("sun.rt.vmInitDoneTime")).thenReturn(monitor2);
+        when(monitoredVm1.findByName(not(eq("sun.rt.vmInitDoneTime")))).thenReturn(monitor);
+        when(monitoredVm2.findByName(not(eq("sun.rt.vmInitDoneTime")))).thenReturn(monitor);
         when(monitor.stringValue()).thenReturn("test");
         when(monitor.getValue()).thenReturn("test");
-        
         extractor = mock(JvmStatDataExtractor.class);
         
         when(extractor.getCommandLine()).thenReturn(INFO_CMDLINE);
@@ -139,6 +145,7 @@
         when(extractor.getVmInfo()).thenReturn(INFO_VMINFO);
         when(extractor.getVmName()).thenReturn(INFO_VMNAME);
         when(extractor.getVmVersion()).thenReturn(INFO_VMVER);
+        when(extractor.getVmStartTime()).thenReturn(INFO_STARTTIME);
     }
     
     @Test
@@ -195,10 +202,9 @@
     }
     
     @Test
-    public void testReusedPid() {
+    public void testReusedPid() throws MonitorException {
         final Set<Integer> started = new HashSet<>();
         started.add(1);
-        
         // Start VM
         VmStatusChangeEvent event = mock(VmStatusChangeEvent.class);
         when(event.getMonitoredHost()).thenReturn(host);
@@ -250,9 +256,8 @@
     public void testCreateVmInfo() throws MonitorException {
         final String INFO_ID = "vmId";
         final int INFO_PID = 1;
-        final long INFO_STARTTIME = Long.MIN_VALUE;
         final long INFO_STOPTIME = Long.MAX_VALUE;
-        VmInfo info = hostListener.createVmInfo(INFO_ID, INFO_PID, INFO_STARTTIME, INFO_STOPTIME, extractor);
+        VmInfo info = hostListener.createVmInfo(INFO_ID, INFO_PID, INFO_STOPTIME, extractor);
         
         assertEquals(INFO_PID, info.getVmPid());
         assertEquals(INFO_STARTTIME, info.getStartTimeStamp());