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:
Martin Mágr 2023-08-31 11:12:51 +02:00 committed by Martin Magr
parent 6cf6c49331
commit 0a4b26bb45
3 changed files with 56 additions and 3 deletions

View File

@ -113,6 +113,21 @@ class CliAlarmCreateTest(testtools.TestCase):
'gnocchi_aggregation_by_metrics_threshold requires '
'--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):
# The test case to cover the method _alarm_from_args
parser = self.cli_alarm_create.get_parser('aodh alarm create')
@ -179,6 +194,12 @@ class CliAlarmCreateTest(testtools.TestCase):
'type': '',
'value': 'fake-resource-id'}],
'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': {
'granularity': '60',
'metric': 'cpu',
@ -221,6 +242,24 @@ class CliAlarmCreateTest(testtools.TestCase):
alarm_rep = self.cli_alarm_create._alarm_from_args(test_parsed_args)
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):
starts = ['0 11 * * *', ' 0 11 * * * ',
'"0 11 * * *"', '\'0 11 * * *\'']

View File

@ -115,7 +115,11 @@ class AlarmManager(base.Manager):
else:
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_update.pop('threshold_rule')
elif 'event_rule' in alarm_update:

View File

@ -24,7 +24,7 @@ from aodhclient import exceptions
from aodhclient.i18n import _
from aodhclient import utils
ALARM_TYPES = ['event', 'composite', 'threshold',
ALARM_TYPES = ['prometheus', 'event', 'composite', 'threshold',
'gnocchi_resources_threshold',
'gnocchi_aggregation_by_metrics_threshold',
'gnocchi_aggregation_by_resources_threshold',
@ -271,7 +271,9 @@ class CliAlarmCreate(show.ShowOne):
'For alarms of '
'type gnocchi_aggregation_by_resources_threshold: '
'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(
'--comparison-operator', metavar='<OPERATOR>',
dest='comparison_operator', choices=ALARM_OPERATORS,
@ -424,6 +426,10 @@ class CliAlarmCreate(show.ShowOne):
self.parser.error('Loadbalancer member health alarm requires'
'--stack-id, --pool-id and'
'--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):
alarm = utils.dict_from_parsed_args(
@ -440,6 +446,10 @@ class CliAlarmCreate(show.ShowOne):
'query'])
alarm['event_rule'] = utils.dict_from_parsed_args(
parsed_args, ['event_type', 'query'])
alarm['prometheus_rule'] = (
utils.dict_from_parsed_args(parsed_args,
['comparison_operator', 'threshold',
'query']))
alarm['gnocchi_resources_threshold_rule'] = (
utils.dict_from_parsed_args(parsed_args,
['granularity', 'comparison_operator',