]>
git.ipfire.org Git - collecty.git/blob - src/collecty/plugins/cpufreq.py
2 ###############################################################################
4 # collecty - A system statistics collection daemon for IPFire #
5 # Copyright (C) 2015 IPFire development team #
7 # This program 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. #
12 # This program 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. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 ###############################################################################
29 class GraphTemplateCPUFreq(base
.GraphTemplate
):
35 def graph_title(self
):
36 _
= self
.locale
.translate
40 def graph_vertical_label(self
):
41 _
= self
.locale
.translate
42 return "%s [%s]" % (_("Frequency"), _("Hz"))
44 def get_object_table(self
):
47 for processor
in self
.plugin
.objects
:
48 objects_table
[processor
.id] = processor
63 for core
, processor
in sorted(self
.object_table
.items()):
66 "colour" : self
.core_colours
.get(core
, "#000000"),
67 "name" : processor
.name
,
71 "DEF:current_%(core)s=%%(%(core)s)s:current:AVERAGE",
72 "DEF:minimum_%(core)s=%%(%(core)s)s:minimum:AVERAGE",
73 "DEF:maximum_%(core)s=%%(%(core)s)s:maximum:AVERAGE",
75 "VDEF:avg_%(core)s=current_%(core)s,AVERAGE",
77 "LINE2:current_%(core)s%(colour)s:%(name)-10s",
78 "GPRINT:avg_%(core)s:%%6.2lf %%sHz\l",
81 rrd_graph
+= [line
% i
for line
in core_graph
]
86 "--base", "1000", # Hz
90 class CPUFreqObject(base
.Object
):
92 "DS:current:GAUGE:0:U",
93 "DS:minimum:GAUGE:0:U",
94 "DS:maximum:GAUGE:0:U",
98 return "<%s %s>" % (self
.__class
__.__name
__, self
.cpuid
)
100 def init(self
, cpuid
):
103 self
.sys_path
= os
.path
.join("/sys/devices/system/cpu", self
.cpuid
)
107 return "Core %s" % self
.core_id
115 return self
.read_file("topology/core_id")
117 def is_cpufreq_supported(self
):
118 path
= os
.path
.join(self
.sys_path
, "cpufreq")
120 return os
.path
.exists(path
)
124 self
.read_frequency("cpufreq/cpuinfo_cur_freq"),
125 self
.read_frequency("cpufreq/cpuinfo_min_freq"),
126 self
.read_frequency("cpufreq/cpuinfo_max_freq"),
129 def read_file(self
, filename
):
130 file = os
.path
.join(self
.sys_path
, filename
)
132 with
open(file, "r") as f
:
133 return f
.read().strip()
135 def read_frequency(self
, filename
):
136 val
= self
.read_file(filename
)
138 # Convert from kHz to Hz
139 return int(val
) * 1000
142 class CPUFreqPlugin(base
.Plugin
):
144 description
= "cpufreq Plugin"
146 templates
= [GraphTemplateCPUFreq
]
148 cpuid_pattern
= re
.compile(r
"cpu[0-9]+")
154 for cpuid
in os
.listdir("/sys/devices/system/cpu"):
155 if not self
.cpuid_pattern
.match(cpuid
):
158 o
= CPUFreqObject(self
, cpuid
)
160 # If we have already seen a virtual core of the processor,
161 # we will skip any others.
162 if o
.core_id
in core_ids
:
165 # Check if this processor is supported by cpufreq
166 if not o
.is_cpufreq_supported():
169 # Save the ID of the added core
170 core_ids
.append(o
.core_id
)