more specific exception handling following l2isbad's suggestions
Dominik Schloesser committed
Sep 4, 2017 at 13:39 UTC
24ba94c9f0b12c1adb523121f89ca865e087bde5
1 file changed
+30
-23
python.d/chrony.chart.py
+30
-23
@@ -70,32 +70,39 @@ class Service(ExecutableService):
70
self.order = ORDER
71
self.definitions = CHARTS
72
73
+ CHRONY = [('Frequency', 'frequency', 1e3),
74
+ ('Last offset', 'lastoffset', 1e9),
75
+ ('RMS offset', 'rmsoffset', 1e9),
76
+ ('Residual freq', 'residualfreq', 1e3),
77
+ ('Root delay', 'rootdelay', 1e9),
78
+ ('Root dispersion', 'rootdispersion', 1e9),
79
+ ('Skew', 'skew', 1e3),
80
+ ('System time', 'timediff', 1e9)]
81
+
82
def _get_data(self):
83
"""
84
Format data received from shell command
85
:return: dict
86
"""
78
- try:
79
- lines = self._get_raw_data()
80
- if lines is not None:
81
- chrony_dict = {}
82
- for line in lines[1:]:
83
- lparts = line.split(':', 1)
84
- if (len(lparts) > 1):
85
- value = lparts[1].strip().split(' ')[0]
86
- chrony_dict[lparts[0].strip()] = value
87
- return {'timediff': int(float(chrony_dict['System time']) * 1e9),
88
- 'lastoffset': int(float(chrony_dict['Last offset']) * 1e9),
89
- 'rmsoffset': int(float(chrony_dict['RMS offset']) * 1e9),
90
- 'rootdelay': int(float(chrony_dict['Root delay']) * 1e9),
91
- 'rootdispersion': int(float(chrony_dict['Root dispersion']) * 1e9),
92
- 'skew': int(float(chrony_dict['Skew']) * 1e3),
93
- 'frequency': int(float(chrony_dict['Frequency']) * 1e3),
94
- 'residualfreq': int(float(chrony_dict['Residual freq']) * 1e3)
95
- }
96
- else:
97
- self.error("No valid chronyc output")
98
- return None
99
- except (ValueError, AttributeError, KeyError):
100
- self.error("Chronyc data parser exception")
87
+ raw_data = self._get_raw_data()
88
+ if not raw_data:
89
return None
90
+
91
+ raw_data = (line.split(':', 1) for line in raw_data)
92
+ parsed, data = dict(), dict()
93
+
94
+ for line in raw_data:
95
+ try:
96
+ key, value = (l.strip() for l in line)
97
+ except ValueError:
98
+ continue
99
+ if len(value) > 0:
100
+ parsed[key] = value.split()[0]
101
+
102
+ for key, dim_id, multiplier in self.CHRONY:
103
+ try:
104
+ data[dim_id] = int(float(parsed[key]) * multiplier)
105
+ except (KeyError, ValueError):
106
+ continue
107
+
108
+ return data or None