[rhmessaging-commits] rhmessaging commits: r1533 - mgmt/cumin/python/cumin.

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Fri Jan 4 10:50:26 EST 2008


Author: justi9
Date: 2008-01-04 10:50:25 -0500 (Fri, 04 Jan 2008)
New Revision: 1533

Modified:
   mgmt/cumin/python/cumin/__init__.py
   mgmt/cumin/python/cumin/client.py
   mgmt/cumin/python/cumin/client.strings
   mgmt/cumin/python/cumin/exchange.py
   mgmt/cumin/python/cumin/exchange.strings
   mgmt/cumin/python/cumin/model.py
   mgmt/cumin/python/cumin/page.strings
   mgmt/cumin/python/cumin/parameters.py
   mgmt/cumin/python/cumin/queue.py
   mgmt/cumin/python/cumin/queue.strings
   mgmt/cumin/python/cumin/stat.py
   mgmt/cumin/python/cumin/stat.strings
   mgmt/cumin/python/cumin/widgets.py
Log:
A step toward better charts.  Changes the page and widget
infrastructure for charts.  Adds more configuration capabilities to
the chart png target.

Simplifies listeners for live updates (charts and otherwise).

Introduces a CuminClassParameter for generic object ids.

Where possible moves stats js code into the reusable widgets
themselves rather than in the caller.

Adds cumin class lookup by name.



Modified: mgmt/cumin/python/cumin/__init__.py
===================================================================
--- mgmt/cumin/python/cumin/__init__.py	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/__init__.py	2008-01-04 15:50:25 UTC (rev 1533)
@@ -13,9 +13,10 @@
 from model import CuminModel
 from demo import DemoData
 from page import CuminPage
-from queue import QueueXmlPage, QueueChartPage
-from exchange import ExchangeXmlPage, ExchangeChartPage
-from client import ClientXmlPage, ClientChartPage
+from queue import QueueXmlPage
+from exchange import ExchangeXmlPage
+from client import ClientXmlPage
+from stat import StatChartPage
 
 class Cumin(Application):
     def __init__(self):
@@ -41,11 +42,9 @@
         self.add_page(ResourcePage(self, "resource"))
         self.add_page(DevelPage(self, "devel.html"))
         self.add_page(QueueXmlPage(self, "queue.xml"))
-        self.add_page(QueueChartPage(self, "queue.png"))
         self.add_page(ExchangeXmlPage(self, "exchange.xml"))
-        self.add_page(ExchangeChartPage(self, "exchange.png"))
         self.add_page(ClientXmlPage(self, "client.xml"))
-        self.add_page(ClientChartPage(self, "client.png"))
+        self.add_page(StatChartPage(self, "stats.png"))
 
 class CuminServer(WebServer):
     def __init__(self, port=9090):

Modified: mgmt/cumin/python/cumin/client.py
===================================================================
--- mgmt/cumin/python/cumin/client.py	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/client.py	2008-01-04 15:50:25 UTC (rev 1533)
@@ -244,17 +244,20 @@
             return "Current"
 
     class StatisticsHistory(Widget):
-        def get_title(self, session, client):
-            return "History"
+        def __init__(self, app, name):
+            super(ClientStatistics.StatisticsHistory, self).__init__(app, name)
 
-        def render_sent_chart_url(self, session, client):
-            return "client.png?id=%i;s=framesFromClient;s=bytesFromClient" \
-                   % client.id
+            chart = StatValueChart(app, "sent")
+            chart.stats = ("framesFromClient", "bytesFromClient")
+            self.add_child(chart)
 
-        def render_received_chart_url(self, session, client):
-            return "client.png?id=%i;s=framesToClient;s=bytesToClient" \
-                   % client.id
+            chart = StatValueChart(app, "received")
+            chart.stats = ("framesToClient", "bytesToClient")
+            self.add_child(chart)
 
+        def get_title(self, session, client):
+            return "History"
+
 class ClientSessionSet(CuminTable):
     def __init__(self, app, name):
         super(ClientSessionSet, self).__init__(app, name)
