def __repr__(self):
return "<%s>" % self.__class__.__name__
+ def __lt__(self, other):
+ return self.id < other.id
+
@property
def collecty(self):
return self.plugin.collecty
self.object_id = object_id
# Get the main object
- self.object = self.get_object(self.object_id)
+ self.objects = self.get_objects(self.object_id)
+ self.objects.sort()
def __repr__(self):
return "<%s>" % self.__class__.__name__
def log(self):
return self.plugin.log
+ @property
+ def object(self):
+ """
+ Shortcut to the main object
+ """
+ if len(self.objects) == 1:
+ return self.objects[0]
+
def _make_command_line(self, interval, format=DEFAULT_IMAGE_FORMAT,
width=None, height=None, with_title=True, thumbnail=False):
args = [e for e in GRAPH_DEFAULT_ARGUMENTS]
return args
+ def _add_defs(self):
+ use_prefix = len(self.objects) >= 2
+
+ args = []
+ for object in self.objects:
+ if use_prefix:
+ args += object.make_rrd_defs(object.id)
+ else:
+ args += object.make_rrd_defs()
+
+ return args
+
def _add_vdefs(self, args):
ret = []
return ret
- def get_object(self, *args, **kwargs):
- return self.plugin.get_object(*args, **kwargs)
+ def get_objects(self, *args, **kwargs):
+ object = self.plugin.get_object(*args, **kwargs)
- def get_object_table(self):
- return {
- "file" : self.object,
- }
-
- @property
- def object_table(self):
- if not hasattr(self, "_object_table"):
- self._object_table = self.get_object_table()
-
- return self._object_table
+ return [object,]
def generate_graph(self, interval=None, **kwargs):
+ assert self.objects, "Cannot render graph without any objects"
+
# Make sure that all collected data is in the database
# to get a recent graph image
- if self.object:
- self.object.commit()
+ for object in self.objects:
+ object.commit()
args = self._make_command_line(interval, **kwargs)
self.log.info(_("Generating graph %s") % self)
- if self.object:
- args += self.object.make_rrd_defs()
+ # Add DEFs for all objects
+ args += self._add_defs()
args += self.rrd_graph
args = self._add_vdefs(args)
lower_limit = 0
+ def get_objects(self, *args, **kwargs):
+ return list(self.plugin.objects)
+
@property
def graph_title(self):
_ = self.locale.translate
_ = self.locale.translate
return "%s [%s]" % (_("Frequency"), _("Hz"))
- def get_object_table(self):
- objects_table = {}
-
- for processor in self.plugin.objects:
- objects_table[processor.id] = processor
-
- return objects_table
-
- core_colours = {
- "cpu0" : "#ff000066",
- "cpu1" : "#00ff0066",
- "cpu2" : "#0000ff66",
- "cpu3" : "#ffff0066",
- }
+ processor_colours = [
+ "#ff000066",
+ "#00ff0066",
+ "#0000ff66",
+ "#ffff0066",
+ ]
@property
def rrd_graph(self):
rrd_graph = []
- for core, processor in sorted(self.object_table.items()):
- i = {
- "core" : core,
- "colour" : self.core_colours.get(core, "#000000"),
- "name" : processor.name,
- }
-
- core_graph = [
- "DEF:current_%(core)s=%%(%(core)s)s:current:AVERAGE",
- "DEF:minimum_%(core)s=%%(%(core)s)s:minimum:AVERAGE",
- "DEF:maximum_%(core)s=%%(%(core)s)s:maximum:AVERAGE",
-
- "VDEF:avg_%(core)s=current_%(core)s,AVERAGE",
-
- "LINE2:current_%(core)s%(colour)s:%(name)-10s",
- "GPRINT:avg_%(core)s:%%6.2lf %%sHz\l",
+ for processor, colour in zip(self.objects, self.processor_colours):
+ rrd_graph += processor.make_rrd_defs(processor.id) + [
+ "LINE2:%s%s:%-10s" % (processor.id, colour, processor.name),
+ "GPRINT:%s:%%6.2lf %%sHz" % processor.id,
]
- rrd_graph += [line % i for line in core_graph]
-
return rrd_graph
rrd_graph_args = [
class GraphTemplateSensorsProcessorTemperature(base.GraphTemplate):
name = "processor-temperature"
- core_colours = {
- "core0" : "#ff000033",
- "core1" : "#0000ff33",
- "core2" : "#00ff0033",
- "core3" : "#0000ff33",
- }
+ core_colours = [
+ "#ff000033",
+ "#0000ff33",
+ "#00ff0033",
+ "#0000ff33",
+ ]
def get_temperature_sensors(self):
return self.plugin.get_detected_sensor_objects("coretemp-*")
- def get_object_table(self):
- objects_table = {}
+ def get_objects(self, *args, **kwargs):
+ sensors = self.get_temperature_sensors()
- counter = 0
- for object in self.get_temperature_sensors():
- objects_table["core%s" % counter] = object
- counter += 1
-
- return objects_table
+ return list(sensors)
@property
def rrd_graph(self):
_ = self.locale.translate
rrd_graph = []
- cores = sorted(self.object_table.keys())
-
- for core in cores:
- i = {
- "core" : core,
- }
+ counter = 0
+ ids = []
- core_graph = [
- "DEF:value_kelvin_%(core)s=%%(%(core)s)s:value:AVERAGE",
- "DEF:critical_kelvin_%(core)s=%%(%(core)s)s:critical:AVERAGE",
- "DEF:high_kelvin_%(core)s=%%(%(core)s)s:high:AVERAGE",
+ for core in self.objects:
+ id = "core%s" % counter
+ ids.append(id)
+ counter += 1
+ rrd_graph += core.make_rrd_defs(id) + [
# Convert everything to celsius
- "CDEF:value_%(core)s=value_kelvin_%(core)s,273.15,-",
- "CDEF:critical_%(core)s=critical_kelvin_%(core)s,273.15,-",
- "CDEF:high_%(core)s=high_kelvin_%(core)s,273.15,-",
+ "CDEF:%s_value_c=%s_value,273.15,-" % (id, id),
+ "CDEF:%s_critical_c=%s_critical,273.15,-" % (id, id),
+ "CDEF:%s_high_c=%s_high,273.15,-" % (id, id),
]
- rrd_graph += [line % i for line in core_graph]
-
- all_core_values = ("value_%s" % c for c in cores)
- all_core_highs = ("high_%s" % c for c in cores)
+ all_core_values = ("%s_value_c" % id for id in ids)
+ all_core_highs = ("%s_high_c" % id for id in ids)
rrd_graph += [
# Compute the temperature of the processor
# by taking the average of all cores
- "CDEF:value=%s,%s,AVG" % (",".join(all_core_values), len(cores)),
- "CDEF:high=%s,MIN" % ",".join(all_core_highs),
+ "CDEF:all_value_c=%s,%s,AVG" % (",".join(all_core_values), len(ids)),
+ "CDEF:all_high_c=%s,MIN" % ",".join(all_core_highs),
# Change colour when the value gets above high
- "CDEF:value_high=value,high,GT,value,UNKN,IF",
- "CDEF:value_normal=value,high,GT,UNKN,value,IF",
+ "CDEF:all_value_c_high=all_value_c,all_high_c,GT,all_value_c,UNKN,IF",
+ "CDEF:all_value_c_normal=all_value_c,all_high_c,GT,UNKN,all_value_c,IF",
- "LINE3:value_high#FF0000",
- "LINE3:value_normal#000000:%-15s\l" % _("Temperature"),
+ "LINE3:all_value_c_high#FF0000",
+ "LINE3:all_value_c_normal#000000:%-15s\l" % _("Temperature"),
- "GPRINT:value_avg: %-15s %%6.2lf °C\l" % _("Average"),
- "GPRINT:value_max: %-15s %%6.2lf °C\l" % _("Maximum"),
- "GPRINT:value_min: %-15s %%6.2lf °C\l" % _("Minimum"),
+ "GPRINT:all_value_c_avg: %-15s %%6.2lf °C\l" % _("Average"),
+ "GPRINT:all_value_c_max: %-15s %%6.2lf °C\l" % _("Maximum"),
+ "GPRINT:all_value_c_min: %-15s %%6.2lf °C\l" % _("Minimum"),
]
- for core in cores:
- object = self.object_table.get(core)
-
- i = {
- "colour" : self.core_colours.get(core, "#000000"),
- "core" : core,
- "label" : object.sensor.label,
- }
-
- core_graph = [
+ for id, core, colour in zip(ids, self.objects, self.core_colours):
+ rrd_graph += [
# TODO these lines were supposed to be dashed, but that
# didn't really work here
- "LINE2:value_%(core)s%(colour)s:%(label)-10s",
+ "LINE2:%s_value_c%s:%-10s" % (id, colour, core.sensor.label),
]
- rrd_graph += [line % i for line in core_graph]
-
# Draw the critical line
- rrd_graph += [
- "VDEF:critical_line=critical_core0,MINIMUM",
- "HRULE:critical_line#000000:%-15s" % _("Critical"),
- "GPRINT:critical_line:%%6.2lf °C\\r",
- ]
+ for id in ids:
+ rrd_graph += [
+ "HRULE:%s_critical_c_min#000000:%-15s" % (id, _("Critical")),
+ "GPRINT:%s_critical_c_min:%%6.2lf °C\\r",
+ ]
+ break
return rrd_graph