Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/12/15 14:59:54 (9 years ago)
Author:
dglaser
Message:

#2394: Improved PluginManager and updated hive status monitor.

Location:
trunk/sources/HeuristicLab.Services.WebApp.Status/3.3
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataController.cs

    r12428 r12435  
    1 using System;
     1#region License Information
     2/* HeuristicLab
     3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     4 *
     5 * This file is part of HeuristicLab.
     6 *
     7 * HeuristicLab is free software: you can redistribute it and/or modify
     8 * it under the terms of the GNU General Public License as published by
     9 * the Free Software Foundation, either version 3 of the License, or
     10 * (at your option) any later version.
     11 *
     12 * HeuristicLab is distributed in the hope that it will be useful,
     13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 * GNU General Public License for more details.
     16 *
     17 * You should have received a copy of the GNU General Public License
     18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
     19 */
     20#endregion
     21
     22using System;
    223using System.Collections.Generic;
    324using System.Linq;
     
    2142        SELECT
    2243          DISTINCT UserId,
    23           ISNULL((SELECT Count FROM UserTasks WHERE TaskState = 'Calculating' AND UserId = ut.UserId), 0) AS CalculatingTasks,
    24           ISNULL((SELECT Count FROM UserTasks WHERE TaskState = 'Waiting' AND UserId = ut.UserId), 0) AS WaitingTasks
     44          (SELECT Count FROM UserTasks WHERE TaskState = 'Calculating' AND UserId = ut.UserId) AS CalculatingTasks,
     45          (SELECT Count FROM UserTasks WHERE TaskState = 'Waiting' AND UserId = ut.UserId) AS WaitingTasks
    2546        FROM UserTasks ut;";
    2647
     
    4162        CalculatingTasks = uts.CalculatingTasks,
    4263        WaitingTasks = uts.WaitingTasks
    43       });
     64      }).OrderBy(x => x.User.Name);
    4465    }
    4566    // end temporary quickfix
     
    5071                            where slave.SlaveState == SlaveState.Calculating || slave.SlaveState == SlaveState.Idle
    5172                            select slave).ToList();
     73        var activeSlaves = onlineSlaves.Where(s => s.IsAllowedToCalculate).ToList();
     74        var calculatingSlaves = activeSlaves.Where(s => s.SlaveState == SlaveState.Calculating).ToList();
     75
     76        int calculatingMemory = calculatingSlaves.Any() ? (int)calculatingSlaves.Sum(s => s.Memory) / 1024 : 0;
     77        int freeCalculatingMemory = calculatingSlaves.Any() ? (int)calculatingSlaves.Sum(s => s.FreeMemory) / 1024 : 0;
     78
    5279        return new DTO.Status {
    5380          CoreStatus = new DTO.CoreStatus {
    5481            TotalCores = onlineSlaves.Sum(s => s.Cores ?? 0),
    55             AvailableCores = onlineSlaves.Where(s => s.IsAllowedToCalculate).Sum(s => s.Cores ?? 0),
    56             FreeCores = onlineSlaves.Sum(s => s.FreeCores ?? 0)
     82            FreeCores = onlineSlaves.Sum(s => s.FreeCores ?? 0), // temporary for old chart data
     83            ActiveCores = activeSlaves.Sum(s => s.Cores ?? 0),
     84            CalculatingCores = calculatingSlaves.Sum(s => s.Cores ?? 0)
    5785          },
    5886          CpuUtilizationStatus = new DTO.CpuUtilizationStatus {
     
    6088                                  ? Math.Round(onlineSlaves.Average(s => s.CpuUtilization), 2)
    6189                                  : 0.0,
    62             UsedCpuUtilization = onlineSlaves.Any(x => x.IsAllowedToCalculate)
    63                                  ? Math.Round(onlineSlaves.Where(x => x.IsAllowedToCalculate).Average(s => s.CpuUtilization), 2)
    64                                  : 0.0
     90            ActiveCpuUtilization = activeSlaves.Any()
     91                                   ? Math.Round(activeSlaves.Average(s => s.CpuUtilization), 2)
     92                                   : 0.0,
     93            CalculatingCpuUtilization = calculatingSlaves.Any()
     94                                        ? Math.Round(calculatingSlaves.Average(s => s.CpuUtilization), 2)
     95                                        : 0.0
    6596          },
    6697          MemoryStatus = new DTO.MemoryStatus {
    6798            TotalMemory = onlineSlaves.Any() ? (int)onlineSlaves.Sum(s => s.Memory) / 1024 : 0,
    68             FreeMemory = onlineSlaves.Any() ? (int)onlineSlaves.Sum(s => s.FreeMemory) / 1024 : 0
     99            FreeMemory = onlineSlaves.Any() ? (int)onlineSlaves.Sum(s => s.FreeMemory) / 1024 : 0,
     100            ActiveMemory = activeSlaves.Any() ? (int)activeSlaves.Sum(s => s.Memory) / 1024 : 0,
     101            UsedMemory = calculatingMemory - freeCalculatingMemory
    69102          },
    70103          TasksStatus = GetTaskStatus(db),
    71           SlavesCpuStatus = onlineSlaves.Select(x => new DTO.SlaveCpuStatus {
    72             CpuUtilization = Math.Round(x.CpuUtilization, 2),
     104          SlavesStatus = onlineSlaves.Select(x => new DTO.SlaveStatus {
    73105            Slave = new DTO.Slave {
    74106              Id = x.ResourceId.ToString(),
    75107              Name = x.Name
    76             }
    77           }),
     108            },
     109            CpuUtilization = x.CpuUtilization,
     110            Cores = x.Cores ?? 0,
     111            FreeCores = x.FreeCores ?? 0,
     112            Memory = (x.Memory ?? 0) / 1024,
     113            FreeMemory = (x.FreeMemory ?? 0) / 1024,
     114            IsAllowedToCalculate = x.IsAllowedToCalculate,
     115            State = x.SlaveState.ToString()
     116          }).OrderBy(x => x.Slave.Name),
    78117          Timestamp = JavascriptUtils.ToTimestamp(DateTime.Now)
    79118        };
     
    82121
    83122    public IEnumerable<DTO.Status> GetStatusHistory(DateTime start, DateTime end) {
     123      TimeSpan ts = end - start;
     124      int increment = 1;
     125      double totalMinutes = ts.TotalMinutes;
     126      while (totalMinutes > 5761) {
     127        totalMinutes -= 5761;
     128        increment += 5;
     129      }
    84130      using (var db = new HiveDataContext()) {
    85         var statistics = db.Statistics.Where(s => s.Timestamp >= start && s.Timestamp <= end)
    86                                       .OrderBy(x => x.Timestamp)
    87                                       .ToList();
     131        var statistics = db.Statistics.Where(s => s.Timestamp >= start && s.Timestamp <= end);
     132        var status = new DTO.Status {
     133          CoreStatus = new DTO.CoreStatus(),
     134          CpuUtilizationStatus = new DTO.CpuUtilizationStatus(),
     135          MemoryStatus = new DTO.MemoryStatus()
     136        };
     137        int freeCores = 0;
     138        int freeMemory = 0;
     139        int i = 1;
    88140        foreach (var statistic in statistics) {
    89           yield return new DTO.Status {
    90             CoreStatus = new DTO.CoreStatus {
    91               TotalCores = statistic.SlaveStatistics.Sum(x => x.Cores),
    92               AvailableCores = 0,
    93               FreeCores = statistic.SlaveStatistics.Sum(x => x.FreeCores)
    94             },
    95             CpuUtilizationStatus = new DTO.CpuUtilizationStatus {
    96               TotalCpuUtilization = 0.0,
    97               UsedCpuUtilization = statistic.SlaveStatistics.Any() ? statistic.SlaveStatistics.Average(x => x.CpuUtilization) : 0.0
    98             },
    99             MemoryStatus = new DTO.MemoryStatus {
    100               TotalMemory = statistic.SlaveStatistics.Sum(x => x.Memory) / 1024,
    101               FreeMemory = statistic.SlaveStatistics.Sum(x => x.FreeMemory) / 1024
    102             },
    103             Timestamp = JavascriptUtils.ToTimestamp(statistic.Timestamp)
    104           };
     141          status.CoreStatus.TotalCores += statistic.SlaveStatistics.Sum(x => x.Cores);
     142          freeCores += statistic.SlaveStatistics.Sum(x => x.FreeCores);
     143          status.CpuUtilizationStatus.TotalCpuUtilization += statistic.SlaveStatistics.Any()
     144                                                             ? statistic.SlaveStatistics.Average(x => x.CpuUtilization)
     145                                                             : 0.0;
     146          status.MemoryStatus.TotalMemory += statistic.SlaveStatistics.Sum(x => x.Memory) / 1024;
     147          freeMemory += statistic.SlaveStatistics.Sum(x => x.FreeMemory) / 1024;
     148          if (i >= increment) {
     149            status.Timestamp = JavascriptUtils.ToTimestamp(statistic.Timestamp);
     150            status.CoreStatus.TotalCores /= i;
     151            freeCores /= i;
     152            status.CpuUtilizationStatus.TotalCpuUtilization /= i;
     153            status.MemoryStatus.TotalMemory /= i;
     154            freeMemory /= i;
     155            status.CoreStatus.ActiveCores = status.CoreStatus.TotalCores;
     156            status.MemoryStatus.ActiveMemory = status.MemoryStatus.TotalMemory;
     157            status.CpuUtilizationStatus.ActiveCpuUtilization = status.CpuUtilizationStatus.TotalCpuUtilization;
     158            status.CpuUtilizationStatus.CalculatingCpuUtilization = status.CpuUtilizationStatus.CalculatingCpuUtilization;
     159            status.CoreStatus.CalculatingCores = status.CoreStatus.TotalCores - freeCores;
     160            status.MemoryStatus.UsedMemory = status.MemoryStatus.TotalMemory - freeMemory;
     161            yield return status;
     162            status = new DTO.Status {
     163              CoreStatus = new DTO.CoreStatus(),
     164              CpuUtilizationStatus = new DTO.CpuUtilizationStatus(),
     165              MemoryStatus = new DTO.MemoryStatus()
     166            };
     167            freeCores = 0;
     168            freeMemory = 0;
     169            i = 1;
     170          } else {
     171            i++;
     172          }
    105173        }
    106174      }
  • trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/Slave.cs

    r12428 r12435  
    1 namespace HeuristicLab.Services.WebApp.Status.WebApi.DataTransfer {
     1#region License Information
     2/* HeuristicLab
     3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     4 *
     5 * This file is part of HeuristicLab.
     6 *
     7 * HeuristicLab is free software: you can redistribute it and/or modify
     8 * it under the terms of the GNU General Public License as published by
     9 * the Free Software Foundation, either version 3 of the License, or
     10 * (at your option) any later version.
     11 *
     12 * HeuristicLab is distributed in the hope that it will be useful,
     13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 * GNU General Public License for more details.
     16 *
     17 * You should have received a copy of the GNU General Public License
     18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
     19 */
     20#endregion
     21
     22namespace HeuristicLab.Services.WebApp.Status.WebApi.DataTransfer {
    223  public class Slave {
    324    public string Id { get; set; } // currently unused
  • trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/Status.cs

    r12428 r12435  
    1 using System.Collections.Generic;
     1#region License Information
     2/* HeuristicLab
     3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     4 *
     5 * This file is part of HeuristicLab.
     6 *
     7 * HeuristicLab is free software: you can redistribute it and/or modify
     8 * it under the terms of the GNU General Public License as published by
     9 * the Free Software Foundation, either version 3 of the License, or
     10 * (at your option) any later version.
     11 *
     12 * HeuristicLab is distributed in the hope that it will be useful,
     13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 * GNU General Public License for more details.
     16 *
     17 * You should have received a copy of the GNU General Public License
     18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
     19 */
     20#endregion
     21
     22using System.Collections.Generic;
    223
    324namespace HeuristicLab.Services.WebApp.Status.WebApi.DataTransfer {
     
    526  public class CoreStatus {
    627    public int TotalCores { get; set; }
    7     public int AvailableCores { get; set; }
    8     public int FreeCores { get; set; }
     28    public int FreeCores { get; set; } // temporary quickfix for old chart data
     29    public int ActiveCores { get; set; }
     30    public int CalculatingCores { get; set; }
    931  }
    1032
    1133  public class CpuUtilizationStatus {
    1234    public double TotalCpuUtilization { get; set; }
    13     public double UsedCpuUtilization { get; set; }
     35    public double ActiveCpuUtilization { get; set; }
     36    public double CalculatingCpuUtilization { get; set; }
    1437  }
    1538
    1639  public class MemoryStatus {
    1740    public int TotalMemory { get; set; }
    18     public int FreeMemory { get; set; }
     41    public int FreeMemory { get; set; } // temporary quickfix for old chart data
     42    public int ActiveMemory { get; set; }
     43    public int UsedMemory { get; set; }
    1944  }
    2045
     
    2550  }
    2651
    27   public class SlaveCpuStatus {
     52  public class SlaveStatus {
    2853    public Slave Slave { get; set; }
    2954    public double CpuUtilization { get; set; }
     55    public int Cores { get; set; }
     56    public int FreeCores { get; set; }
     57    public int Memory { get; set; }
     58    public int FreeMemory { get; set; }
     59    public bool IsAllowedToCalculate { get; set; }
     60    public string State { get; set; }
    3061  }
    3162
     
    3566    public MemoryStatus MemoryStatus { get; set; }
    3667    public IEnumerable<TaskStatus> TasksStatus { get; set; }
    37     public IEnumerable<SlaveCpuStatus> SlavesCpuStatus { get; set; }
     68    public IEnumerable<SlaveStatus> SlavesStatus { get; set; }
    3869    public long Timestamp { get; set; }
    3970  }
  • trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/User.cs

    r12428 r12435  
    1 
     1#region License Information
     2/* HeuristicLab
     3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     4 *
     5 * This file is part of HeuristicLab.
     6 *
     7 * HeuristicLab is free software: you can redistribute it and/or modify
     8 * it under the terms of the GNU General Public License as published by
     9 * the Free Software Foundation, either version 3 of the License, or
     10 * (at your option) any later version.
     11 *
     12 * HeuristicLab is distributed in the hope that it will be useful,
     13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 * GNU General Public License for more details.
     16 *
     17 * You should have received a copy of the GNU General Public License
     18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
     19 */
     20#endregion
     21
    222namespace HeuristicLab.Services.WebApp.Status.WebApi.DataTransfer {
    323  public class User {
  • trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/JavascriptUtils.cs

    r12428 r12435  
    1 using System;
     1#region License Information
     2/* HeuristicLab
     3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     4 *
     5 * This file is part of HeuristicLab.
     6 *
     7 * HeuristicLab is free software: you can redistribute it and/or modify
     8 * it under the terms of the GNU General Public License as published by
     9 * the Free Software Foundation, either version 3 of the License, or
     10 * (at your option) any later version.
     11 *
     12 * HeuristicLab is distributed in the hope that it will be useful,
     13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 * GNU General Public License for more details.
     16 *
     17 * You should have received a copy of the GNU General Public License
     18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
     19 */
     20#endregion
     21
     22using System;
    223
    324namespace HeuristicLab.Services.WebApp.Status.WebApi {
     
    627      var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    728      var time = input.Subtract(new TimeSpan(epoch.Ticks));
    8       return (long)(time.Ticks / 10000);
     29      return time.Ticks / 10000;
    930    }
    1031  }
  • trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/history/history.cshtml

    r12428 r12435  
    5656                <div class="panel-body">
    5757                    <flot dataset="coreSeries" options="fillChartOptions"></flot>
     58                    <p>{{maxUpper}}</p>
     59                    <p>{{fromDateTime}}</p>
     60                    <p>{{toDateTime}}</p>
    5861                </div>
    5962            </div>
  • trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/history/historyCtrl.js

    r12428 r12435  
    44        ['$scope', '$interval', 'app.status.data.service',
    55        function ($scope, $interval, dataService) {
    6 
    76            $scope.chartOptions = {
    87                grid: {
     
    5958            };
    6059
     60
    6161            $scope.fromDate = new Date();
    6262            $scope.toDate = new Date();
     
    8989
    9090            var updateCharts = function () {
    91                 dataService.getStatusHistory({start: ConvertFromDate($scope.fromDate), end: ConvertToDate($scope.toDate)}, function (status) {
     91                dataService.getStatusHistory({ start: ConvertFromDate($scope.fromDate), end: ConvertToDate($scope.toDate) }, function (status) {
    9292                    var noOfStatus = status.length;
    9393                    var cpuSeries = [];
     
    9696                    for (var i = 0; i < noOfStatus; ++i) {
    9797                        var curStatus = status[i];
    98                         var cpuData = Math.round(curStatus.CpuUtilizationStatus.UsedCpuUtilization);
    99                         var usedCores = curStatus.CoreStatus.TotalCores - curStatus.CoreStatus.FreeCores;
    100                         var usedMemory = curStatus.MemoryStatus.TotalMemory - curStatus.MemoryStatus.FreeMemory;
     98                        var cpuData = Math.round(curStatus.CpuUtilizationStatus.ActiveCpuUtilization);
    10199                        cpuSeries.push([curStatus.Timestamp, cpuData]);
    102                         coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.TotalCores]);
    103                         coreSeries[1].push([curStatus.Timestamp, usedCores]);
    104                         memorySeries[0].push([curStatus.Timestamp, curStatus.MemoryStatus.TotalMemory]);
    105                         memorySeries[1].push([curStatus.Timestamp, usedMemory]);
     100                        coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.ActiveCores]);
     101                        coreSeries[1].push([curStatus.Timestamp, curStatus.CoreStatus.CalculatingCores]);
     102                        memorySeries[0].push([curStatus.Timestamp, curStatus.MemoryStatus.ActiveMemory]);
     103                        memorySeries[1].push([curStatus.Timestamp, curStatus.MemoryStatus.UsedMemory]);
    106104                    }
    107105                    $scope.cpuSeries = [{ data: cpuSeries, label: "&nbsp;CPU Utilization", color: "#f7921d" }];
  • trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/status.cshtml

    r12428 r12435  
    1111
    1212<div class="default-view-container">
    13     <div class="row">
    14         <div class="col-lg-3 col-md-6">
    15             <div class="panel panel-default">
    16                 <div class="panel-heading">
    17                     <h3 class="panel-title">Cores</h3>
    18                 </div>
    19                 <div class="panel-body">
    20                     <center>
    21                         <knob knob-data="core.knobData" knob-options="knobOptions"></knob>
    22                     </center>
    23                     <p>Total Cores: {{status.CoreStatus.TotalCores}}</p>
    24                     <p>Used Cores: {{status.CoreStatus.TotalCores - status.CoreStatus.FreeCores}}</p>
    25                 </div>
    26             </div>
    27         </div>
    28 
    29         <div class="col-lg-3 col-md-6">
    30             <div class="panel panel-default">
    31                 <div class="panel-heading">
    32                     <h3 class="panel-title">CPU Utilization</h3>
    33                 </div>
    34                 <div class="panel-body">
    35                     <center>
    36                         <knob knob-data="cpu.knobData" knob-options="knobOptions"></knob>
    37                     </center>
    38                     <p>Total Utilization: {{status.CpuUtilizationStatus.TotalCpuUtilization}} %</p>
    39                     <p>Used Utilization: {{status.CpuUtilizationStatus.UsedCpuUtilization}} %</p>
    40                 </div>
    41             </div>
    42         </div>
    43 
    44         <div class="col-lg-3 col-md-6">
    45             <div class="panel panel-default">
    46                 <div class="panel-heading">
    47                     <h3 class="panel-title">Memory</h3>
    48                 </div>
    49                 <div class="panel-body">
    50                     <center>
    51                         <knob knob-data="memory.knobData" knob-options="knobOptions"></knob>
    52                     </center>
    53                     <p>TotalMemory: {{status.MemoryStatus.TotalMemory}} GB</p>
    54                     <p>UsedMemory: {{status.MemoryStatus.TotalMemory - status.MemoryStatus.FreeMemory}} GB</p>
    55                 </div>
    56             </div>
    57         </div>
    58 
    59         <div class="col-lg-3 col-md-6">
    60             <div class="panel panel-default">
    61                 <div class="panel-heading">
    62                     <h3 class="panel-title">Tasks</h3>
    63                 </div>
    64                 <div class="panel-body">
    65                     <p>Total: {{tasks.WaitingTasks + tasks.CalculatingTasks}}</p>
    66                     <p>Waiting: {{tasks.WaitingTasks}}</p>
    67                     <p>Calculating: {{tasks.CalculatingTasks}}</p>
    68                 </div>
    69             </div>
    70         </div>
    71     </div>
    72 
    73     <div class="row">
    74         <div class="col-lg-12">
    75             <div class="panel panel-default">
    76                 <div class="panel-heading">
    77                     <h3 class="panel-title">CPU Utilization Chart</h3>
    78                 </div>
    79                 <div class="panel-body">
    80                     <flot dataset="cpu.series" options="chartOptions"></flot>
    81                 </div>
    82             </div>
    83         </div>
    84     </div>
    85 
    86     <div class="row">
    87         <div class="col-lg-12">
    88             <div class="panel panel-default">
    89                 <div class="panel-heading">
    90                     <h3 class="panel-title">Core Chart</h3>
    91                 </div>
    92                 <div class="panel-body">
    93                     <flot dataset="core.series" options="fillChartOptions"></flot>
    94                 </div>
    95             </div>
    96         </div>
    97     </div>
    98 
    99     <div class="row">
    100         <div class="col-lg-12">
    101             <div class="panel panel-default">
    102                 <div class="panel-heading">
    103                     <h3 class="panel-title">Memory Chart</h3>
    104                 </div>
    105                 <div class="panel-body">
    106                     <flot dataset="memory.series" options="fillChartOptions"></flot>
    107                 </div>
    108             </div>
    109         </div>
    110     </div>
    111 
    112     <div class="row">
    113         <div class="col-lg-12">
    114             <div class="panel panel-default">
    115                 <div class="panel-heading">
    116                     <h3 class="panel-title">Tasks by User</h3>
    117                 </div>
     13<div class="row">
     14    <div class="col-lg-3 col-md-6">
     15        <div class="panel panel-default">
     16            <div class="panel-heading">
     17                <h3 class="panel-title">Cores</h3>
     18            </div>
     19            <div class="panel-body">
     20                <div class="text-center">
     21                    <knob knob-data="core.knobData" knob-options="knobOptions"></knob>
     22                </div>
     23                <table class="table table-no-border table-condensed table-auto-width table-content">
     24                    <tr data-toggle="tooltip" data-placement="bottom" title="All online slaves">
     25                        <td class="text-left">
     26                            Total:
     27                        </td>
     28                        <td class="text-right">{{status.CoreStatus.TotalCores | number}}</td>
     29                    </tr>
     30                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating and idle slaves that are allowed to calculate">
     31                        <td class="text-left">Active:</td>
     32                        <td class="text-right">{{status.CoreStatus.ActiveCores | number}}</td>
     33                    </tr>
     34                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating slaves that are allowed to calculate">
     35                        <td class="text-left">Calculating:</td>
     36                        <td class="text-right">{{status.CoreStatus.CalculatingCores | number}}</td>
     37                    </tr>
     38                </table>
     39            </div>
     40        </div>
     41    </div>
     42
     43    <div class="col-lg-3 col-md-6">
     44        <div class="panel panel-default">
     45            <div class="panel-heading">
     46                <h3 class="panel-title">CPU Utilization</h3>
     47            </div>
     48            <div class="panel-body">
     49                <div class="text-center">
     50                    <knob knob-data="cpu.knobData" knob-options="knobOptions"></knob>
     51                </div>
     52                <table class="table table-no-border table-condensed table-auto-width table-content">
     53                    <tr data-toggle="tooltip" data-placement="bottom" title="All online slaves">
     54                        <td class="text-left">Total:</td>
     55                        <td class="text-right">{{status.CpuUtilizationStatus.TotalCpuUtilization | number: 2}} %</td>
     56                    </tr>
     57                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating and idle slaves that are allowed to calculate">
     58                        <td class="text-left">Active:</td>
     59                        <td class="text-right">{{status.CpuUtilizationStatus.ActiveCpuUtilization | number: 2}} %</td>
     60                    </tr>
     61                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating slaves that are allowed to calculate">
     62                        <td class="text-left">Calculating:</td>
     63                        <td class="text-right">{{status.CpuUtilizationStatus.CalculatingCpuUtilization | number: 2}} %</td>
     64                    </tr>
     65                </table>
     66            </div>
     67        </div>
     68    </div>
     69
     70    <div class="col-lg-3 col-md-6">
     71        <div class="panel panel-default">
     72            <div class="panel-heading">
     73                <h3 class="panel-title">Memory</h3>
     74            </div>
     75            <div class="panel-body">
     76                <div class="text-center">
     77                    <knob knob-data="memory.knobData" knob-options="knobOptions"></knob>
     78                </div>
     79                <table class="table table-no-border table-condensed table-auto-width table-content">
     80                    <tr data-toggle="tooltip" data-placement="bottom" title="All online slaves">
     81                        <td class="text-left">Total:</td>
     82                        <td class="text-right">{{status.MemoryStatus.TotalMemory | number}} GB</td>
     83                    </tr>
     84                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating and idle slaves that are allowed to calculate">
     85                        <td class="text-left">Active:</td>
     86                        <td class="text-right">{{status.MemoryStatus.ActiveMemory | number}} GB</td>
     87                    </tr>
     88                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating slaves that are allowed to calculate">
     89                        <td class="text-left">Calculating:</td>
     90                        <td class="text-right">{{status.MemoryStatus.UsedMemory | number}} GB</td>
     91                    </tr>
     92                </table>
     93            </div>
     94        </div>
     95    </div>
     96
     97    <div class="col-lg-3 col-md-6">
     98        <div class="panel panel-default">
     99            <div class="panel-heading">
     100                <h3 class="panel-title">Tasks</h3>
     101            </div>
     102            <div class="panel-body">
     103                <table class="table table-no-border table-condensed table-auto-width table-content">
     104                    <tr>
     105                        <td class="text-left">Total:</td>
     106                        <td class="text-right">{{tasks.WaitingTasks + tasks.CalculatingTasks | number}}</td>
     107                    </tr>
     108                    <tr>
     109                        <td class="text-left">Waiting:</td>
     110                        <td class="text-right">{{tasks.WaitingTasks | number}}</td>
     111                    </tr>
     112                    <tr>
     113                        <td class="text-left">Calculating:</td>
     114                        <td class="text-right">{{tasks.CalculatingTasks | number}}</td>
     115                    </tr>
     116                </table>
     117            </div>
     118        </div>
     119    </div>
     120</div>
     121
     122<div class="row">
     123    <div class="col-lg-12">
     124        <div class="panel panel-default">
     125            <div class="panel-heading">
     126                <h3 class="panel-title">CPU Utilization Chart</h3>
     127            </div>
     128            <div class="panel-body">
     129                <flot dataset="cpu.series" options="chartOptions"></flot>
     130            </div>
     131        </div>
     132    </div>
     133</div>
     134
     135<div class="row">
     136    <div class="col-lg-12">
     137        <div class="panel panel-default">
     138            <div class="panel-heading">
     139                <h3 class="panel-title">Core Chart</h3>
     140            </div>
     141            <div class="panel-body">
     142                <flot dataset="core.series" options="fillChartOptions"></flot>
     143            </div>
     144        </div>
     145    </div>
     146</div>
     147
     148<div class="row">
     149    <div class="col-lg-12">
     150        <div class="panel panel-default">
     151            <div class="panel-heading">
     152                <h3 class="panel-title">Memory Chart</h3>
     153            </div>
     154            <div class="panel-body">
     155                <flot dataset="memory.series" options="fillChartOptions"></flot>
     156            </div>
     157        </div>
     158    </div>
     159</div>
     160
     161<div class="row">
     162    <div class="col-lg-12">
     163        <div class="panel panel-default">
     164            <div class="panel-heading">
     165                <h3 class="panel-title">Tasks by User</h3>
     166            </div>
     167            <div class="panel-body">
     168                <table class="table table-hover">
     169                    <thead>
     170                    <tr>
     171                        <th>Username</th>
     172                        <th>Calculating Tasks</th>
     173                        <th>Waiting Tasks</th>
     174                    </tr>
     175                    </thead>
     176                    <tr ng-repeat="task in status.TasksStatus">
     177                        <td>{{task.User.Name}}</td>
     178                        <td>{{task.CalculatingTasks | number}}</td>
     179                        <td>{{task.WaitingTasks | number}}</td>
     180                    </tr>
     181                    <tr ng-hide="status.TasksStatus.length">
     182                        <td colspan="3" class="text-center">
     183                            There are no waiting or calculating tasks available!
     184                        </td>
     185                    </tr>
     186                </table>
     187            </div>
     188        </div>
     189    </div>
     190</div>
     191
     192<div class="row">
     193    <div class="col-lg-12">
     194        <div class="panel panel-default">
     195            <div class="panel-heading">
     196                <h3 class="panel-title">
     197                    <a data-toggle="collapse" data-target="#collapseActiveCalculatingSlaves"
     198                       ng-href="#/status">
     199                        Active Calculating Slaves
     200                    </a>
     201                </h3>
     202            </div>
     203            <div id="collapseActiveCalculatingSlaves"
     204                 class="panel-collapse collapse in">
    118205                <div class="panel-body">
    119206                    <table class="table table-hover">
    120207                        <thead>
    121                             <tr>
    122                                 <th>Username</th>
    123                                 <th>Calculating Tasks</th>
    124                                 <th>Waiting Tasks</th>
    125                             </tr>
     208                        <tr>
     209                            <th ng-click="activeCalculatingSlavesOrderColumn='Slave.Name';
     210                                                  activeCalculatingSlavesReverseSort=!activeCalculatingSlavesReverseSort">
     211                                Slave
     212                            </th>
     213                            <th ng-click="activeCalculatingSlavesOrderColumn='CpuUtilization';
     214                                                  activeCalculatingSlavesReverseSort=!activeCalculatingSlavesReverseSort">
     215                                CPU Utilization
     216                            </th>
     217                            <th ng-click="activeCalculatingSlavesOrderColumn='Cores';
     218                                                  activeCalculatingSlavesReverseSort=!activeCalculatingSlavesReverseSort">
     219                                Cores
     220                            </th>
     221                            <th ng-click="activeCalculatingSlavesOrderColumn='Memory';
     222                                                  activeCalculatingSlavesReverseSort=!activeCalculatingSlavesReverseSort">
     223                                Memory
     224                            </th>
     225                        </tr>
    126226                        </thead>
    127                         <tr ng-repeat="task in status.TasksStatus">
    128                             <td>{{task.User.Name}}</td>
    129                             <td>{{task.CalculatingTasks}}</td>
    130                             <td>{{task.WaitingTasks}}</td>
     227                        <tr ng-repeat="slave in activeCalculatingSlaves = (status.SlavesStatus
     228                                | filter: {
     229                                    IsAllowedToCalculate: true,
     230                                    State: 'Calculating'
     231                                  }
     232                                | orderBy: activeCalculatingSlavesOrderColumn:activeCalculatingSlavesReverseSort)">
     233                            <td>{{slave.Slave.Name}}</td>
     234                            <td>{{slave.CpuUtilization | number: 2}} %</td>
     235                            <td>{{slave.Cores | number}}</td>
     236                            <td>{{slave.Memory | number}} GB</td>
     237                        </tr>
     238                        <tr ng-hide="activeCalculatingSlaves.length">
     239                            <td colspan="4" class="text-center">
     240                                There are no active calculating slaves available!
     241                            </td>
    131242                        </tr>
    132243                    </table>
     
    135246        </div>
    136247    </div>
    137 
    138     <div class="row">
    139         <div class="col-lg-12">
    140             <div class="panel panel-default">
    141                 <div class="panel-heading">
    142                     <h3 class="panel-title">CPU Utilization by Slave</h3>
    143                 </div>
     248</div>
     249
     250<div class="row">
     251    <div class="col-lg-12">
     252        <div class="panel panel-default">
     253            <div class="panel-heading">
     254                <h3 class="panel-title">
     255                    <a data-toggle="collapse" data-target="#collapseActiveIdleSlaves"
     256                       ng-href="#/status" class="collapsed">
     257                        Active Idle Slaves
     258                    </a>
     259                </h3>
     260            </div>
     261            <div id="collapseActiveIdleSlaves"
     262                 class="panel-collapse collapse">
    144263                <div class="panel-body">
    145264                    <table class="table table-hover">
    146265                        <thead>
    147                             <tr>
    148                                 <th>Slave</th>
    149                                 <th>CPU Utilization</th>
    150                             </tr>
     266                        <tr>
     267                            <th ng-click="activeIdleSlavesOrderColumn='Slave.Name';
     268                                                  activeIdleSlavesReverseSort=!activeIdleSlavesReverseSort">
     269                                Slave
     270                            </th>
     271                            <th ng-click="activeIdleSlavesOrderColumn='CpuUtilization';
     272                                                  activeIdleSlavesReverseSort=!activeIdleSlavesReverseSort">
     273                                CPU Utilization
     274                            </th>
     275                            <th ng-click="activeIdleSlavesOrderColumn='Cores';
     276                                                  activeIdleSlavesReverseSort=!activeIdleSlavesReverseSort">
     277                                Cores
     278                            </th>
     279                            <th ng-click="activeIdleSlavesOrderColumn='Memory';
     280                                                  activeIdleSlavesReverseSort=!activeIdleSlavesReverseSort">
     281                                Memory
     282                            </th>
     283                        </tr>
    151284                        </thead>
    152                         <tr ng-repeat="slave in status.SlavesCpuStatus">
     285                        <tr ng-repeat="slave in activeIdleSlaves = (status.SlavesStatus
     286                                | filter: {
     287                                    IsAllowedToCalculate: true,
     288                                    State: 'Idle'
     289                                  }
     290                                | orderBy: activeIdleSlavesOrderColumn:activeIdleSlavesReverseSort)">
    153291                            <td>{{slave.Slave.Name}}</td>
    154                             <td>{{slave.CpuUtilization}} %</td>
     292                            <td>{{slave.CpuUtilization | number: 2}} %</td>
     293                            <td>{{slave.Cores | number}}</td>
     294                            <td>{{slave.Memory | number}} GB</td>
     295                        </tr>
     296                        <tr ng-hide="activeIdleSlaves.length">
     297                            <td colspan="4" class="text-center">
     298                            There are no active idle slaves available!
     299                            <td>
    155300                        </tr>
    156301                    </table>
     
    160305    </div>
    161306</div>
     307
     308<div class="row">
     309    <div class="col-lg-12">
     310        <div class="panel panel-default">
     311            <div class="panel-heading">
     312                <h3 class="panel-title">
     313                    <a data-toggle="collapse" data-target="#collapseInactiveSlaves"
     314                       ng-href="#/status" class="collapsed">
     315                        Inactive Slaves
     316                    </a>
     317                </h3>
     318            </div>
     319            <div id="collapseInactiveSlaves"
     320                 class="panel-collapse collapse">
     321                <div class="panel-body">
     322                    <table class="table table-hover">
     323                        <thead>
     324                        <tr>
     325                            <th ng-click="inactiveSlavesOrderColumn='Slave.Name';
     326                                                  inactiveSlavesReverseSort=!inactiveSlavesReverseSort">
     327                                Slave
     328                            </th>
     329                            <th ng-click="inactiveSlavesOrderColumn='CpuUtilization';
     330                                                  inactiveSlavesReverseSort=!inactiveSlavesReverseSort">
     331                                CPU Utilization
     332                            </th>
     333                            <th ng-click="inactiveSlavesOrderColumn='Cores';
     334                                                  inactiveSlavesReverseSort=!inactiveSlavesReverseSort">
     335                                Cores
     336                            </th>
     337                            <th ng-click="inactiveSlavesOrderColumn='Memory';
     338                                                  inactiveSlavesReverseSort=!inactiveSlavesReverseSort">
     339                                Memory
     340                            </th>
     341                        </tr>
     342                        </thead>
     343                        <tr ng-repeat="slave in inactiveSlaves = (status.SlavesStatus
     344                                | filter: {
     345                                    IsAllowedToCalculate: false
     346                                  }
     347                                | orderBy: inactiveSlavesOrderColumn:inactiveSlavesReverseSort)">
     348                            <td>{{slave.Slave.Name}}</td>
     349                            <td>{{slave.CpuUtilization | number: 2}} %</td>
     350                            <td>{{slave.Cores | number}}</td>
     351                            <td>{{slave.Memory | number}} GB</td>
     352                        </tr>
     353                        <tr ng-hide="inactiveSlaves.length">
     354                            <td colspan="4" class="text-center">No inactive slaves available!</td>
     355                        </tr>
     356                    </table>
     357                </div>
     358            </div>
     359        </div>
     360    </div>
     361</div>
     362</div>
     363
     364<script>
     365    $(document).ready(function () {
     366        $('[data-toggle="tooltip"]').tooltip();
     367    });
     368</script>
  • trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/statusCtrl.js

    r12428 r12435  
    5353                    mode: "time",
    5454                    twelveHourClock: false
     55                },
     56                yaxis: {
     57                    min: 0
    5558                }
    5659            };
     
    8285            };
    8386
     87            $scope.activeIdleSlaveFilter = function (slave) {
     88                return (slave.IsAllowedToCalculate == true) && (slave.State == 'Idle');
     89            };
     90
     91            $scope.activeCalculatingSlavesReverseSort = false;
     92            $scope.activeCalculatingSlavesOrderColumn = 'slave.Slave.Name';
     93
     94            $scope.activeIdleSlavesReverseSort = false;
     95            $scope.activeIdleSlavesOrderColumn = 'slave.Slave.Name';
     96
     97            $scope.inactiveSlavesReverseSort = false;
     98            $scope.inactiveSlavesOrderColumn = 'slave.Slave.Name';
     99
     100
    84101            var updateStatus = function () {
    85102                // update status data
    86103                dataService.getStatus({}, function (status) {
     104                    var oneDayInMs = 24 * 60 * 60 * 1000;
     105                    var today = new Date().getTime() - oneDayInMs;
    87106                    // raw status data
    88107                    $scope.status = status;
     
    96115                    }
    97116                    // knobs
    98                     $scope.cpu.knobData = Math.round(status.CpuUtilizationStatus.UsedCpuUtilization);
    99                     var usedCores = status.CoreStatus.TotalCores - status.CoreStatus.FreeCores;
    100                     $scope.core.knobData = Math.round(usedCores / status.CoreStatus.TotalCores * 100);
    101                     var usedMemory = status.MemoryStatus.TotalMemory - status.MemoryStatus.FreeMemory;
    102                     $scope.memory.knobData = Math.round(usedMemory / status.MemoryStatus.TotalMemory * 100);
     117                    $scope.cpu.knobData = Math.round(status.CpuUtilizationStatus.ActiveCpuUtilization);
     118                    $scope.core.knobData = Math.round(status.CoreStatus.CalculatingCores / status.CoreStatus.ActiveCores * 100);
     119                    $scope.memory.knobData = Math.round(status.MemoryStatus.UsedMemory / status.MemoryStatus.ActiveMemory * 100);
    103120                    // chart series
    104121                    var cpuSeries = $scope.cpu.series[0].data.splice(0);
    105                     if (cpuSeries.length > 2) {
    106                         cpuSeries.splice(0, 1);
    107                     }
    108122                    var coreSeries = [$scope.core.series[0].data, $scope.core.series[1].data];
    109                     if (coreSeries[0].length > 2) {
    110                         coreSeries[0].splice(0, 1);
    111                     }
    112                     if (coreSeries[1].length > 2) {
    113                         coreSeries[1].splice(0, 1);
    114                     }
    115123                    var memorySeries = [$scope.memory.series[0].data, $scope.memory.series[1].data];
    116                     if (memorySeries[0].length > 2) {
    117                         memorySeries[0].splice(0, 1);
    118                     }
    119                     if (memorySeries[1].length > 2) {
    120                         memorySeries[1].splice(0, 1);
     124                    if ($scope.status.Timestamp < today) {
     125                        if (cpuSeries.length > 2) {
     126                            cpuSeries.splice(0, 1);
     127                        }
     128                        if (coreSeries[0].length > 2) {
     129                            coreSeries[0].splice(0, 1);
     130                        }
     131                        if (coreSeries[1].length > 2) {
     132                            coreSeries[1].splice(0, 1);
     133                        }
     134                        if (memorySeries[0].length > 2) {
     135                            memorySeries[0].splice(0, 1);
     136                        }
     137                        if (memorySeries[1].length > 2) {
     138                            memorySeries[1].splice(0, 1);
     139                        }
    121140                    }
    122141                    cpuSeries.push([$scope.status.Timestamp, $scope.cpu.knobData]);
     142
     143                    // charts are currently filled with old total/used data
     144                    // start temporary
     145                    var usedCores = status.CoreStatus.TotalCores - status.getCoreStatus.FreeCores;
     146                    var usedMemory = status.MemoryStatus.TotalMemory - status.MemoryStatus.FreeMemory;
     147                    // end temporary
    123148                    coreSeries[0].push([$scope.status.Timestamp, status.CoreStatus.TotalCores]);
    124149                    coreSeries[1].push([$scope.status.Timestamp, usedCores]);
     
    149174                    for (var i = 0; i < noOfStatus; ++i) {
    150175                        var curStatus = status[i];
    151                         var cpuData = Math.round(curStatus.CpuUtilizationStatus.UsedCpuUtilization);
    152                         var usedCores = curStatus.CoreStatus.TotalCores - curStatus.CoreStatus.FreeCores;
    153                         var usedMemory = curStatus.MemoryStatus.TotalMemory - curStatus.MemoryStatus.FreeMemory;
     176                        var cpuData = Math.round(curStatus.CpuUtilizationStatus.ActiveCpuUtilization);
    154177                        cpuSeries.push([curStatus.Timestamp, cpuData]);
    155                         coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.TotalCores]);
    156                         coreSeries[1].push([curStatus.Timestamp, usedCores]);
    157                         memorySeries[0].push([curStatus.Timestamp, curStatus.MemoryStatus.TotalMemory]);
    158                         memorySeries[1].push([curStatus.Timestamp, usedMemory]);
     178                        coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.ActiveCores]);
     179                        coreSeries[1].push([curStatus.Timestamp, curStatus.CoreStatus.CalculatingCores]);
     180                        memorySeries[0].push([curStatus.Timestamp, curStatus.MemoryStatus.ActiveMemory]);
     181                        memorySeries[1].push([curStatus.Timestamp, curStatus.MemoryStatus.UsedMemory]);
    159182                    }
    160183                    $scope.cpu.series = [{ data: cpuSeries, label: "&nbsp;CPU Utilization", color: "#f7921d" }];
Note: See TracChangeset for help on using the changeset viewer.