@@ -313,11 +316,3 @@
         self.add_parameter(self.clients)
 
         self.set_list_parameter(self.clients)
-    
-class ClientChartPage(CuminChartPage):
-    def __init__(self, app, name):
-        super(ClientChartPage, self).__init__(app, name)
-
-        self.client = ClientParameter(app, "id")
-        self.add_parameter(self.client)
-        self.set_object_parameter(self.client)

Modified: mgmt/cumin/python/cumin/client.strings
===================================================================
--- mgmt/cumin/python/cumin/client.strings	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/client.strings	2008-01-04 15:50:25 UTC (rev 1533)
@@ -70,7 +70,7 @@
   </table>
 </div>
 <script>
-  cumin.client.listeners["{id}"] = updateClientStatus, 3000;
+  cumin.listeners["{id}"] = updateClientStatus, 3000;
 </script>
 
 [ClientView.javascript]
@@ -83,8 +83,8 @@
         break;
     }
 
-    for (var id in cumin.client.listeners) {
-        cumin.client.listeners[id](id, client);
+    for (var id in cumin.listeners) {
+        cumin.listeners[id](id, client);
     }
 }
 
@@ -126,26 +126,14 @@
     </td>
   </tr>
 </table>
-<script>
-  cumin.client.listeners["{id}.general"] = updateStats;
-</script>
 
 [StatisticsHistory.html]
 <h2>Sent</h2>
-<div class="iblock chart">
-  <img id="{id}.sent" src="{sent_chart_url}"/>
-</div>
+<div class="iblock chart">{sent}</div>
 
 <h2>Received</h2>
-<div class="iblock chart">
-  <img id="{id}.received" src="{received_chart_url}"/>
-</div>
+<div class="iblock chart">{received}</div>
 
-<script>
-  cumin.client.listeners["{id}.sent"] = updateImage
-  cumin.client.listeners["{id}.received"] = updateImage
-</script>
-
 [ClientSessionSet.html]
 <div class="rfloat">{page}</div>
 

Modified: mgmt/cumin/python/cumin/exchange.py
===================================================================
--- mgmt/cumin/python/cumin/exchange.py	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/exchange.py	2008-01-04 15:50:25 UTC (rev 1533)
@@ -347,7 +347,8 @@
 
     class StatisticsCurrent(Widget):
         def __init__(self, app, name):
-            super(ExchangeStatistics.StatisticsCurrent, self).__init__(app, name)
+            super(ExchangeStatistics.StatisticsCurrent, self).__init__ \
+                (app, name)
 
             self.add_child(StatSet(app, "general", "general"))
 
@@ -355,19 +356,25 @@
             return "Current"
 
     class StatisticsHistory(Widget):
-        def get_title(self, session, queue):
-            return "History"
+        def __init__(self, app, name):
+            super(ExchangeStatistics.StatisticsHistory, self).__init__ \
+                (app, name)
 
-        def render_received_chart_url(self, session, queue):
-            return "exchange.png?id=%i;s=msgReceives;s=byteReceives" % queue.id
+            chart = StatValueChart(app, "received")
+            chart.stats = ("msgReceives", "byteReceives")
+            self.add_child(chart)
 
-        def render_dropped_chart_url(self, session, queue):
-            return "exchange.png?id=%i;s=msgDrops;s=byteDrops" % queue.id
+            chart = StatValueChart(app, "routed")
+            chart.stats = ("msgRoutes", "byteRoutes")
+            self.add_child(chart)
 
-        def render_routed_chart_url(self, session, queue):
-            return "exchange.png?id=%i;s=msgRoutes;s=byteRoutes" \
-                   % queue.id
+            chart = StatValueChart(app, "dropped")
+            chart.stats = ("msgDrops", "byteDrops")
+            self.add_child(chart)
 
+        def get_title(self, session, queue):
+            return "History"
+
 class ExchangeProducerSet(ItemSet):
     def get_title(self, session, exchange):
         return "Producers %s" % \
