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)