@cryptotaxi247 / netdata-1 / commits / 24ba94c9f

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