Add log level control using command line arguments
All checks were successful
continuous-integration/drone/push Build is passing

Default  ERROR
    -v       WARNING
    -vv      INFO
    -vvv     DEBUG
This commit is contained in:
IamTheFij 2019-06-03 11:44:39 -07:00
parent 8169b4257a
commit 05f630d08a
2 changed files with 50 additions and 12 deletions

View File

@ -12,7 +12,7 @@ env:
# Runs Minitor
.PHONY: run
run: env
./env/bin/python -m minitor.main
./env/bin/python -m minitor.main -vvv
# Runs Minitor with metrics
.PHONY: run-metrics

View File

@ -16,7 +16,7 @@ from prometheus_client import start_http_server
DEFAULT_METRICS_PORT = 8080
logging.basicConfig(
level=logging.INFO,
level=logging.ERROR,
format='%(asctime)s %(levelname)s %(name)s %(message)s'
)
logging.getLogger(__name__).addHandler(logging.NullHandler())
@ -111,7 +111,7 @@ class MinitorAlert(Exception):
class Monitor(object):
"""Primary configuration item for Minitor"""
def __init__(self, config, counter=None):
def __init__(self, config, counter=None, logger=None):
"""Accepts a dictionary of configuration items to override defaults"""
settings = {
'alerts': ['log'],
@ -139,9 +139,14 @@ class Monitor(object):
self.total_failure_count = 0
self._counter = counter
self._logger = logging.getLogger(
'{}({})'.format(self.__class__.__name__, self.name)
)
if logger is None:
self._logger = logging.getLogger(
'{}({})'.format(self.__class__.__name__, self.name)
)
else:
self._logger = logger.getChild(
'{}({})'.format(self.__class__.__name__, self.name)
)
def _count_check(self, is_success=True, is_alert=False):
if self._counter is not None:
@ -233,7 +238,7 @@ class Monitor(object):
class Alert(object):
def __init__(self, name, config, counter=None):
def __init__(self, name, config, counter=None, logger=None):
"""An alert must be named and have a config dict"""
self.name = name
self.command = config.get('command')
@ -241,9 +246,14 @@ class Alert(object):
raise InvalidAlertException('Invalid alert {}'.format(self.name))
self._counter = counter
self._logger = logging.getLogger(
'{}({})'.format(self.__class__.__name__, self.name)
)
if logger is None:
self._logger = logging.getLogger(
'{}({})'.format(self.__class__.__name__, self.name)
)
else:
self._logger = logger.getChild(
'{}({})'.format(self.__class__.__name__, self.name)
)
def _count_alert(self, monitor):
"""Increments the alert counter"""
@ -321,6 +331,12 @@ class Minitor(object):
default=DEFAULT_METRICS_PORT,
help='Port to use when serving metrics',
)
parser.add_argument(
'--verbose', '-v',
action='count',
help=('Adjust log verbosity by increasing arg count. Default log',
'level is ERROR. Level increases with each `v`'),
)
return parser.parse_args(args)
def _setup(self, config_path):
@ -328,7 +344,11 @@ class Minitor(object):
config = read_yaml(config_path)
self.check_interval = config.get('check_interval', 30)
self.monitors = [
Monitor(mon, counter=self._monitor_counter)
Monitor(
mon,
counter=self._monitor_counter,
logger=self._logger,
)
for mon in config.get('monitors', [])
]
# Add default alert for logging
@ -337,10 +357,16 @@ class Minitor(object):
'log',
{'command': ['echo', '{alert_message}!']},
counter=self._alert_counter,
logger=self._logger,
)
}
self.alerts.update({
alert_name: Alert(alert_name, alert, counter=self._alert_counter)
alert_name: Alert(
alert_name,
alert,
counter=self._alert_counter,
logger=self._logger,
)
for alert_name, alert in config.get('alerts', {}).items()
})
@ -413,10 +439,22 @@ class Minitor(object):
for alert in alerts:
self.alerts[alert].alert(str(minitor_alert), monitor)
def _set_log_level(self, verbose):
"""Sets the log level for the class using the provided verbose count"""
if verbose == 1:
self._logger.setLevel(logging.WARNING)
elif verbose == 2:
self._logger.setLevel(logging.INFO)
elif verbose >= 3:
self._logger.setLevel(logging.DEBUG)
def run(self, args=None):
"""Runs Minitor in a loop"""
args = self._parse_args(args)
if args.verbose:
self._set_log_level(args.verbose)
if args.metrics:
self._init_metrics()
start_http_server(args.metrics_port)