@cryptotaxi247 / netdata-1 / commits / 93964ced1

python.d.plugin option 'trace' added

lgz committed Oct 22, 2017 at 20:22 UTC 93964ced184612ac28a607990c9b26a6d5fa3961
3 files changed +44 -6
plugins.d/python.d.plugin
+5 -2
@@ -57,9 +57,10 @@ ALL_MODULES = [m for m in sorted(os.listdir(CHARTS_PY_DIR)) if module_ok(m)]
57
58 def parse_cmd():
59 debug = 'debug' in argv[1:]
60 + trace = 'trace' in argv[1:]
61 override_update_every = next((arg for arg in argv[1:] if arg.isdigit() and int(arg) > 1), False)
62 modules = [''.join([m, MODULE_EXTENSION]) for m in argv[1:] if ''.join([m, MODULE_EXTENSION]) in ALL_MODULES]
62 - return debug, override_update_every, modules or ALL_MODULES
63 + return debug, trace, override_update_every, modules or ALL_MODULES
64
65
66 def multi_job_check(config):
@@ -371,10 +372,12 @@ class Plugin(object):
372
373
374 if __name__ == '__main__':
374 - DEBUG, OVERRIDE_UPDATE_EVERY, MODULES_TO_RUN = parse_cmd()
375 + DEBUG, TRACE, OVERRIDE_UPDATE_EVERY, MODULES_TO_RUN = parse_cmd()
376 Logger = PythonDLogger()
377 if DEBUG:
378 Logger.logger.severity = 'DEBUG'
379 + if TRACE:
380 + Logger.log_traceback = True
381 Logger.info('Using python {version}'.format(version=PY_VERSION[0]))
382
383 plugin = Plugin()
python.d/python_modules/bases/FrameworkServices/SimpleService.py
+1 -1
@@ -176,7 +176,7 @@ class SimpleService(Thread, PythonDLimitedLogger, OldVersionCompatibility, objec
176 try:
177 updated = self.update()
178 except Exception as error:
179 - self.debug('update() unhandled exception: {error}'.format(error=error))
179 + self.error('update() unhandled exception: {error}'.format(error=error))
180 updated = False
181
182 if not updated:
python.d/python_modules/bases/loggers.py
+38 -3
@@ -3,6 +3,9 @@
3 # Author: Ilya Mashchenko (l2isbad)
4
5 import logging
6 +import traceback
7 +
8 +from sys import exc_info
9
10 try:
11 from time import monotonic as time
@@ -29,7 +32,7 @@ PYTHON_D_LOG_NAME = 'python.d'
32 def limiter(log_max_count=30, allowed_in_seconds=60):
33 def on_decorator(func):
34
32 - def on_call(*args, **kwargs):
35 + def on_call(*args):
36 current_time = args[0]._runtime_counters.START_RUN
37 lc = args[0]._logger_counters
38
@@ -40,12 +43,28 @@ def limiter(log_max_count=30, allowed_in_seconds=60):
43 lc.time_to_compare = current_time
44
45 lc.logged += 1
43 - func(*args, **kwargs)
46 + func(*args)
47
48 return on_call
49 return on_decorator
50
51
52 +def add_traceback(func):
53 + def on_call(*args):
54 + self = args[0]
55 +
56 + if not self.log_traceback:
57 + func(*args)
58 + else:
59 + if exc_info()[0]:
60 + func(*args)
61 + func(self, traceback.format_exc())
62 + else:
63 + func(*args)
64 +
65 + return on_call
66 +
67 +
68 class LoggerCounters:
69 def __init__(self):
70 self.logged = 0
@@ -120,7 +139,7 @@ class BaseLogger(object):
139 self.logger.critical(' '.join(map(str, msg)), **kwargs)
140
141
123 -class PythonDLogger:
142 +class PythonDLogger(object):
143 def __init__(self, logger_name=PYTHON_D_LOG_NAME, log_fmt=PYTHON_D_LOG_LINE_FORMAT):
144 """
145 :param logger_name: <str>
@@ -131,6 +150,16 @@ class PythonDLogger:
150 self.job_name = 'main'
151 self._logger_counters = LoggerCounters()
152
153 + _LOG_TRACEBACK = False
154 +
155 + @property
156 + def log_traceback(self):
157 + return PythonDLogger._LOG_TRACEBACK
158 +
159 + @log_traceback.setter
160 + def log_traceback(self, value):
161 + PythonDLogger._LOG_TRACEBACK = value
162 +
163 def debug(self, *msg):
164 self.logger.debug(*msg, extra={'module_name': self.module_name,
165 'job_name': self.job_name or self.module_name})
@@ -143,10 +172,12 @@ class PythonDLogger:
172 self.logger.warning(*msg, extra={'module_name': self.module_name,
173 'job_name': self.job_name or self.module_name})
174
175 + @add_traceback
176 def error(self, *msg):
177 self.logger.error(*msg, extra={'module_name': self.module_name,
178 'job_name': self.job_name or self.module_name})
179
180 + @add_traceback
181 def alert(self, *msg):
182 self.logger.alert(*msg, extra={'module_name': self.module_name,
183 'job_name': self.job_name or self.module_name})
@@ -168,3 +199,7 @@ class PythonDLimitedLogger(PythonDLogger):
199 @limiter()
200 def error(self, *msg):
201 PythonDLogger.error(self, *msg)
202 +
203 + @limiter()
204 + def alert(self, *msg):
205 + PythonDLogger.alert(self, *msg)