Author: eallen
Date: 2011-04-07 18:06:31 +0000 (Thu, 07 Apr 2011)
New Revision: 4694
Modified:
trunk/cumin/python/cumin/grid/dashboard.py
trunk/cumin/python/cumin/grid/dashboard.strings
Log:
Add a footnote to the scheduler stats that shows the WindowedStartWidth
Modified: trunk/cumin/python/cumin/grid/dashboard.py
===================================================================
--- trunk/cumin/python/cumin/grid/dashboard.py 2011-04-06 20:40:22 UTC (rev 4693)
+++ trunk/cumin/python/cumin/grid/dashboard.py 2011-04-07 18:06:31 UTC (rev 4694)
@@ -48,8 +48,11 @@
super(DashboardSummary, self).__init__(app, name)
cls = app.model.com_redhat_grid.Scheduler
- columns = (cls.JobSubmissionRate, cls.JobStartRate, cls.JobCompletionRate)
- stats = DashboardSummaryStats(app, "rates", collector, cls, columns,
"Scheduler.Jobs")
+ # tell the DashboardSummaryStats to average this column
+ setattr(cls.MeanTimeToStart, "average", True)
+
+ columns = (cls.JobSubmissionRate, cls.JobStartRate, cls.JobCompletionRate,
cls.MeanTimeToStart)
+ stats = FootnoteDashboardSummaryStats(app, "rates", collector, cls,
columns, "Scheduler.Jobs")
stats.title = "Job scheduler info"
self.add_child(stats)
@@ -78,7 +81,7 @@
n = MonitorSelfStats(app, "ms_n", collector, cls, "Negotiator
performance", frame)
self.add_child(n)
- s = MonitorSelfSchedulerTable(app, "ms_s", collector)
+ s = SchedulerPerformance(app, "ms_s", collector)
self.add_child(s)
def render_title(self, session):
@@ -394,8 +397,18 @@
def get_item_value(self, session, item):
record = self.get_record(session)
- return record[self.get_item_index(item)] or 0
+ value = record[self.get_item_index(item)] or 0
+ # if we want to show an average instead of an aggregate
+ if getattr(item, "average", None):
+ # the count of records is tucked away past the end of the normal fields
+ total = record[len(self.columns)]
+ if total:
+ value = value / total
+ else:
+ value = 0
+ return value
+
def get_item_index(self, item):
return self.sum_columns.index(item.name)
@@ -407,6 +420,21 @@
return record
+class FootnoteDashboardSummaryStats(DashboardSummaryStats):
+ def __init__(self, app, name, collector, cls, columns, title):
+ super(FootnoteDashboardSummaryStats, self).__init__(app, name, collector, cls,
columns, title)
+
+ self.footnote_data = DashboardSumData(app, [cls.WindowedStatWidth.name],
collector, cls)
+
+ def render_footnote_value(self, session):
+ # get the average WindowedStarWidth for all schedulers
+ data = self.footnote_data.get_record(session)
+ try:
+ value = data[0] / data[1]
+ except:
+ value = 0
+ return value
+
class DashboardPieSummarySet(PieStatSet):
def __init__(self, app, name, collector, cls, columns, title):
super(DashboardPieSummarySet, self).__init__(app, name, collector, title)
@@ -825,14 +853,43 @@
def render_title(self, session, *args):
return "Slots Precessed"
-class MonitorSelfSchedulerTable(Widget):
+
+class MonitorSelfSchedulerTable(ObjectSelector):
+ def __init__(self, app, name, pool, cls, frame):
+ super(MonitorSelfSchedulerTable, self).__init__(app, name, cls)
+
+ self.pool = pool
+ self.add_filter(self.pool, cls.Pool)
+
+ col = ObjectLinkColumn(app, "name", cls.Name, cls._id, frame)
+ self.add_column(col)
+
+ self.add_attribute_column(cls.MonitorSelfAge)
+
+ self.add_attribute_column(cls.JobSubmissionRate)
+ self.add_attribute_column(cls.JobStartRate)
+ self.add_attribute_column(cls.JobCompletionRate)
+
+ stat = MonitorSelfStatColumn(app, cls.MonitorSelfCPUUsage.name,
cls.MonitorSelfCPUUsage)
+ self.add_column(stat)
+
+ stat = MonitorSelfStatColumn(app, cls.MonitorSelfImageSize.name,
cls.MonitorSelfImageSize)
+ self.add_column(stat)
+
+ self.enable_csv_export(pool)
+
+ def create_table(self, app, name, cls):
+ # avoid the checkboxes
+ return MinimalTable(app, name, cls)
+
+class SchedulerPerformance(Widget):
def __init__(self, app, name, collector):
- super(MonitorSelfSchedulerTable, self).__init__(app, name)
+ super(SchedulerPerformance, self).__init__(app, name)
cls = app.model.com_redhat_grid.Scheduler
frame = "main.grid.scheduler"
- self.table = MonitorSelfTable(app, "current", collector, cls, frame,
False)
+ self.table = MonitorSelfSchedulerTable(app, "current", collector, cls,
frame)
self.add_child(self.table)
rates = WidgetSet(app, "rate_widgets")
@@ -867,6 +924,17 @@
stats.title = "Aggregate job shadow exceptions stats"
others.add_child(stats)
+ self.footnote_data = DashboardSumData(app, [cls.WindowedStatWidth.name],
collector, cls)
+
+ def render_footnote_value(self, session):
+ # get the average WindowedStarWidth for all schedulers
+ data = self.footnote_data.get_record(session)
+ try:
+ value = data[0] / data[1]
+ except:
+ value = 0
+ return value
+
def render_title(self, session):
return "Scheduler performance"
@@ -915,19 +983,19 @@
self.add_column(col)
stat = ObjectTableColumn(app, cls.MonitorSelfAge.name, cls.MonitorSelfAge)
- stat.static_header = True
+ stat.static_header = static
self.add_column(stat)
stat = MonitorSelfStatColumn(app, cls.MonitorSelfRegisteredSocketCount.name,
cls.MonitorSelfRegisteredSocketCount)
- stat.static_header = True
+ stat.static_header = static
self.add_column(stat)
stat = MonitorSelfStatColumn(app, cls.MonitorSelfCPUUsage.name,
cls.MonitorSelfCPUUsage)
- stat.static_header = True
+ stat.static_header = static
self.add_column(stat)
stat = MonitorSelfStatColumn(app, cls.MonitorSelfImageSize.name,
cls.MonitorSelfImageSize)
- stat.static_header = True
+ stat.static_header = static
self.add_column(stat)
self.enable_csv_export(pool)
Modified: trunk/cumin/python/cumin/grid/dashboard.strings
===================================================================
--- trunk/cumin/python/cumin/grid/dashboard.strings 2011-04-06 20:40:22 UTC (rev 4693)
+++ trunk/cumin/python/cumin/grid/dashboard.strings 2011-04-07 18:06:31 UTC (rev 4694)
@@ -30,33 +30,35 @@
[MonitorSelfTitle.html]
<h3>{title}</h3>
-[MonitorSelfSchedulerTable.css]
-div.MonitorSelfSchedulerTable {
+[SchedulerPerformance.css]
+div.SchedulerPerformance {
margin-bottom: 3em;
}
-div.MonitorSelfSchedulerTable h2.title {
+div.SchedulerPerformance h2.title {
margin: 1em 0;
padding: 0.5em;
background-color: #E7E7F7;
}
-div.MonitorSelfSchedulerTable ul.WidgetSet {
+div.SchedulerPerformance ul.WidgetSet {
padding: 0;
margin: 0;
list-style: none;
}
-div.MonitorSelfSchedulerTable ul.WidgetSet li {
+div.SchedulerPerformance ul.WidgetSet li {
display: inline;
}
-div.MonitorSelfSchedulerTable div.aggregates {
- margin-top: 2em;
+div.SchedulerPerformance div.footnote {
+ font-style: italic;
+ font-size: 80%;
}
-[MonitorSelfSchedulerTable.html]
+[SchedulerPerformance.html]
<div id="{id}" class="{class}">
<h2 class="title">{title}</h2>
+ <div class="footnote">Average scheduler sampling window is
{footnote_value} seconds</div>
<div class="aggregates">
{rate_widgets}
<div style="clear: left;"></div>
@@ -276,3 +278,20 @@
<dt title="{html_title}">{item_title}</dt>
<dd><span>{item_value}</span></dd>
+[FootnoteDashboardSummaryStats.css]
+div.FootnoteDashboardSummaryStats div.footnote {
+ font-style: italic;
+ font-size: 80%;
+}
+
+[FootnoteDashboardSummaryStats.html]
+<div id="{id}" class="{class}">
+ <h3>{title}</h3>
+ <dl>
+ {items}
+ </dl>
+ <div class="footnote">Averaged over a {footnote_value} second
sampling window</div>
+ <div class="icons">
+ {export}
+ </div>
+</div>