@@ -407,11 +414,3 @@
         self.add_parameter(self.exchanges)
 
         self.set_list_parameter(self.exchanges)
-    
-class ExchangeChartPage(CuminChartPage):
-    def __init__(self, app, name):
-        super(ExchangeChartPage, self).__init__(app, name)
-
-        self.param = ExchangeParameter(app, "id")
-        self.add_parameter(self.param)
-        self.set_object_parameter(self.param)

Modified: mgmt/cumin/python/cumin/exchange.strings
===================================================================
--- mgmt/cumin/python/cumin/exchange.strings	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/exchange.strings	2008-01-04 15:50:25 UTC (rev 1533)
@@ -133,7 +133,7 @@
   </table>
 </div>
 <script>
-  cumin.exchange.listeners["{id}"] = updateExchangeStatus
+  cumin.listeners["{id}"] = updateExchangeStatus
 </script>
 
 [ExchangeView.javascript]
@@ -143,10 +143,11 @@
 
     for (var key in exchanges) {
         exchange = exchanges[key];
+        break;
     }
 
-    for (var id in cumin.exchange.listeners) {
-        cumin.exchange.listeners[id](id, exchange);
+    for (var id in cumin.listeners) {
+        cumin.listeners[id](id, exchange);
     }
 }
 
@@ -205,32 +206,17 @@
     </td>
   </tr>
 </table>
-<script>
-  cumin.exchange.listeners["{id}.general"] = updateStats;
-</script>
 
 [StatisticsHistory.html]
 <h2>Received</h2>
-<div class="iblock chart">
-  <img id="{id}.received" src="{received_chart_url}"/>
-</div>
+<div class="iblock chart">{received}</div>
 
 <h2>Routed</h2>
-<div class="iblock chart">
-  <img id="{id}.routed" src="{routed_chart_url}"/>
-</div>
+<div class="iblock chart">{routed}</div>
 
 <h2>Dropped</h2>
-<div class="iblock chart">
-  <img id="{id}.dropped" src="{dropped_chart_url}"/>
-</div>
+<div class="iblock chart">{dropped}</div>
 
-<script>
-  cumin.exchange.listeners["{id}.received"] = updateImage
-  cumin.exchange.listeners["{id}.routed"] = updateImage
-  cumin.exchange.listeners["{id}.dropped"] = updateImage
-</script>
-
 [ExchangeProducerSet.html]
 <div class="sactions">
   <h2>Act on Selected Producers:</h2>

Modified: mgmt/cumin/python/cumin/model.py
===================================================================
--- mgmt/cumin/python/cumin/model.py	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/model.py	2008-01-04 15:50:25 UTC (rev 1533)
@@ -10,7 +10,7 @@
     def __init__(self):
         self.data = MintModel()
 
-        self.classes = dict()
+        self.classes = list()
         
         self.queue = CuminQueue(self)
         self.exchange = CuminExchange(self)
@@ -19,11 +19,22 @@
         self.session = CuminSession(self)
         
     def add_class(self, cls):
-        self.classes[cls.mint_class] = cls
+        self.classes.append(cls)
 
+    # XXX get rid of this
     def get_class(self, mint_object):
-        return self.classes[mint_object.__class__]
+        return self.get_class_by_object(mint_object)
 
+    def get_class_by_object(self, mint_object):
+        for cls in self.classes:
+            if cls.mint_class is mint_object.__class__:
+                return cls
+
+    def get_class_by_name(self, name):
+        for cls in self.classes:
+            if cls.name == name:
+                return cls
+
 class CuminClass(object):
     def __init__(self, model, name, mint_class):
         self.model = model

