1
# -*- coding: utf-8 -*-
2
# Description: cpufreq netdata python.d module
3
-# Author: Pawel Krupa (paulfantom)
3
+# Author: Pawel Krupa (paulfantom) and Steven Noonan (tycho)
4
5
+import glob
6
import os
7
from base import SimpleService
8
19
]}
20
}
21
21
-
22
class Service(SimpleService):
23
def __init__(self, configuration=None, name=None):
24
prefix = os.getenv('NETDATA_HOST_PREFIX', "")
25
if prefix.endswith('/'):
26
prefix = prefix[:-1]
27
self.sys_dir = prefix + "/sys/devices"
28
- self.filename = "scaling_cur_freq"
28
SimpleService.__init__(self, configuration=configuration, name=name)
29
self.order = ORDER
30
self.definitions = CHARTS
31
self._orig_name = ""
32
self.assignment = {}
34
- self.paths = []
33
+ self.accurate = True
34
35
def _get_data(self):
37
- raw = {}
38
- for path in self.paths:
39
- with open(path, 'r') as f:
40
- raw[path] = f.read()
36
data = {}
42
- for path in self.paths:
43
- data[self.assignment[path]] = raw[path]
37
+ if self.accurate:
38
+ for name, path in self.assignment.items():
39
+ total = 0
40
+ for line in open(path, 'r'):
41
+ line = list(map(int, line.split()))
42
+ total += (line[0] * line[1]) / 100
43
+ data[name] = total
44
+ else:
45
+ for name, path in self.assignment.items():
46
+ data[name] = open(path, 'r').read()
47
return data
48
49
def check(self):
54
55
self._orig_name = self.chart_name
56
54
- for dirpath, _, filenames in os.walk(self.sys_dir):
55
- if self.filename in filenames:
56
- self.paths.append(dirpath + "/" + self.filename)
57
-
58
- if len(self.paths) == 0:
59
- self.error("cannot find", self.filename)
57
+ for path in glob.glob(self.sys_dir + '/system/cpu/cpu*/cpufreq/stats/time_in_state'):
58
+ if len(open(path, 'rb').read().rstrip()) == 0:
59
+ self.alert("time_in_state is empty, broken cpufreq_stats data")
60
+ self.assignment = {}
61
+ break
62
+ path_elem = path.split('/')
63
+ cpu = path_elem[-4]
64
+ self.assignment[cpu] = path
65
+
66
+ if len(self.assignment) == 0:
67
+ self.alert("trying less accurate scaling_cur_freq method")
68
+ self.accurate = False
69
+
70
+ for path in glob.glob(self.sys_dir + '/system/cpu/cpu*/cpufreq/scaling_cur_freq'):
71
+ path_elem = path.split('/')
72
+ cpu = path_elem[-3]
73
+ self.assignment[cpu] = path
74
+
75
+ if len(self.assignment) == 0:
76
+ self.error("couldn't find a method to read cpufreq statistics")
77
return False
78
62
- self.paths.sort()
63
- i = 0
64
- for path in self.paths:
65
- self.assignment[path] = "cpu" + str(i)
66
- i += 1
79
+ if self.accurate:
80
+ algo = 'incremental'
81
+ else:
82
+ algo = 'absolute'
83
68
- for name in self.assignment:
69
- dim = self.assignment[name]
70
- self.definitions[ORDER[0]]['lines'].append([dim, dim, 'absolute', 1, 1000])
84
+ for name in self.assignment.keys():
85
+ self.definitions[ORDER[0]]['lines'].append([name, name, algo, 1, 1000])
86
87
return True
88