]>
Commit | Line | Data |
---|---|---|
f37913e8 | 1 | #!/usr/bin/python3 |
eed405de MT |
2 | ############################################################################### |
3 | # # | |
4 | # collecty - A system statistics collection daemon for IPFire # | |
5 | # Copyright (C) 2012 IPFire development team # | |
6 | # # | |
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. # | |
11 | # # | |
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. # | |
16 | # # | |
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/>. # | |
19 | # # | |
20 | ############################################################################### | |
21 | ||
5579c922 MT |
22 | import multiprocessing |
23 | ||
f37913e8 | 24 | from . import base |
eed405de | 25 | |
03ba5630 | 26 | from ..colours import * |
89c9cbc1 | 27 | from ..constants import * |
eed405de | 28 | |
c968f6d9 MT |
29 | class GraphTemplateProcessor(base.GraphTemplate): |
30 | name = "processor" | |
eed405de | 31 | |
eb1ab05c MT |
32 | @property |
33 | def rrd_graph(self): | |
34 | _ = self.locale.translate | |
35 | ||
36 | return [ | |
3e0ef4a7 MT |
37 | # Add all used CPU cycles |
38 | "CDEF:usage=user,nice,+,sys,+,wait,+,irq,+,sirq,+,steal,+,guest,+,guest_nice,+", | |
39 | ||
40 | # Add idle to get the total number of cycles | |
41 | "CDEF:total=usage,idle,+", | |
985fd71c | 42 | |
89c9cbc1 | 43 | # Headline |
d542dec5 MT |
44 | "COMMENT:%s" % EMPTY_LABEL, |
45 | "COMMENT:%s" % (COLUMN % _("Current")), | |
46 | "COMMENT:%s" % (COLUMN % _("Average")), | |
47 | "COMMENT:%s" % (COLUMN % _("Minimum")), | |
48 | "COMMENT:%s\\j" % (COLUMN % _("Maximum")), | |
89c9cbc1 MT |
49 | |
50 | "CDEF:usage_p=100,usage,*,total,/", | |
51 | "COMMENT: %s" % (LABEL % _("Total")), | |
52 | "GPRINT:usage_p_cur:%s" % PERCENTAGE, | |
53 | "GPRINT:usage_p_avg:%s" % PERCENTAGE, | |
54 | "GPRINT:usage_p_min:%s" % PERCENTAGE, | |
55 | "GPRINT:usage_p_max:%s\\j" % PERCENTAGE, | |
56 | ||
57 | EMPTY_LINE, | |
58 | ||
985fd71c | 59 | "CDEF:user_p=100,user,*,total,/", |
7b2b7f26 MT |
60 | "AREA:user_p%s:%s" % ( |
61 | transparency(CPU_USER, AREA_OPACITY), | |
62 | LABEL % _("User"), | |
63 | ), | |
89c9cbc1 MT |
64 | "GPRINT:user_p_cur:%s" % PERCENTAGE, |
65 | "GPRINT:user_p_avg:%s" % PERCENTAGE, | |
66 | "GPRINT:user_p_min:%s" % PERCENTAGE, | |
67 | "GPRINT:user_p_max:%s\\j" % PERCENTAGE, | |
985fd71c MT |
68 | |
69 | "CDEF:nice_p=100,nice,*,total,/", | |
cc615cc0 | 70 | "AREA:nice_p%s:%s:STACK" % ( |
7b2b7f26 MT |
71 | transparency(CPU_NICE, AREA_OPACITY), |
72 | LABEL % _("Nice"), | |
73 | ), | |
89c9cbc1 MT |
74 | "GPRINT:nice_p_cur:%s" % PERCENTAGE, |
75 | "GPRINT:nice_p_avg:%s" % PERCENTAGE, | |
76 | "GPRINT:nice_p_min:%s" % PERCENTAGE, | |
77 | "GPRINT:nice_p_max:%s\\j" % PERCENTAGE, | |
985fd71c MT |
78 | |
79 | "CDEF:sys_p=100,sys,*,total,/", | |
cc615cc0 | 80 | "AREA:sys_p%s:%s:STACK" % ( |
7b2b7f26 MT |
81 | transparency(CPU_SYS, AREA_OPACITY), |
82 | LABEL % _("System"), | |
83 | ), | |
89c9cbc1 MT |
84 | "GPRINT:sys_p_cur:%s" % PERCENTAGE, |
85 | "GPRINT:sys_p_avg:%s" % PERCENTAGE, | |
86 | "GPRINT:sys_p_min:%s" % PERCENTAGE, | |
87 | "GPRINT:sys_p_max:%s\\j" % PERCENTAGE, | |
985fd71c MT |
88 | |
89 | "CDEF:wait_p=100,wait,*,total,/", | |
cc615cc0 | 90 | "AREA:wait_p%s:%s:STACK" % ( |
7b2b7f26 MT |
91 | transparency(CPU_WAIT, AREA_OPACITY), |
92 | LABEL % _("Wait"), | |
93 | ), | |
89c9cbc1 MT |
94 | "GPRINT:wait_p_cur:%s" % PERCENTAGE, |
95 | "GPRINT:wait_p_avg:%s" % PERCENTAGE, | |
96 | "GPRINT:wait_p_min:%s" % PERCENTAGE, | |
97 | "GPRINT:wait_p_max:%s\\j" % PERCENTAGE, | |
985fd71c MT |
98 | |
99 | "CDEF:irq_p=100,irq,*,total,/", | |
cc615cc0 | 100 | "AREA:irq_p%s:%s:STACK" % ( |
7b2b7f26 MT |
101 | transparency(CPU_IRQ, AREA_OPACITY), |
102 | LABEL % _("Interrupt"), | |
103 | ), | |
89c9cbc1 MT |
104 | "GPRINT:irq_p_cur:%s" % PERCENTAGE, |
105 | "GPRINT:irq_p_avg:%s" % PERCENTAGE, | |
106 | "GPRINT:irq_p_min:%s" % PERCENTAGE, | |
107 | "GPRINT:irq_p_max:%s\\j" % PERCENTAGE, | |
985fd71c MT |
108 | |
109 | "CDEF:sirq_p=100,sirq,*,total,/", | |
cc615cc0 | 110 | "AREA:sirq_p%s:%s:STACK" % ( |
7b2b7f26 MT |
111 | transparency(CPU_SIRQ, AREA_OPACITY), |
112 | LABEL % _("Soft Interrupt"), | |
113 | ), | |
89c9cbc1 MT |
114 | "GPRINT:sirq_p_cur:%s" % PERCENTAGE, |
115 | "GPRINT:sirq_p_avg:%s" % PERCENTAGE, | |
116 | "GPRINT:sirq_p_min:%s" % PERCENTAGE, | |
117 | "GPRINT:sirq_p_max:%s\\j" % PERCENTAGE, | |
985fd71c | 118 | |
c789c929 | 119 | "CDEF:steal_p=100,steal,*,total,/", |
cc615cc0 | 120 | "AREA:steal_p%s:%s:STACK" % ( |
7b2b7f26 MT |
121 | transparency(CPU_STEAL, AREA_OPACITY), |
122 | LABEL % _("Steal"), | |
123 | ), | |
89c9cbc1 MT |
124 | "GPRINT:steal_p_cur:%s" % PERCENTAGE, |
125 | "GPRINT:steal_p_avg:%s" % PERCENTAGE, | |
126 | "GPRINT:steal_p_min:%s" % PERCENTAGE, | |
127 | "GPRINT:steal_p_max:%s\\j" % PERCENTAGE, | |
c789c929 MT |
128 | |
129 | "CDEF:guest_p=100,guest,*,total,/", | |
cc615cc0 | 130 | "AREA:guest_p%s:%s:STACK" % ( |
7b2b7f26 MT |
131 | transparency(CPU_GUEST, AREA_OPACITY), |
132 | LABEL % _("Guest"), | |
133 | ), | |
89c9cbc1 MT |
134 | "GPRINT:guest_p_cur:%s" % PERCENTAGE, |
135 | "GPRINT:guest_p_avg:%s" % PERCENTAGE, | |
136 | "GPRINT:guest_p_min:%s" % PERCENTAGE, | |
137 | "GPRINT:guest_p_max:%s\\j" % PERCENTAGE, | |
c789c929 | 138 | |
306a119a | 139 | "CDEF:guest_nice_p=100,guest_nice,*,total,/", |
cc615cc0 | 140 | "AREA:guest_nice_p%s:%s:STACK" % ( |
7b2b7f26 MT |
141 | transparency(CPU_GUEST_NICE, AREA_OPACITY), |
142 | LABEL % _("Guest Nice"), | |
143 | ), | |
89c9cbc1 MT |
144 | "GPRINT:guest_nice_p_cur:%s" % PERCENTAGE, |
145 | "GPRINT:guest_nice_p_avg:%s" % PERCENTAGE, | |
146 | "GPRINT:guest_nice_p_min:%s" % PERCENTAGE, | |
147 | "GPRINT:guest_nice_p_max:%s\\j" % PERCENTAGE, | |
3e0ef4a7 | 148 | |
985fd71c | 149 | "CDEF:idle_p=100,idle,*,total,/", |
cc615cc0 | 150 | "AREA:idle_p%s::STACK" % CPU_IDLE, |
7b2b7f26 MT |
151 | |
152 | # Draw contour lines | |
153 | "LINE:user_p%s" % CPU_USER, | |
154 | "LINE:nice_p%s::STACK" % CPU_NICE, | |
155 | "LINE:sys_p%s::STACK" % CPU_SYS, | |
156 | "LINE:wait_p%s::STACK" % CPU_WAIT, | |
157 | "LINE:irq_p%s::STACK" % CPU_IRQ, | |
158 | "LINE:sirq_p%s::STACK" % CPU_SIRQ, | |
159 | "LINE:steal_p%s::STACK" % CPU_STEAL, | |
160 | "LINE:guest_p%s::STACK" % CPU_GUEST, | |
161 | "LINE:guest_nice_p%s::STACK" % CPU_GUEST_NICE, | |
89c9cbc1 | 162 | ] |
73db5226 | 163 | |
985fd71c | 164 | upper_limit = 100 |
f181246a | 165 | lower_limit = 0 |
73db5226 | 166 | |
f181246a MT |
167 | @property |
168 | def graph_title(self): | |
eb1ab05c | 169 | _ = self.locale.translate |
39fe7862 | 170 | return _("Processor Usage") |
f181246a MT |
171 | |
172 | @property | |
173 | def graph_vertical_label(self): | |
eb1ab05c | 174 | _ = self.locale.translate |
985fd71c | 175 | return _("Percent") |
eed405de | 176 | |
b1ea4956 | 177 | |
72364063 | 178 | class ProcessorObject(base.Object): |
b1ea4956 | 179 | rrd_schema = [ |
de090041 MT |
180 | "DS:user:DERIVE:0:U", |
181 | "DS:nice:DERIVE:0:U", | |
182 | "DS:sys:DERIVE:0:U", | |
183 | "DS:idle:DERIVE:0:U", | |
184 | "DS:wait:DERIVE:0:U", | |
185 | "DS:irq:DERIVE:0:U", | |
186 | "DS:sirq:DERIVE:0:U", | |
5579c922 MT |
187 | "DS:steal:DERIVE:0:U", |
188 | "DS:guest:DERIVE:0:U", | |
306a119a | 189 | "DS:guest_nice:DERIVE:0:U", |
b1ea4956 MT |
190 | ] |
191 | ||
5579c922 MT |
192 | def init(self, cpu_id=None): |
193 | self.cpu_id = cpu_id | |
194 | ||
72364063 MT |
195 | @property |
196 | def id(self): | |
5579c922 MT |
197 | if self.cpu_id is not None: |
198 | return "%s" % self.cpu_id | |
199 | ||
72364063 | 200 | return "default" |
a116f2fb | 201 | |
72364063 | 202 | def collect(self): |
cc19aed8 | 203 | """ |
a116f2fb | 204 | Reads the CPU usage. |
cc19aed8 | 205 | """ |
5579c922 MT |
206 | stat = self.read_proc_stat() |
207 | ||
208 | if self.cpu_id is None: | |
209 | values = stat.get("cpu") | |
210 | else: | |
211 | values = stat.get("cpu%s" % self.cpu_id) | |
212 | ||
213 | # Convert values into a list | |
214 | values = values.split() | |
215 | ||
306a119a | 216 | if not len(values) == len(self.rrd_schema): |
5579c922 MT |
217 | raise ValueError("Received unexpected output from /proc/stat: %s" % values) |
218 | ||
219 | return values | |
72364063 MT |
220 | |
221 | ||
222 | class ProcessorPlugin(base.Plugin): | |
223 | name = "processor" | |
224 | description = "Processor Usage Plugin" | |
225 | ||
c968f6d9 | 226 | templates = [GraphTemplateProcessor] |
72364063 | 227 | |
72364063 MT |
228 | @property |
229 | def objects(self): | |
230 | yield ProcessorObject(self) | |
5579c922 MT |
231 | |
232 | num = multiprocessing.cpu_count() | |
233 | for i in range(num): | |
234 | yield ProcessorObject(self, cpu_id=i) |