Modified: mgmt/cumin/python/cumin/page.strings
===================================================================
--- mgmt/cumin/python/cumin/page.strings	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/page.strings	2008-01-04 15:50:25 UTC (rev 1533)
@@ -573,33 +573,10 @@
     cumin = new Cumin();
 
     function Cumin() {
-        this.queue = new Object();
-        this.queue.listeners = new Object();
-
-        this.exchange = new Object();
-        this.exchange.listeners = new Object();
-
-        this.client = new Object();
-        this.client.listeners = new Object();
+        this.listeners = new Object();
     }
 }())
 
-function updateImage(id, object) {
-    var img = wooly.doc().elembyid(id);
-    
-    var src = img.getattr("src");
-    var sep = src.lastIndexOf(";");
-    var time = new Date().getTime();
-
-    if (isNaN(parseInt(src.substring(sep + 1)))) {
-        src = src + ";" + time;
-    } else {
-        src = src.substring(0, sep) + ";" + time;
-    }
-
-    img.setattr("src", src);
-}
-
 [CuminPage.html]
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

Modified: mgmt/cumin/python/cumin/parameters.py
===================================================================
--- mgmt/cumin/python/cumin/parameters.py	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/parameters.py	2008-01-04 15:50:25 UTC (rev 1533)
@@ -1,6 +1,13 @@
 from wooly import *
 from mint import *
 
+class CuminClassParameter(Parameter):
+    def do_unmarshal(self, string):
+        return self.app.model.get_class_by_name(string)
+
+    def do_marshal(self, cls):
+        return cls.name
+
 class BrokerClusterParameter(Parameter):
     def do_unmarshal(self, string):
         return BrokerCluster.get(int(string))

Modified: mgmt/cumin/python/cumin/queue.py
===================================================================
--- mgmt/cumin/python/cumin/queue.py	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/queue.py	2008-01-04 15:50:25 UTC (rev 1533)
@@ -541,19 +541,24 @@
             return "Current"
 
     class StatisticsHistory(Widget):
-        def get_title(self, session, queue):
-            return "History"
+        def __init__(self, app, name):
+            super(QueueStatistics.StatisticsHistory, self).__init__(app, name)
 
-        def render_depth_chart_url(self, session, queue):
-            return "queue.png?id=%i;s=msgDepth;s=byteDepth" % queue.id
+            chart = StatValueChart(app, "depth")
+            chart.stats = ("msgDepth", "byteDepth")
+            self.add_child(chart)
 
-        def render_consumers_chart_url(self, session, queue):
-            return "queue.png?id=%i;s=consumers" % queue.id
+            chart = StatValueChart(app, "consumers")
+            chart.stats = ("consumers",)
+            self.add_child(chart)
 
-        def render_transactions_chart_url(self, session, queue):
-            return "queue.png?id=%i;s=enqueueTxnCount;s=dequeueTxnCount" \
-                   % queue.id
+            chart = StatValueChart(app, "transactions")
+            chart.stats = ("enqueueTxnCount", "dequeueTxnCount")
+            self.add_child(chart)
 
+        def get_title(self, session, queue):
+            return "History"
+
 class QueueConsumerSet(PaginatedItemSet):
     def get_title(self, session, queue):
         return "Consumers %s" % fmt_count(self.get_item_count(session, queue))
@@ -599,11 +604,3 @@
         self.add_parameter(self.queues)
         
         self.set_list_parameter(self.queues)
-
-class QueueChartPage(CuminChartPage):
-    def __init__(self, app, name):
-        super(QueueChartPage, self).__init__(app, name)
-
-        self.queue = QueueParameter(app, "id")
-        self.add_parameter(self.queue)
-        self.set_object_parameter(self.queue)

Modified: mgmt/cumin/python/cumin/queue.strings
===================================================================
--- mgmt/cumin/python/cumin/queue.strings	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/queue.strings	2008-01-04 15:50:25 UTC (rev 1533)
@@ -133,7 +133,7 @@
   </table>
 </div>
 <script>
-  cumin.queue.listeners["{id}"] = updateQueueStatus
+  cumin.listeners["{id}"] = updateQueueStatus
 </script>
 
 [QueueView.javascript]
@@ -146,8 +146,8 @@
         break;
     }
 
