Skip to content

Commit 629bad6

Browse files
authored
Add alert origin blackout support (#252)
* Add alert origin blackout support * Add some tests for blackout origin
1 parent 7dbb6de commit 629bad6

8 files changed

Lines changed: 50 additions & 28 deletions

File tree

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ test.unit: $(TOX) $(PYTEST)
8383
## test.integration - Run integration tests.
8484
test.integration:
8585
docker-compose -f docker-compose.ci.yaml rm --stop --force
86+
docker-compose -f docker-compose.ci.yaml pull
8687
docker-compose -f docker-compose.ci.yaml build sut
8788
docker-compose -f docker-compose.ci.yaml up --exit-code-from sut
8889
docker-compose -f docker-compose.ci.yaml rm --stop --force

alertaclient/api.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,14 +168,16 @@ def delete_alert_note(self, id, note_id):
168168
return self.http.delete('/alert/{}/note/{}'.format(id, note_id))
169169

170170
# Blackouts
171-
def create_blackout(self, environment, service=None, resource=None, event=None, group=None, tags=None, customer=None, start=None, duration=None, text=None):
171+
def create_blackout(self, environment, service=None, resource=None, event=None, group=None, tags=None,
172+
origin=None, customer=None, start=None, duration=None, text=None):
172173
data = {
173174
'environment': environment,
174175
'service': service or list(),
175176
'resource': resource,
176177
'event': event,
177178
'group': group,
178179
'tags': tags or list(),
180+
'origin': origin,
179181
'customer': customer,
180182
'startTime': start,
181183
'duration': duration,
@@ -200,6 +202,7 @@ def update_blackout(self, id, **kwargs):
200202
'event': kwargs.get('event'),
201203
'group': kwargs.get('group'),
202204
'tags': kwargs.get('tags'),
205+
'origin': kwargs.get('origin'),
203206
'startTime': kwargs.get('startTime'),
204207
'endTime': kwargs.get('endTime'),
205208
'text': kwargs.get('text'),

alertaclient/commands/cmd_blackout.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
@click.option('--event', '-e', metavar='EVENT', help='Event name')
1111
@click.option('--group', '-g', metavar='GROUP', help='Group event by type eg. OS, Performance')
1212
@click.option('--tag', '-T', 'tags', multiple=True, metavar='TAG', help='List of tags eg. London, os:linux, AWS/EC2')
13+
@click.option('--origin', '-O', metavar='ORIGIN', help='Origin of alert in form app/host')
1314
@click.option('--customer', metavar='STRING', help='Customer (Admin only)')
1415
@click.option('--start', metavar='DATETIME', help='Start time in ISO8601 eg. 2018-02-01T12:00:00.000Z')
1516
@click.option('--duration', metavar='SECONDS', type=int, help='Blackout period in seconds')
1617
@click.option('--text', help='Reason for blackout')
1718
@click.option('--delete', '-D', help='Delete blackout using ID')
1819
@click.pass_obj
19-
def cli(obj, environment, service, resource, event, group, tags, customer, start, duration, text, delete):
20+
def cli(obj, environment, service, resource, event, group, tags, origin, customer, start, duration, text, delete):
2021
"""Suppress alerts for specified duration based on alert attributes."""
2122
client = obj['client']
2223
if delete:
@@ -32,6 +33,7 @@ def cli(obj, environment, service, resource, event, group, tags, customer, start
3233
event=event,
3334
group=group,
3435
tags=tags,
36+
origin=origin,
3537
customer=customer,
3638
start=start,
3739
duration=duration,

alertaclient/commands/cmd_blackouts.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ def cli(obj, purge):
1818
timezone = obj['timezone']
1919
headers = {
2020
'id': 'ID', 'priority': 'P', 'environment': 'ENVIRONMENT', 'service': 'SERVICE', 'resource': 'RESOURCE',
21-
'event': 'EVENT', 'group': 'GROUP', 'tags': 'TAGS', 'customer': 'CUSTOMER', 'startTime': 'START', 'endTime': 'END',
22-
'duration': 'DURATION', 'user': 'USER', 'createTime': 'CREATED', 'text': 'COMMENT',
23-
'status': 'STATUS', 'remaining': 'REMAINING'
21+
'event': 'EVENT', 'group': 'GROUP', 'tags': 'TAGS', 'origin': 'ORIGIN', 'customer': 'CUSTOMER',
22+
'startTime': 'START', 'endTime': 'END', 'duration': 'DURATION', 'user': 'USER',
23+
'createTime': 'CREATED', 'text': 'COMMENT', 'status': 'STATUS', 'remaining': 'REMAINING'
2424
}
2525
blackouts = client.get_blackouts()
2626
click.echo(tabulate([b.tabular(timezone) for b in blackouts], headers=headers, tablefmt=obj['output']))

alertaclient/models/blackout.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ def __init__(self, environment, **kwargs):
2424
self.event = kwargs.get('event', None)
2525
self.group = kwargs.get('group', None)
2626
self.tags = kwargs.get('tags', None) or list()
27+
self.origin = kwargs.get('origin', None)
2728
self.customer = kwargs.get('customer', None)
2829
self.start_time = start_time
2930
self.end_time = end_time
@@ -47,6 +48,8 @@ def __init__(self, environment, **kwargs):
4748
self.priority = 6
4849
elif self.tags:
4950
self.priority = 7
51+
if self.origin:
52+
self.priority = 8
5053

5154
now = datetime.utcnow()
5255
if self.start_time <= now and self.end_time > now:
@@ -71,6 +74,8 @@ def __repr__(self):
7174
more += 'group=%r, ' % self.group
7275
if self.tags:
7376
more += 'tags=%r, ' % self.tags
77+
if self.origin:
78+
more += 'origin=%r, ' % self.origin
7479
if self.customer:
7580
more += 'customer=%r, ' % self.customer
7681

@@ -100,6 +105,7 @@ def parse(cls, json):
100105
event=json.get('event', None),
101106
group=json.get('group', None),
102107
tags=json.get('tags', list()),
108+
origin=json.get('origin', None),
103109
customer=json.get('customer', None),
104110
start_time=DateTime.parse(json.get('startTime')),
105111
end_time=DateTime.parse(json.get('endTime')),
@@ -119,6 +125,7 @@ def tabular(self, timezone=None):
119125
'event': self.event,
120126
'group': self.group,
121127
'tags': ','.join(self.tags),
128+
'origin': self.origin,
122129
'customer': self.customer,
123130
'startTime': DateTime.localtime(self.start_time, timezone),
124131
'endTime': DateTime.localtime(self.end_time, timezone),

docker-compose.ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ version: '3.7'
22

33
services:
44
api:
5-
image: docker.pkg.github.com/alerta/alerta/alerta-api:latest
5+
image: ghcr.io/alerta/alerta-api:latest
66
ports:
77
- "8080:8080"
88
depends_on:

tests/integration/test_blackouts.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,26 @@ def setUp(self):
1010

1111
def test_blackout(self):
1212
blackout = self.client.create_blackout(
13-
environment='Production', service=['Web', 'App'], resource='web01', event='node_down', group='Network', tags=['london', 'linux']
13+
environment='Production', service=['Web', 'App'], resource='web01', event='node_down', group='Network',
14+
tags=['london', 'linux'], origin='foo/bar'
1415
)
1516
blackout_id = blackout.id
1617

1718
self.assertEqual(blackout.environment, 'Production')
1819
self.assertEqual(blackout.service, ['Web', 'App'])
1920
self.assertIn('london', blackout.tags)
2021
self.assertIn('linux', blackout.tags)
22+
self.assertEqual(blackout.origin, 'foo/bar')
2123

22-
blackout = self.client.update_blackout(blackout_id, environment='Development', group='Network', text='updated blackout')
24+
blackout = self.client.update_blackout(blackout_id, environment='Development', group='Network',
25+
origin='foo/quux', text='updated blackout')
2326
self.assertEqual(blackout.environment, 'Development')
2427
self.assertEqual(blackout.group, 'Network')
28+
self.assertEqual(blackout.origin, 'foo/quux')
2529
self.assertEqual(blackout.text, 'updated blackout')
2630

2731
blackout = self.client.create_blackout(
28-
environment='Production', service=['Core'], group='Network'
32+
environment='Production', service=['Core'], group='Network', origin='foo/baz'
2933
)
3034

3135
blackouts = self.client.get_blackouts()

tests/unit/test_blackouts.py

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,42 +13,47 @@ def setUp(self):
1313
self.blackout = """
1414
{
1515
"blackout": {
16-
"createTime": "2018-08-26T20:45:04.622Z",
16+
"createTime": "2021-04-14T20:36:06.453Z",
1717
"customer": null,
1818
"duration": 3600,
19-
"endTime": "2018-08-26T21:45:04.622Z",
19+
"endTime": "2021-04-14T21:36:06.453Z",
2020
"environment": "Production",
21-
"event": null,
22-
"group": null,
23-
"href": "http://localhost:8080/blackout/e18a4be8-60d7-4ce2-9b3d-f18d814f7b85",
24-
"id": "e18a4be8-60d7-4ce2-9b3d-f18d814f7b85",
25-
"priority": 3,
26-
"remaining": 3599,
27-
"resource": null,
21+
"event": "node_down",
22+
"group": "Network",
23+
"href": "http://local.alerta.io:8080/blackout/5ed223a3-27dc-4c4c-97d1-504f107d8a1a",
24+
"id": "5ed223a3-27dc-4c4c-97d1-504f107d8a1a",
25+
"origin": "foo/xyz",
26+
"priority": 8,
27+
"remaining": 3600,
28+
"resource": "web01",
2829
"service": [
29-
"Network"
30+
"Web",
31+
"App"
3032
],
31-
"startTime": "2018-08-26T20:45:04.622Z",
33+
"startTime": "2021-04-14T20:36:06.453Z",
3234
"status": "active",
3335
"tags": [
34-
"london",
35-
"linux"
36+
"london",
37+
"linux"
3638
],
3739
"text": "Network outage in Bracknell",
38-
"user": "admin@alerta.io"
40+
"user": "admin@alerta.dev"
3941
},
40-
"id": "e18a4be8-60d7-4ce2-9b3d-f18d814f7b85",
42+
"id": "5ed223a3-27dc-4c4c-97d1-504f107d8a1a",
4143
"status": "ok"
4244
}
4345
"""
4446

4547
@requests_mock.mock()
4648
def test_blackout(self, m):
4749
m.post('http://localhost:8080/blackout', text=self.blackout)
48-
alert = self.client.create_blackout(environment='Production', service=[
49-
'Web', 'App'], resource='web01', event='node_down', group='Network', tags=['london', 'linux'])
50+
alert = self.client.create_blackout(environment='Production', service=['Web', 'App'], resource='web01',
51+
event='node_down', group='Network', tags=['london', 'linux'],
52+
origin='foo/xyz', text='Network outage in Bracknell')
5053
self.assertEqual(alert.environment, 'Production')
51-
self.assertEqual(alert.service, ['Network'])
54+
self.assertEqual(alert.service, ['Web', 'App'])
55+
self.assertEqual(alert.group, 'Network')
5256
self.assertIn('london', alert.tags)
57+
self.assertEqual(alert.origin, 'foo/xyz')
5358
self.assertEqual(alert.text, 'Network outage in Bracknell')
54-
self.assertEqual(alert.user, 'admin@alerta.io')
59+
self.assertEqual(alert.user, 'admin@alerta.dev')

0 commit comments

Comments
 (0)