[Kimchi-devel] [PATCH] Display historical host statistical info on the host tab

Adam King rak at linux.vnet.ibm.com
Thu Apr 24 14:12:41 UTC 2014


On 04/23/2014 10:49 PM, Hongliang Wang wrote:
>
> On 04/24/2014 08:04 AM, Adam King wrote:
>> Update the host tab statistics graphs to make use of the newly 
>> available historical data.
>> Removed option to continue collecting data while the host tab is out 
>> of view, as the server
>> always has the historcal data available.
>>
>> Signed-off-by: Adam King <rak at linux.vnet.ibm.com>
>> ---
>>   ui/js/src/kimchi.api.js      |  18 ++++++-
>>   ui/js/src/kimchi.host.js     | 124 
>> ++++++++++++++++++++++++++-----------------
>>   ui/pages/tabs/host.html.tmpl |   8 ---
>>   3 files changed, 92 insertions(+), 58 deletions(-)
>>
>> diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js
>> index e96a67a..4bcf072 100644
>> --- a/ui/js/src/kimchi.api.js
>> +++ b/ui/js/src/kimchi.api.js
>> @@ -78,7 +78,7 @@ var kimchi = {
>>       },
>>
>>       /**
>> -     * Get the dynamic host stats (usually used for monitoring).
>> +     * Get the dynamic host stats (usually used for monitoring.
> The right parenthesis is lost.
Addressed in v2
>>        */
>>       getHostStats : function(suc, err) {
>>           kimchi.requestJSON({
>> @@ -94,6 +94,22 @@ var kimchi = {
>>       },
>>
>>       /**
>> +     * Get the historic host stats.
>> +     */
>> +    getHostStatsHistory : function(suc, err) {
>> +        kimchi.requestJSON({
>> +            url : kimchi.url + 'host/stats/history',
>> +            type : 'GET',
>> +            resend: true,
>> +            contentType : 'application/json',
>> +            headers: {'Kimchi-Robot': 'kimchi-robot'},
>> +            dataType : 'json',
>> +            success : suc,
>> +            error: err
>> +        });
>> +    },
>> +
>> +    /**
>>        *
>>        * Create a new Virtual Machine. Usage: kimchi.createVM({ name: 
>> 'MyUbuntu',
>>        * template: '/templates/ubuntu_base' }, creationSuc, 
>> creationErr);
>> diff --git a/ui/js/src/kimchi.host.js b/ui/js/src/kimchi.host.js
>> index 966ee54..1835bfd 100644
>> --- a/ui/js/src/kimchi.host.js
>> +++ b/ui/js/src/kimchi.host.js
>> @@ -448,12 +448,6 @@ kimchi.host_main = function() {
>>               });
>>           });
>>
>> -        var keepMonitoringCheckbox = $('#keep-monitoring-checkbox');
>> -        keepMonitoringCheckbox.prop('checked', 
>> kimchi.keepMonitoringHost === true);
>> -        keepMonitoringCheckbox.on('change', function(event) {
>> -            kimchi.keepMonitoringHost = this['checked'];
>> -        });
>> -
>>           kimchi.getCapabilities(function(capabilities) {
>>               kimchi.host.capabilities=capabilities;
>>               if((capabilities['repo_mngt_tool']) && 
>> (capabilities['repo_mngt_tool']!="None")) {
>> @@ -566,9 +560,17 @@ kimchi.host_main = function() {
>>                       var max = item[metrics]['max'];
>>                       var unifiedMetrics = statsArray[key][metrics];
>>                       var ps = unifiedMetrics['points'];
>> -                    ps.push(value);
>> -                    ps.length > SIZE + 1 &&
>> -                        ps.shift();
>> +                    if(!Array.isArray(value)){
>> +                        ps.push(value);
>> +                        if(ps.length > SIZE + 1) {
>> +                            ps.shift();
>> +                        }
>> +                    }
>> +                    else{
>> +                        ps=ps.concat(value);
>> +                        ps.splice(0, ps.length-SIZE);
> We need (SIZE + 1) points here, so it should be:
> ps.splice(0, ps.length - SIZE - 1);
Addressed in v2
>> + unifiedMetrics['points']=ps;
>> +                    }
>>                       if(max !== undefined) {
>>                           unifiedMetrics['max'] = max;
>>                       }
>> @@ -645,47 +647,76 @@ kimchi.host_main = function() {
>>         };
>>
>>         var self = this;
>> -      var track = function() {
>> -          kimchi.getHostStats(function(stats) {
>> -              var unifiedStats = {
>> -                  cpu: {
>> -                      u: {
>> -                          v: stats['cpu_utilization']
>> -                      }
>> -                  },
>> -                  memory: {
>> -                      u: {
>> -                          v: stats['memory']['avail'],
>> -                          max: stats['memory']['total']
>> -                      }
>> +
>> +      var UnifyStats = function(stats) {
>> +          var result= {
>> +              cpu: {
>> +                  u: {
>> +                      v: stats['cpu_utilization']
>> +                  }
>> +              },
>> +              memory: {
>> +                  u: {
>> +                  }
>> +              },
>> +              diskIO: {
>> +                  r: {
>> +                      v: stats['disk_read_rate']
>>                     },
>> -                  diskIO: {
>> -                      r: {
>> -                          v: stats['disk_read_rate']
>> -                      },
>> -                      w: {
>> -                          v: stats['disk_write_rate']
>> -                      }
>> +                  w: {
>> +                      v: stats['disk_write_rate']
>> +                  }
>> +              },
>> +              networkIO: {
>> +                  r: {
>> +                      v: stats['net_recv_rate']
>>                     },
>> -                  networkIO: {
>> -                      r: {
>> -                          v: stats['net_recv_rate']
>> -                      },
>> -                      s: {
>> -                          v: stats['net_sent_rate']
>> -                      }
>> +                  s: {
>> +                      v: stats['net_sent_rate']
>>                     }
>> -              };
>> +              }
>> +          };
>
>> + if(Array.isArray(stats['memory'])){
>> +              result.memory.u['v']=[];
>> +              result.memory.u['max']=-Infinity;
>> +              for(var i=0;i<stats['memory'].length;i++){
>> + result.memory.u['v'].push(stats['memory'][i]['avail']);
>> + 
>> result.memory.u['max']=Math.max(result.memory.u['max'],stats['memory'][i]['total']);
>> +              }
>> +
>> +          }
> What's the case of multiple memory status? Is it for physical and 
> logical memories?
When historical data is gotten, the response includes multiple values 
representing the stats over time.
>> +          else {
>> +              result.memory.u['v']=stats['memory']['avail'],
>> +              result.memory.u['max']=stats['memory']['total']
>> +          }
>> +          return(result);
>> +      };
>> +
>> +
>
>> +      var statsCallback = function(stats) {
>> +              var unifiedStats = UnifyStats(stats);
>>                 statsPool.add(unifiedStats);
>>                 for(var key in charts) {
>>                     var chart = charts[key];
>>                     chart.updateUI(statsPool.get(key));
>>                 }
>>                 timer = setTimeout(function() {
>> -                  track();
>> +                  continueTrack();
>>                 }, 1000);
>> -          }, function() {
>> -          });
>> +          };
>> +
>> +      var track = function() {
>> +          kimchi.getHostStatsHistory(statsCallback,
>> +            function() {
>> +                continueTrack();
>> +            });
>> +      };
>> +
>> +      var continueTrack = function() {
>> +          kimchi.getHostStats(statsCallback,
>> +            function() {
>> +                continueTrack();
>> +            });
>>         };
>>
>>         var destroy = function() {
>> @@ -702,11 +733,8 @@ kimchi.host_main = function() {
>>
>>       var initTracker = function() {
>>           // TODO: Extend tabs with onUnload event to unregister timers.
>> -        if(!kimchi.keepMonitoringHost && kimchi.hostTimer) {
>> -            var timer = kimchi.hostTimer;
>> -            timer.stop();
>> -            timer = null;
>> -            kimchi.hostTimer = null;
>> +        if(kimchi.hostTimer) {
>> +            kimchi.hostTimer.stop();
>>               delete kimchi.hostTimer;
>>           }
>>
>> @@ -743,12 +771,10 @@ kimchi.host_main = function() {
>>       };
>>
>>       $('#host-root-container').on('remove', function() {
>> -        if(!kimchi.keepMonitoringHost && kimchi.hostTimer) {
>> +        if(kimchi.hostTimer) {
>>               kimchi.hostTimer.stop();
>> -            kimchi.hostTimer = null;
>> -            kimchi.hostTimer = null;
>>               delete kimchi.hostTimer;
>> -        }
>> +            }
>>
>>           repositoriesGrid && repositoriesGrid.destroy();
>>           kimchi.topic('kimchi/repositoryAdded')
>> diff --git a/ui/pages/tabs/host.html.tmpl b/ui/pages/tabs/host.html.tmpl
>> index e59513b..75cf54d 100644
>> --- a/ui/pages/tabs/host.html.tmpl
>> +++ b/ui/pages/tabs/host.html.tmpl
>> @@ -87,14 +87,6 @@
>>                   </h3>
>>                   <div id="content-sys-statistics" 
>> class="section-content">
>>                       <div class="section-row">
>> -                        <div class="section-label"></div>
>> -                        <div class="section-value">
>> -                            <input id="keep-monitoring-checkbox" 
>> type="checkbox" value="" />
>> -                            <label 
>> for="keep-monitoring-checkbox">$_("Collecting data after leaving this 
>> page")</label>
>> -                        </div>
>> -                    </div>
>> -
>> -                    <div class="section-row">
>>                           <div class="section-label">$_("CPU")</div>
>>                           <div class="section-value">
>>                               <div id="container-chart-cpu" 
>> class="inline-block"></div>
>


-- 
Adam King <rak at linux.vnet.ibm.com>
IBM CSI




More information about the Kimchi-devel mailing list