Prometheus alarms
This patch adds possibility to create alarms of type prometheus. Co-authored-by: Jaromír Wysoglad <jwysogla@redhat.com> Depends-On: If5140dfb9d9b41d7f1044f653701bed5e33cab62 Change-Id: If9bc3ace34a405c3ba00d646814cc5cbb6624a67
This commit is contained in:
parent
6cf6c49331
commit
0a4b26bb45
@ -113,6 +113,21 @@ class CliAlarmCreateTest(testtools.TestCase):
|
|||||||
'gnocchi_aggregation_by_metrics_threshold requires '
|
'gnocchi_aggregation_by_metrics_threshold requires '
|
||||||
'--metric, --threshold and --aggregation-method')
|
'--metric, --threshold and --aggregation-method')
|
||||||
|
|
||||||
|
@mock.patch.object(argparse.ArgumentParser, 'error')
|
||||||
|
def test_validate_args_prometheus(self, mock_arg):
|
||||||
|
# Cover the test case of the method _validate_args for
|
||||||
|
# prometheus
|
||||||
|
parser = self.cli_alarm_create.get_parser('aodh alarm create')
|
||||||
|
test_parsed_args = parser.parse_args([
|
||||||
|
'--name', 'prom_test',
|
||||||
|
'--type', 'prometheus',
|
||||||
|
'--comparison-operator', 'gt',
|
||||||
|
'--threshold', '666',
|
||||||
|
])
|
||||||
|
self.cli_alarm_create._validate_args(test_parsed_args)
|
||||||
|
mock_arg.assert_called_once_with(
|
||||||
|
'Prometheus alarm requires --query and --threshold parameters.')
|
||||||
|
|
||||||
def test_alarm_from_args(self):
|
def test_alarm_from_args(self):
|
||||||
# The test case to cover the method _alarm_from_args
|
# The test case to cover the method _alarm_from_args
|
||||||
parser = self.cli_alarm_create.get_parser('aodh alarm create')
|
parser = self.cli_alarm_create.get_parser('aodh alarm create')
|
||||||
@ -179,6 +194,12 @@ class CliAlarmCreateTest(testtools.TestCase):
|
|||||||
'type': '',
|
'type': '',
|
||||||
'value': 'fake-resource-id'}],
|
'value': 'fake-resource-id'}],
|
||||||
'threshold': 80.0},
|
'threshold': 80.0},
|
||||||
|
'prometheus_rule': {'comparison_operator': 'le',
|
||||||
|
'query': [{'field': 'resource',
|
||||||
|
'op': 'eq',
|
||||||
|
'type': '',
|
||||||
|
'value': 'fake-resource-id'}],
|
||||||
|
'threshold': 80.0},
|
||||||
'gnocchi_resources_threshold_rule': {
|
'gnocchi_resources_threshold_rule': {
|
||||||
'granularity': '60',
|
'granularity': '60',
|
||||||
'metric': 'cpu',
|
'metric': 'cpu',
|
||||||
@ -221,6 +242,24 @@ class CliAlarmCreateTest(testtools.TestCase):
|
|||||||
alarm_rep = self.cli_alarm_create._alarm_from_args(test_parsed_args)
|
alarm_rep = self.cli_alarm_create._alarm_from_args(test_parsed_args)
|
||||||
self.assertEqual(alarm, alarm_rep)
|
self.assertEqual(alarm, alarm_rep)
|
||||||
|
|
||||||
|
def test_alarm_from_args_for_prometheus(self):
|
||||||
|
# The test case to cover the method _alarm_from_args
|
||||||
|
parser = self.cli_alarm_create.get_parser('aodh alarm create')
|
||||||
|
test_parsed_args = parser.parse_args([
|
||||||
|
'--name', 'alarm_prom',
|
||||||
|
'--type', 'prometheus',
|
||||||
|
'--comparison-operator', 'gt',
|
||||||
|
'--threshold', '666',
|
||||||
|
'--query', r'some_metric{some_label="some_value"}'
|
||||||
|
])
|
||||||
|
|
||||||
|
prom_rule = {'comparison_operator': 'gt',
|
||||||
|
'query': r'some_metric{some_label="some_value"}',
|
||||||
|
'threshold': 666.0}
|
||||||
|
|
||||||
|
alarm_rep = self.cli_alarm_create._alarm_from_args(test_parsed_args)
|
||||||
|
self.assertEqual(prom_rule, alarm_rep['prometheus_rule'])
|
||||||
|
|
||||||
def test_validate_time_constraint(self):
|
def test_validate_time_constraint(self):
|
||||||
starts = ['0 11 * * *', ' 0 11 * * * ',
|
starts = ['0 11 * * *', ' 0 11 * * * ',
|
||||||
'"0 11 * * *"', '\'0 11 * * *\'']
|
'"0 11 * * *"', '\'0 11 * * *\'']
|
||||||
|
@ -115,7 +115,11 @@ class AlarmManager(base.Manager):
|
|||||||
else:
|
else:
|
||||||
self._clean_rules(alarm_update['type'], alarm_update)
|
self._clean_rules(alarm_update['type'], alarm_update)
|
||||||
|
|
||||||
if 'threshold_rule' in alarm_update:
|
if 'prometheus_rule' in alarm_update:
|
||||||
|
rule = alarm_update.get('prometheus_rule')
|
||||||
|
alarm['prometheus_rule'].update(rule)
|
||||||
|
alarm_update.pop('prometheus_rule')
|
||||||
|
elif 'threshold_rule' in alarm_update:
|
||||||
alarm['threshold_rule'].update(alarm_update.get('threshold_rule'))
|
alarm['threshold_rule'].update(alarm_update.get('threshold_rule'))
|
||||||
alarm_update.pop('threshold_rule')
|
alarm_update.pop('threshold_rule')
|
||||||
elif 'event_rule' in alarm_update:
|
elif 'event_rule' in alarm_update:
|
||||||
|
@ -24,7 +24,7 @@ from aodhclient import exceptions
|
|||||||
from aodhclient.i18n import _
|
from aodhclient.i18n import _
|
||||||
from aodhclient import utils
|
from aodhclient import utils
|
||||||
|
|
||||||
ALARM_TYPES = ['event', 'composite', 'threshold',
|
ALARM_TYPES = ['prometheus', 'event', 'composite', 'threshold',
|
||||||
'gnocchi_resources_threshold',
|
'gnocchi_resources_threshold',
|
||||||
'gnocchi_aggregation_by_metrics_threshold',
|
'gnocchi_aggregation_by_metrics_threshold',
|
||||||
'gnocchi_aggregation_by_resources_threshold',
|
'gnocchi_aggregation_by_resources_threshold',
|
||||||
@ -271,7 +271,9 @@ class CliAlarmCreate(show.ShowOne):
|
|||||||
'For alarms of '
|
'For alarms of '
|
||||||
'type gnocchi_aggregation_by_resources_threshold: '
|
'type gnocchi_aggregation_by_resources_threshold: '
|
||||||
'need to specify a complex query json string, like:'
|
'need to specify a complex query json string, like:'
|
||||||
' {"and": [{"=": {"ended_at": null}}, ...]}.')
|
' {"and": [{"=": {"ended_at": null}}, ...]}. '
|
||||||
|
'For alarms of type prometheus this should be valid '
|
||||||
|
'PromQL query.')
|
||||||
common_group.add_argument(
|
common_group.add_argument(
|
||||||
'--comparison-operator', metavar='<OPERATOR>',
|
'--comparison-operator', metavar='<OPERATOR>',
|
||||||
dest='comparison_operator', choices=ALARM_OPERATORS,
|
dest='comparison_operator', choices=ALARM_OPERATORS,
|
||||||
@ -424,6 +426,10 @@ class CliAlarmCreate(show.ShowOne):
|
|||||||
self.parser.error('Loadbalancer member health alarm requires'
|
self.parser.error('Loadbalancer member health alarm requires'
|
||||||
'--stack-id, --pool-id and'
|
'--stack-id, --pool-id and'
|
||||||
'--autoscaling-group-id')
|
'--autoscaling-group-id')
|
||||||
|
elif (parsed_args.type == 'prometheus' and
|
||||||
|
not (parsed_args.query and parsed_args.threshold)):
|
||||||
|
self.parser.error('Prometheus alarm requires --query and '
|
||||||
|
'--threshold parameters.')
|
||||||
|
|
||||||
def _alarm_from_args(self, parsed_args):
|
def _alarm_from_args(self, parsed_args):
|
||||||
alarm = utils.dict_from_parsed_args(
|
alarm = utils.dict_from_parsed_args(
|
||||||
@ -440,6 +446,10 @@ class CliAlarmCreate(show.ShowOne):
|
|||||||
'query'])
|
'query'])
|
||||||
alarm['event_rule'] = utils.dict_from_parsed_args(
|
alarm['event_rule'] = utils.dict_from_parsed_args(
|
||||||
parsed_args, ['event_type', 'query'])
|
parsed_args, ['event_type', 'query'])
|
||||||
|
alarm['prometheus_rule'] = (
|
||||||
|
utils.dict_from_parsed_args(parsed_args,
|
||||||
|
['comparison_operator', 'threshold',
|
||||||
|
'query']))
|
||||||
alarm['gnocchi_resources_threshold_rule'] = (
|
alarm['gnocchi_resources_threshold_rule'] = (
|
||||||
utils.dict_from_parsed_args(parsed_args,
|
utils.dict_from_parsed_args(parsed_args,
|
||||||
['granularity', 'comparison_operator',
|
['granularity', 'comparison_operator',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user