###############################################################################
import datetime
-import collecty.client
import mimetypes
import tornado.web
def menu(self):
_ = self.locale.translate
- m = ui.menu.Menu(self, _("Analytics"))
+ m = ui.menus.Menu(self, _("Analytics"))
# Overview
m.add_handler(AnalyticsOverviewHandler)
- m.add_divider()
+
+ # Network
+ m.add_handler(AnalyticsNetworkOverviewHandler)
# System
m.add_handler(AnalyticsSystemOverviewHandler)
return m
+ def render_graphs(self, graphs):
+ self.render("graphs.html", graphs=graphs)
+
class AnalyticsOverviewHandler(AnalyticsBaseHandler):
url = r"/analytics"
self.render("base.html")
+class AnalyticsNetworkBaseHandler(AnalyticsBaseHandler):
+ @property
+ def menu(self):
+ _ = self.locale.translate
+
+ m = ui.menus.Menu(self, _("Network"))
+
+ # Back...
+ m.add_handler(AnalyticsOverviewHandler, title=_("Back..."))
+
+ # Overview
+ m.add_handler(AnalyticsNetworkOverviewHandler, title=_("Overview"))
+
+ # Connections
+ m.add_handler(AnalyticsNetworkConnectionsHandler)
+
+ # Fragmentation
+ m.add_handler(AnalyticsNetworkIPFragmentationHandler)
+
+ return m
+
+
+class AnalyticsNetworkOverviewHandler(AnalyticsNetworkBaseHandler):
+ url = r"/analytics/network"
+ title = N_("Network")
+
+ def get(self):
+ self.render("base.html")
+
+
+class AnalyticsNetworkConnectionsHandler(AnalyticsNetworkBaseHandler):
+ url = r"/analytics/connections"
+ title = N_("Connections")
+
+ def get(self):
+ _ = self.locale.translate
+
+ graphs = [
+ ui.graphs.Graph(self, "conntrack"),
+ ]
+
+ self.render_graphs(graphs)
+
+
+class AnalyticsNetworkIPFragmentationHandler(AnalyticsNetworkBaseHandler):
+ url = r"/analytics/network/fragmentation"
+ title = N_("Fragmentation")
+
+ def initialize(self):
+ _ = self.locale.translate
+
+ for proto, title in (("ipv6", _("IPv6")), ("ipv4", _("IPv4"))):
+ tab = self.tabs.add_tab(proto, title=title)
+
+ tab.add_graph("%s-fragmentation" % proto)
+
+
class AnalyticsSystemBaseHandler(AnalyticsBaseHandler):
@property
def menu(self):
_ = self.locale.translate
- m = ui.menu.Menu(self, _("System"))
+ m = ui.menus.Menu(self, _("System"))
# Back...
m.add_handler(AnalyticsOverviewHandler, title=_("Back..."))
- m.add_divider()
# Overview
m.add_handler(AnalyticsSystemOverviewHandler, title=_("Overview"))
- m.add_divider()
- # Others
+ # Most interesting items
m.add_handler(AnalyticsSystemProcessorsHandler)
m.add_handler(AnalyticsSystemMemoryHandler)
+ m.add_handler(AnalyticsSystemTemperaturesHandler)
+
+ # Others
+ s = m.add_menu(_("More"))
+ s.add_handler(AnalyticsSystemContextSwitchesHandler)
+ s.add_handler(AnalyticsSystemInterruptsHandler)
return m
url = r"/analytics/system"
title = N_("System")
+ def initialize(self):
+ _ = self.locale.translate
+
+ tab = self.tabs.add_tab("loadavg", _("Load Average"))
+ tab.add_graph("loadavg")
+
class AnalyticsSystemProcessorsHandler(AnalyticsSystemBaseHandler):
url = r"/analytics/system/processors"
title = N_("Processors")
+ def initialize(self):
+ _ = self.locale.translate
+
+ tab = self.tabs.add_tab("usage", _("Usage"))
+ tab.add_graph("processor")
+
+ tab = self.tabs.add_tab("frequency", _("Frequency"))
+ tab.add_graph("cpufreq")
+
+ tab = self.tabs.add_tab("temperature", _("Temperature"))
+ tab.add_graph("processor-temperature")
+
class AnalyticsSystemMemoryHandler(AnalyticsSystemBaseHandler):
url = r"/analytics/system/memory"
title = N_("Memory")
+ def initialize(self):
+ _ = self.locale.translate
+
+ tab = self.tabs.add_tab("usage", _("Usage"))
+ tab.add_graph("memory")
+
+
+class AnalyticsSystemTemperaturesHandler(AnalyticsSystemBaseHandler):
+ url = r"/analytics/system/temperatures"
+ title = N_("Temperatures")
+
+ def get(self):
+ _ = self.locale.translate
+
+ graphs = [
+ ui.graphs.Graph(self, "sensors-temperature"),
+ ui.graphs.Graph(self, "processor-temperature"),
+ ]
+
+ self.render_graphs(graphs)
+
+
+class AnalyticsSystemContextSwitchesHandler(AnalyticsSystemBaseHandler):
+ url = r"/analytics/system/context-switches"
+ title = N_("Context Switches")
+
+ def get(self):
+ _ = self.locale.translate
+
+ graphs = [
+ ui.graphs.Graph(self, "context-switches"),
+ ]
+
+ self.render_graphs(graphs)
+
+
+class AnalyticsSystemInterruptsHandler(AnalyticsSystemBaseHandler):
+ url = r"/analytics/system/interrupts"
+ title = N_("Interrupts")
+
+ def get(self):
+ _ = self.locale.translate
+
+ graphs = [
+ ui.graphs.Graph(self, "interrupts"),
+ ]
+
+ self.render_graphs(graphs)
+
class GraphExportHandler(base.BaseHandler):
VALID_INTERVALS = ("hour", "day", "month", "week", "year")
SUPPORTED_FORMATS = ("pdf", "png", "svg")
- url = r"/graph/([\w\-]+)(?:/([\w\d]+))?.(%s)" % "|".join(SUPPORTED_FORMATS)
+ url = r"/graph(/thumbnail)?/([\w\-]+)(?:/([\w\d\.]+))?\.(%s)" % "|".join(SUPPORTED_FORMATS)
+
+ def get(self, thumbnail, template_name, object_id, format):
+ _ = self.locale.translate
- def get(self, template_name, object_id, format):
# Get the requested dimensions of the image
height = self.get_argument_int("height", None)
width = self.get_argument_int("width", None)
if interval and not interval in self.VALID_INTERVALS:
raise tornado.web.HTTPError(400, _("Invalid interval: %s") % interval)
+ # Create the graph object
+ g = ui.graphs.Graph(self, template_name, object_id=object_id)
+
# Generate the graph image
- g = self.backend.graphs.generate_graph(template_name, object_id=object_id,
- format=format.upper(), height=height, width=width, interval=interval)
+ kwargs = {
+ "format" : format.upper(),
+ "interval" : interval,
+ "height" : height,
+ "width" : width,
+ "thumbnail" : bool(thumbnail),
+
+ # Include the title in the PDF exports
+ "with_title" : format == "pdf",
+ }
+ image = g.generate_graph(**kwargs)
# Set the HTTP headers
self._make_headers(format, template_name, object_id)
# Deliver the content
- self.finish(g)
+ self.finish(image.get("image"))
def _make_headers(self, extension, template_name, object_id):
# Determine the mime type
self.set_header("Content-Disposition", "attachment; filename=%s" % filename)
else:
self.set_header("Content-Disposition", "inline; filename=%s" % filename)
+
+
+class GraphHandler(base.BaseHandler):
+ url = r"/graph/([\w\-]+)(?:/([\w\d\.]+))?"
+
+ def get(self, template, object_id):
+ graph = ui.graphs.Graph(self, template, object_id=object_id)
+
+ self.render("graph.html", graph=graph)