-    for (var id in cumin.queue.listeners) {
-        cumin.queue.listeners[id](id, queue);
+    for (var id in cumin.listeners) {
+        cumin.listeners[id](id, queue);
     }
 
     //throw new Error();
@@ -251,35 +251,17 @@
     </td>
   </tr>
 </table>
-<script>
-  cumin.queue.listeners["{id}.general"] = updateStats;
-  cumin.queue.listeners["{id}.persistent"] = updateStats;
-  cumin.queue.listeners["{id}.transactional"] = updateStats;
-  cumin.queue.listeners["{id}.transaction"] = updateStats;
-</script>
 
 [StatisticsHistory.html]
 <h2>Depth</h2>
-<div class="iblock chart">
-  <img id="{id}.depth" src="{depth_chart_url}"/>
-</div>
+<div class="iblock chart">{depth}</div>
 
 <h2>Consumers</h2>
-<div class="iblock chart">
-  <img id="{id}.consumers" src="{consumers_chart_url}"/>
-</div>
+<div class="iblock chart">{consumers}</div>
 
 <h2>Transactions</h2>
-<div class="iblock chart">
-  <img id="{id}.transactions" src="{transactions_chart_url}"/>
-</div>
+<div class="iblock chart">{transactions}</div>
 
-<script>
-  cumin.queue.listeners["{id}.depth"] = updateImage
-  cumin.queue.listeners["{id}.consumers"] = updateImage
-  cumin.queue.listeners["{id}.transactions"] = updateImage
-</script>
-
 [QueueConsumerSet.html]
 <div class="sactions">
   <h2>Act on Selected Consumers:</h2>

Modified: mgmt/cumin/python/cumin/stat.py
===================================================================
--- mgmt/cumin/python/cumin/stat.py	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/stat.py	2008-01-04 15:50:25 UTC (rev 1533)
@@ -65,3 +65,88 @@
     def render_item_average(self, session, args):
         stat, object = args
         return None #XXX "%0.2f" % (sum(stat.values) / float(len(stat.values)))
+
+class StatValueChart(Widget):
+    def __init__(self, app, name):
+        super(StatValueChart, self).__init__(app, name)
+
+        self.stats = ()
+
+    def render_href(self, session, object):
+        params = list()
+
+        cls = self.app.model.get_class_by_object(object).name
+        params.append("class=%s" % cls)
+
+        params.append("id=%i" % object.id)
+
+        for stat in self.stats:
+            params.append("stat=%s" % stat)
+
+        return "stats.png?" + ";".join(params)
+
+class StatChartPage(Page):
+    def __init__(self, app, name):
+        super(StatChartPage, self).__init__(app, name)
+
+        self.class_ = CuminClassParameter(app, "class")
+        self.add_parameter(self.class_)
+
+        self.id = IntegerParameter(app, "id")
+        self.add_parameter(self.id)
+
+        param = Parameter(app, "param")
+        self.add_parameter(param)
+
+        self.stats = ListParameter(app, "stat", param)
+        self.add_parameter(self.stats)
+
+        self.mode = Parameter(app, "mode")
+        self.add_parameter(self.mode)
+
+    def get_object(self, session, object):
+        cls = self.class_.get(session).mint_class
+        id = self.id.get(session)
+        return cls.get(id)
+
+    def get_content_type(self, session):
+        return "image/png"
+
+    def do_render(self, session, object):
+        chart = LineChart(600, 120)
+
+        cls = self.class_.get(session)
+        stats = [cls.get_stat(x) for x in self.stats.get(session)]
+
+        samples = dict()
+        times = dict()
+        values = dict()
+
+        for stat in stats:
+            samples[stat] = stat.samples(object)
+            values[stat] = [x[1] for x in samples[stat]]
+
+        max_value = 0
+
+        for stat in stats:
+            vals = values[stat]
+            if vals:
+                max_value = max(max(vals), max_value)
+
+        max_value = max_value * 1.1
+        max_value = max_value + (10 - max_value % 10)
+        chart.set_max_value(int(max_value))
+
+        chart.plot_x_axis()
+        chart.plot_y_axis()
+
+        colors = ((1,0,0), (0,0,1), (0,1,0))
+
+        for stat, color in zip(stats, colors):
+            chart.plot_values(samples[stat], color=color)
+        
+        chart.plot_frame()
+
+        writer = Writer()
+        chart.write(writer)
+        return writer.to_string()

Modified: mgmt/cumin/python/cumin/stat.strings
===================================================================
--- mgmt/cumin/python/cumin/stat.strings	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/stat.strings	2008-01-04 15:50:25 UTC (rev 1533)
@@ -51,6 +51,9 @@
 
   {items}
 </table>
+<script>
+  cumin.listeners["{id}"] = updateStats;
+</script>
 
 [StatSet.item_html]
 <tr stat="{item_name}">
@@ -58,3 +61,26 @@
   <td class="ralign"> {item_value}</td>
   <td class="ralign"> {item_extra}</td>
 </tr>
+
+[StatValueChart.javascript]
+function updateChartImage(id, object) {
+    var img = wooly.doc().elembyid(id);
+    
+    var src = img.getattr("src");
+    var sep = src.lastIndexOf(";");
+    var time = new Date().getTime();
+
+    if (isNaN(parseInt(src.substring(sep + 1)))) {
+        src = src + ";" + time;
+    } else {
+        src = src.substring(0, sep) + ";" + time;
+    }
+
+    img.setattr("src", src);
+}
+
+[StatValueChart.html]
+<img id="{id}" src="{href}" height="140" width="660"/>
+<script>
+  cumin.listeners["{id}"] = updateChartImage
+</script>

Modified: mgmt/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/cumin/python/cumin/widgets.py	2008-01-03 17:46:34 UTC (rev 1532)
+++ mgmt/cumin/python/cumin/widgets.py	2008-01-04 15:50:25 UTC (rev 1533)
@@ -162,69 +162,6 @@
                (error_count, ess(error_count),
                 warning_count, ess(warning_count))
 
-class CuminChartPage(Page):
-    def __init__(self, app, name):
-        super(CuminChartPage, self).__init__(app, name)
-
-        self.__param = None
-
-        param = Parameter(app, "param")
-        self.add_parameter(param)
-
-        self.stats = ListParameter(app, "s", param)
-        self.add_parameter(self.stats)
-
-        self.mode = Parameter(app, "m")
-        self.add_parameter(self.mode)
-
-    def set_object_parameter(self, param):
-        self.__param = param
-
-    def get_object(self, session, object):
-        return self.__param.get(session)
-
-    def get_content_type(self, session):
-        return "image/png"
-
-    def do_render(self, session, object):
-        chart = LineChart(600, 120)
-
-        cls = self.app.model.get_class(object)
-        stats = [cls.get_stat(x) for x in self.stats.get(session)]
-
-        samples = dict()
-        times = dict()
-        values = dict()
-
-        for stat in stats:
-            samples[stat] = stat.samples(object)
-            values[stat] = [x[1] for x in samples[stat]]
-
-        max_value = 0
-
-        for stat in stats:
-            vals = values[stat]
-            if vals:
-                max_value = max(max(vals), max_value)
-
-        max_value = max_value * 1.1
-        max_value = max_value + (10 - max_value % 10)
-        chart.set_max_value(int(max_value))
-
-        chart.plot_x_axis()
-        chart.plot_y_axis()
-
-        colors = ((1,0,0), (0,0,1), (0,1,0))
-
-        for stat, color in zip(stats, colors):
-            chart.plot_values(samples[stat], color=color)
-        
-        chart.plot_frame()
-
-        writer = Writer()
-        chart.write(writer)
-        return writer.to_string()
-
 class CuminXmlPage(Page):
     def __init__(self, app, name):
         super(CuminXmlPage, self).__init__(app, name)




More information about the rhmessaging-commits mailing list