Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add fingerprints #172

Merged
merged 11 commits into from
Oct 2, 2020
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/) and [Keep a changelog](https://github.com/olivierlacan/keep-a-changelog).

## [Unreleased](https://github.com/idealista/prom2teams/tree/develop)
## Added
- *[#172](https://github.com/idealista/prom2teams/pull/172) Add fingerprint field to template data*

## Added
- *[#170](https://github.com/idealista/prom2teams/issues/170) Allow specifying multiple connectors* @krmichel
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -247,6 +247,9 @@ If such a field is not included a default value of 'unknown' is assigned.

All non-mandatory labels not in excluded list are injected in `extra_labels` key. All non-mandatory annotations not in excluded list are injected in `extra_annotations` key.

Alertmanager fingerprints are available in the `fingerprint` key. Fingerprints
are supported by Alertmanager 0.19.0 or greater.

## Documentation
### Swagger UI

6 changes: 4 additions & 2 deletions prom2teams/prometheus/message_schema.py
Original file line number Diff line number Diff line change
@@ -39,6 +39,7 @@ def get_alerts(self, message):
name = alert['labels']['alertname']
description = alert['annotations']['description']
severity = alert['labels']['severity']
fingerprint = alert.get('fingerprint', None)
extra_labels = dict()
extra_annotations = dict()

@@ -56,7 +57,7 @@ def get_alerts(self, message):
if key not in excluded_annotations and annotation_is_not_dict:
extra_annotations[key] = annotation

alert = PrometheusAlert(name, status, severity, summary, instance, description, extra_labels, extra_annotations)
alert = PrometheusAlert(name, status, severity, summary, instance, description, fingerprint, extra_labels, extra_annotations)
prom_alerts.append(alert)
return prom_alerts

@@ -88,12 +89,13 @@ class AnnotationSchema(Schema):


class PrometheusAlert:
def __init__(self, name, status, severity, summary, instance, description, extra_labels=None, extra_annotations=None):
def __init__(self, name, status, severity, summary, instance, description, fingerprint, extra_labels=None, extra_annotations=None):
self.name = name
self.status = status
self.severity = severity
self.summary = summary
self.instance = instance
self.description = description
self.fingerprint = fingerprint
self.extra_labels = extra_labels
self.extra_annotations = extra_annotations
10 changes: 7 additions & 3 deletions prom2teams/teams/alarm_mapper.py
Original file line number Diff line number Diff line change
@@ -9,7 +9,9 @@ def map_prom_alerts_to_teams_alarms(alerts):
for same_status_alerts in alerts:
for alert in alerts[same_status_alerts]:
alarm = TeamsAlarm(alert.name, alert.status.lower(), alert.severity,
alert.summary, alert.instance, alert.description, alert.extra_labels, alert.extra_annotations)
alert.summary, alert.instance, alert.description,
alert.fingerprint, alert.extra_labels,
alert.extra_annotations)
json_alarm = schema.dump(alarm)
teams_alarms.append(json_alarm)
return teams_alarms
@@ -29,6 +31,7 @@ def map_and_group(alerts, group_alerts_by):
teams_visualization(features["severity"]),
teams_visualization(features["status"]),
teams_visualization(features["summary"]))
fingerprint = teams_visualization(features["fingerprint"])
extra_labels = dict()
extra_annotations = dict()
for element in grouped_alerts[alert]:
@@ -38,7 +41,8 @@ def map_and_group(alerts, group_alerts_by):
extra_annotations = {**extra_annotations, **element.extra_annotations}

alarm = TeamsAlarm(name, status.lower(), severity, summary,
instance, description, extra_labels, extra_annotations)
instance, description, fingerprint, extra_labels,
extra_annotations)
json_alarm = schema.dump(alarm)
teams_alarms.append(json_alarm)
return teams_alarms
@@ -59,5 +63,5 @@ def group_alerts(alerts, group_alerts_by):

def group_features(alerts):
grouped_features = {feature: list(set([individual_alert.__dict__[feature] for individual_alert in alerts]))
for feature in ["name", "description", "instance", "severity", "status", "summary"]}
for feature in ["name", "description", "instance", "severity", "status", "summary", "fingerprint"]}
return grouped_features
4 changes: 3 additions & 1 deletion prom2teams/teams/teams_alarm_schema.py
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@ class Meta:
instance = fields.Str()
description = fields.Str()
name = fields.Str()
fingerprint = fields.Str()
extra_labels = fields.Dict(
keys=fields.Str(),
values=fields.Str(),
@@ -25,12 +26,13 @@ class Meta:


class TeamsAlarm:
def __init__(self, name, status, severity, summary, instance, description, extra_labels, extra_annotations):
def __init__(self, name, status, severity, summary, instance, description, fingerprint, extra_labels, extra_annotations):
self.name = name
self.status = status
self.severity = severity
self.summary = summary
self.instance = instance
self.description = description
self.fingerprint = fingerprint
self.extra_labels = extra_labels
self.extra_annotations = extra_annotations
7 changes: 7 additions & 0 deletions tests/test_json_fields.py
Original file line number Diff line number Diff line change
@@ -39,6 +39,13 @@ def test_json_without_instance_field(self):
alarm = map_prom_alerts_to_teams_alarms(alerts)[0]
self.assertEqual('unknown', str(alarm['instance']))

def test_fingerprint(self):
with open(self.TEST_CONFIG_FILES_PATH + 'all_ok.json') as json_data:
json_received = json.load(json_data)
alerts = MessageSchema().load(json_received)
alarm = map_prom_alerts_to_teams_alarms(alerts)[0]
self.assertEqual('dd19ae3d4e06ac55', str(alarm['fingerprint']))

def test_compose_all(self):
with open(os.path.join(self.TEST_CONFIG_FILES_PATH, 'all_ok.json')) as json_data:
with open(os.path.join(self.TEST_CONFIG_FILES_PATH, 'teams_alarm_all_ok.json')) as expected_data: