changeset 242:2d2b8cfc8091

Query for denser sample sets when updating jvm-io data Reviewed-by: jkang Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2017-October/025283.html
author Andrew Azores <aazores@redhat.com>
date Wed, 11 Oct 2017 13:55:03 -0400
parents 522b92fe4541
children e73fafd4a1a6
files mock-api/endpoints/jvm-io.endpoint.js src/app/components/jvm-info/jvm-io/jvm-io.controller.js src/app/components/jvm-info/jvm-io/jvm-io.controller.spec.js src/app/components/jvm-info/jvm-io/jvm-io.service.js src/app/components/jvm-info/jvm-io/jvm-io.service.spec.js
diffstat 5 files changed, 50 insertions(+), 70 deletions(-) [+]
line wrap: on
line diff
--- a/mock-api/endpoints/jvm-io.endpoint.js	Tue Oct 10 16:11:57 2017 -0400
+++ b/mock-api/endpoints/jvm-io.endpoint.js	Wed Oct 11 13:55:03 2017 -0400
@@ -5,21 +5,18 @@
   server.app.get('/jvm-io/0.0.1/jvms/:jvmId', function (req, res) {
     server.logRequest('jvm-io', req);
 
+    var jvmId = req.params.jvmId;
     var limit = req.query.limit;
-    var jvmId = req.params.jvmId;
+    var query = req.query.query;
 
-    var count;
-    if (limit == 0) {
-      count = 60;
-    } else if (limit == 1) {
-      count = 0;
-    } else {
-      count = 0;
-    }
+    var since = query.split('timeStamp>=')[1];
+    var now = Date.now();
+    var elapsed = now - since;
+    var count = _.floor(elapsed / 2000);
 
     var response = [];
     for (var i = count; i >= 0; i--) {
-      let date = Date.now() - (i * 10000);
+      let date = now - (i * 2000);
       let data = {
         agentId: 'foo-agentId',
         jvmId: jvmId,
@@ -31,7 +28,6 @@
       };
       response.push(data);
     }
-    console.log(response);
 
     res.setHeader('Content-Type', 'application/json');
     res.send(JSON.stringify(
--- a/src/app/components/jvm-info/jvm-io/jvm-io.controller.js	Tue Oct 10 16:11:57 2017 -0400
+++ b/src/app/components/jvm-info/jvm-io/jvm-io.controller.js	Wed Oct 11 13:55:03 2017 -0400
@@ -43,11 +43,12 @@
     this._refreshRate = 10000;
     this._dataAgeLimit = 600000;
 
+    this._lastUpdate = this._getCurrentTimestamp();
+
     this._makeChartConfig();
   }
 
   $onInit() {
-    this._loadHistoricalData();
     this._start();
   }
 
@@ -150,11 +151,13 @@
 
   _start () {
     this._stop();
+    this._loadHistoricalData();
     this._refresh = this._interval(() => this._update(), this._refreshRate);
   }
 
   _stop () {
     if (angular.isDefined(this._refresh)) {
+      this._clearData();
       this._interval.cancel(this._refresh);
       delete this._refresh;
     }
@@ -166,21 +169,31 @@
   }
 
   _trimData () {
-    let now = Date.now();
+    let now = this._getCurrentTimestamp();
     let limit = now - this._dataAgeLimit;
-    while (this.config.data.rows.length > 1 && this.config.data.rows[1][0] < limit) {
-      this.config.data.rows.splice(1, 1);
+    let spliceCount = 1;
+    for (; spliceCount < this.config.data.rows.length; spliceCount++) {
+      let sample = this.config.data.rows[spliceCount];
+      let sampleAge = sample[0];
+      if (sampleAge >= limit) {
+        break;
+      }
     }
+    this.config.data.rows.splice(1, spliceCount - 1);
   }
 
   _loadHistoricalData () {
-    this._svc.getHistoricalData(this.jvmId, Date.now() - this._dataAgeLimit).then(updates =>
-      updates.forEach(update => this._processUpdateRow(update)));
+    this._svc.getJvmIoData(this.jvmId, this._getCurrentTimestamp() - this._dataAgeLimit).then(updates => {
+      this._clearData();
+      this._lastUpdate = this._getCurrentTimestamp();
+      updates.forEach(update => this._processUpdateRow(update));
+    });
   }
 
   _update () {
-    this._svc.getJvmIoData(this.jvmId).then(update => {
-      this._processUpdateRow(update);
+    this._svc.getJvmIoData(this.jvmId, this._lastUpdate).then(updates => {
+      this._lastUpdate = this._getCurrentTimestamp();
+      updates.forEach(update => this._processUpdateRow(update));
       this._trimData();
     });
   }
@@ -194,6 +207,10 @@
       this._metricToNumber(update.writeSyscalls),
     ]);
   }
+
+  _getCurrentTimestamp () {
+    return Date.now();
+  }
 }
 
 export default angular
--- a/src/app/components/jvm-info/jvm-io/jvm-io.controller.spec.js	Tue Oct 10 16:11:57 2017 -0400
+++ b/src/app/components/jvm-info/jvm-io/jvm-io.controller.spec.js	Wed Oct 11 13:55:03 2017 -0400
@@ -40,9 +40,6 @@
         getJvmIoData: sinon.stub().returns({
           then: svcPromise
         }),
-        getHistoricalData: sinon.stub().returns({
-          then: svcPromise
-        }),
         promise: svcPromise
       };
       interval = sinon.stub().returns('intervalMock');
@@ -116,7 +113,7 @@
     });
 
     it('should load historical data', () => {
-      svc.getHistoricalData.should.be.calledOnce();
+      svc.getJvmIoData.should.be.calledOnce();
     });
 
     it('should start periodic live updates', () => {
@@ -218,9 +215,9 @@
       interval.should.be.calledWith(sinon.match.func, 10000);
 
       let func = interval.args[0][0];
-      svc.getJvmIoData.should.not.be.called();
+      svc.getJvmIoData.should.be.calledOnce();
       func();
-      svc.getJvmIoData.should.be.calledOnce();
+      svc.getJvmIoData.should.be.calledTwice();
     });
   });
 
@@ -271,13 +268,15 @@
       svc.promise.should.be.calledWith(sinon.match.func);
       let stamp = Date.now();
       svc.promise.args[0][0](
-        {
-          timeStamp: { $numberLong: stamp.toString() },
-          charactersRead: { $numberLong: '1000000' },
-          charactersWritten: { $numberLong: '500000' },
-          readSyscalls: { $numberLong: '100' },
-          writeSyscalls: { $numberLong: '50' }
-        }
+        [
+          {
+            timeStamp: { $numberLong: stamp.toString() },
+            charactersRead: { $numberLong: '1000000' },
+            charactersWritten: { $numberLong: '500000' },
+            readSyscalls: { $numberLong: '100' },
+            writeSyscalls: { $numberLong: '50' }
+          }
+        ]
       );
       ctrl.config.data.rows.should.deepEqual([
         ['date', 'characters read', 'characters written', 'read sys calls', 'write sys calls'],
--- a/src/app/components/jvm-info/jvm-io/jvm-io.service.js	Tue Oct 10 16:11:57 2017 -0400
+++ b/src/app/components/jvm-info/jvm-io/jvm-io.service.js	Wed Oct 11 13:55:03 2017 -0400
@@ -35,24 +35,15 @@
     this._gatewayUrl = gatewayUrl;
   }
 
-  getHistoricalData (jvmId, since) {
+  getJvmIoData (jvmId, since) {
     let params = {
-      sort: '-timeStamp',
+      sort: '+timeStamp',
       limit: 0,
       query: `timeStamp>=${since}`
     };
     return this._http.get(urlJoin(this._gatewayUrl, 'jvm-io', '0.0.1', 'jvms', jvmId), { params: params })
       .then(res => res.data.response);
   }
-
-  getJvmIoData (jvmId) {
-    let params = {
-      sort: '-timeStamp',
-      limit: 1
-    };
-    return this._http.get(urlJoin(this._gatewayUrl, 'jvm-io', '0.0.1', 'jvms', jvmId), { params: params })
-      .then(res => res.data.response[0]);
-  }
 }
 
 export default angular
--- a/src/app/components/jvm-info/jvm-io/jvm-io.service.spec.js	Tue Oct 10 16:11:57 2017 -0400
+++ b/src/app/components/jvm-info/jvm-io/jvm-io.service.spec.js	Wed Oct 11 13:55:03 2017 -0400
@@ -54,30 +54,7 @@
     should.exist(svc);
   });
 
-  describe('getJvmIodata (jvmId)', () => {
-    it('should resolve mock data', done => {
-      let expected = {
-        response: [{
-          timeStamp: { $numberLong: Date.now().toString() },
-          charactersRead: { $numberLong: '100000' },
-          charactersWritten: { $numberLong: '50000' },
-          readSysCalls: { $numberLong: '100' },
-          writeSysCalls: { $numberLong: '50' }
-        }]
-      };
-      httpBackend.when('GET', 'http://example.com:1234/jvm-io/0.0.1/jvms/foo-jvmId?limit=1&sort=-timeStamp')
-        .respond(expected);
-      svc.getJvmIoData('foo-jvmId').then(res => {
-        res.should.deepEqual(expected.response[0]);
-        done();
-      });
-      httpBackend.expectGET('http://example.com:1234/jvm-io/0.0.1/jvms/foo-jvmId?limit=1&sort=-timeStamp');
-      httpBackend.flush();
-      scope.$apply();
-    });
-  });
-
-  describe('getHistoricalData (jvmId, since)', () => {
+  describe('getJvmIoData (jvmId, since)', () => {
     it('should resolve mock data', done => {
       let expected = {
         response: [
@@ -97,13 +74,13 @@
           },
         ]
       };
-      httpBackend.when('GET', 'http://example.com:1234/jvm-io/0.0.1/jvms/foo-jvmId?limit=0&query=timeStamp%3E%3D150000&sort=-timeStamp')
+      httpBackend.when('GET', 'http://example.com:1234/jvm-io/0.0.1/jvms/foo-jvmId?limit=0&query=timeStamp%3E%3D150000&sort=%2BtimeStamp')
         .respond(expected);
-      svc.getHistoricalData('foo-jvmId', 150000).then(res => {
+      svc.getJvmIoData('foo-jvmId', 150000).then(res => {
         res.should.deepEqual(expected.response);
         done();
       });
-      httpBackend.expectGET('http://example.com:1234/jvm-io/0.0.1/jvms/foo-jvmId?limit=0&query=timeStamp%3E%3D150000&sort=-timeStamp');
+      httpBackend.expectGET('http://example.com:1234/jvm-io/0.0.1/jvms/foo-jvmId?limit=0&query=timeStamp%3E%3D150000&sort=%2BtimeStamp');
       httpBackend.flush();
       scope.$apply();
     });