Introduce AlertManager v2 integration with improved internal behaviour it's using grouping from AlertManager, not trying to re-group alerts on OnCall side. Existing AlertManager and Grafana Alerting integrations are marked as Legacy with options to migrate them manually now or be migrated automatically after DEPRECATION DATE(TBD). Integration urls and public api responses stay the same both for legacy and new integrations. --------- Co-authored-by: Rares Mardare <rares.mardare@grafana.com> Co-authored-by: Joey Orlando <joey.orlando@grafana.com>
240 lines
8.1 KiB
Python
240 lines
8.1 KiB
Python
# Main
|
|
enabled = True
|
|
title = "Grafana"
|
|
slug = "grafana"
|
|
short_description = "Other Grafana"
|
|
description = None
|
|
is_displayed_on_web = True
|
|
is_featured = False
|
|
is_able_to_autoresolve = True
|
|
is_demo_alert_enabled = True
|
|
based_on_alertmanager = True
|
|
|
|
|
|
# Default templates
|
|
slack_title = """\
|
|
{# Usually title is located in payload.labels.alertname #}
|
|
{% set title = payload.get("title", "") or payload.get("labels", {}).get("alertname", "No title (check Web Title Template)") %}
|
|
{# Combine the title from different built-in variables into slack-formatted url #}
|
|
*<{{ grafana_oncall_link }}|#{{ grafana_oncall_incident_id }} {{ title }}>* via {{ integration_name }}
|
|
{% if source_link %}
|
|
(*<{{ source_link }}|source>*)
|
|
{%- endif %}
|
|
"""
|
|
|
|
slack_message = """\
|
|
{{- payload.message }}
|
|
{%- for value in payload.get("evalMatches", []) %}
|
|
*{{ value.metric }}*: {{ value.value }}
|
|
{% endfor -%}
|
|
{%- if "status" in payload -%}
|
|
*Status*: {{ payload.status }}
|
|
{% endif -%}
|
|
{%- if "labels" in payload -%}
|
|
*Labels:* {% for k, v in payload["labels"].items() %}
|
|
{{ k }}: {{ v }}{% endfor %}
|
|
{% endif -%}
|
|
{%- if "annotations" in payload -%}
|
|
*Annotations:*
|
|
{%- for k, v in payload.get("annotations", {}).items() %}
|
|
{#- render annotation as slack markdown url if it starts with http #}
|
|
{{ k }}: {% if v.startswith("http") %} <{{v}}|here> {% else %} {{v}} {% endif -%}
|
|
{% endfor %}
|
|
{%- endif -%}
|
|
"""
|
|
|
|
slack_image_url = """\
|
|
{{- payload.get(imageUrl) -}}
|
|
"""
|
|
|
|
web_title = """\
|
|
{# Usually title is located in payload.labels.alertname #}
|
|
{{- payload.get("title", "") or payload.get("labels", {}).get("alertname", "No title (check Web Title Template)") }}
|
|
"""
|
|
|
|
web_message = """\
|
|
{{- payload.message }}
|
|
{% for value in payload.get("evalMatches", []) -%}
|
|
**{{ value.metric }}**: {{ value.value }}
|
|
{% endfor %}
|
|
{%- if "status" in payload %}
|
|
**Status**: {{ payload.status }}
|
|
{% endif -%}
|
|
{%- if "labels" in payload -%}
|
|
**Labels:** {% for k, v in payload["labels"].items() %}
|
|
*{{ k }}*: {{ v }}{% endfor %}
|
|
{% endif -%}
|
|
{%- if "annotations" in payload -%}
|
|
**Annotations:**
|
|
{%- for k, v in payload.get("annotations", {}).items() %}
|
|
{#- render annotation as markdown url if it starts with http #}
|
|
*{{ k }}*: {% if v.startswith("http") %} [here]({{v}}){% else %} {{v}} {% endif -%}
|
|
{% endfor %}
|
|
{% endif -%}
|
|
"""
|
|
|
|
web_image_url = slack_image_url
|
|
|
|
sms_title = """\
|
|
{{ payload.get("ruleName", "") or payload.get("labels", {}).get("alertname", "Title undefined") }}
|
|
"""
|
|
|
|
phone_call_title = sms_title
|
|
|
|
telegram_title = sms_title
|
|
|
|
telegram_message = """\
|
|
{{- payload.messsage }}
|
|
{%- for value in payload.get("evalMatches", []) %}
|
|
<b>{{ value.metric }}:</b> {{ value.value }}
|
|
{% endfor -%}
|
|
{%- if "status" in payload -%}
|
|
<b>Status</b>: {{ payload.status }}
|
|
{% endif -%}
|
|
{%- if "labels" in payload -%}
|
|
<b>Labels:</b> {% for k, v in payload["labels"].items() %}
|
|
{{ k }}: {{ v }}{% endfor %}
|
|
{% endif -%}
|
|
{%- if "annotations" in payload -%}
|
|
<b>Annotations:</b>
|
|
{%- for k, v in payload.get("annotations", {}).items() %}
|
|
{#- render annotation as markdown url if it starts with http #}
|
|
{{ k }}: {{ v }}
|
|
{% endfor %}
|
|
{%- endif -%}
|
|
"""
|
|
|
|
telegram_image_url = slack_image_url
|
|
|
|
source_link = """\
|
|
{{ payload.get("ruleUrl", "") or payload.generatorURL }}
|
|
"""
|
|
|
|
grouping_id = """\
|
|
{{ payload.get("ruleName", "") or payload.get("labels", {}).get("alertname", "No title (check Web Title Template)") }}
|
|
"""
|
|
|
|
resolve_condition = """\
|
|
{{ payload.get("state") == "ok" or payload.get("status", "") == "resolved" }}
|
|
"""
|
|
|
|
acknowledge_condition = None
|
|
|
|
tests = {
|
|
"payload": {
|
|
"endsAt": "0001-01-01T00:00:00Z",
|
|
"labels": {
|
|
"job": "kube-state-metrics",
|
|
"instance": "10.143.139.7:8443",
|
|
"job_name": "email-tracking-perform-initialization-1.0.50",
|
|
"severity": "warning",
|
|
"alertname": "KubeJobCompletion",
|
|
"namespace": "default",
|
|
"prometheus": "monitoring/k8s",
|
|
},
|
|
"status": "firing",
|
|
"startsAt": "2019-12-13T08:57:35.095800493Z",
|
|
"annotations": {
|
|
"message": "Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete.",
|
|
"runbook_url": "https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion",
|
|
},
|
|
"generatorURL": (
|
|
"https://localhost/prometheus/graph?g0.expr=kube_job_spec_completions%7Bjob%3D%22kube-state-metrics%22%7D"
|
|
"+-+kube_job_status_succeeded%7Bjob%3D%22kube-state-metrics%22%7D+%3E+0&g0.tab=1"
|
|
),
|
|
},
|
|
"slack": {
|
|
"title": (
|
|
"*<{web_link}|#1 KubeJobCompletion>* via {integration_name} "
|
|
"(*<"
|
|
"https://localhost/prometheus/graph?g0.expr=kube_job_spec_completions%7Bjob%3D%22kube-state-metrics%22%7D"
|
|
"+-+kube_job_status_succeeded%7Bjob%3D%22kube-state-metrics%22%7D+%3E+0&g0.tab=1"
|
|
"|source>*)"
|
|
),
|
|
"message": (
|
|
"*Status*: firing\n"
|
|
"*Labels:* \n"
|
|
"job: kube-state-metrics\n"
|
|
"instance: 10.143.139.7:8443\n"
|
|
"job_name: email-tracking-perform-initialization-1.0.50\n"
|
|
"severity: warning\n"
|
|
"alertname: KubeJobCompletion\n"
|
|
"namespace: default\n"
|
|
"prometheus: monitoring/k8s\n"
|
|
"*Annotations:*\n"
|
|
"message: Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete. \n"
|
|
"runbook_url: <https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion|here> "
|
|
),
|
|
"image_url": None,
|
|
},
|
|
"web": {
|
|
"title": "KubeJobCompletion",
|
|
"message": """\
|
|
<p><strong>Status</strong>: firing <br/>
|
|
<strong>Labels:</strong> <br/>
|
|
<em>job</em>: kube-state-metrics <br/>
|
|
<em>instance</em>: 10.143.139.7:8443 <br/>
|
|
<em>job_name</em>: email-tracking-perform-initialization-1.0.50 <br/>
|
|
<em>severity</em>: warning <br/>
|
|
<em>alertname</em>: KubeJobCompletion <br/>
|
|
<em>namespace</em>: default <br/>
|
|
<em>prometheus</em>: monitoring/k8s <br/>
|
|
<strong>Annotations:</strong> <br/>
|
|
<em>message</em>: Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete. <br/>
|
|
<em>runbook_url</em>: <a href="https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion" rel="nofollow noopener" target="_blank">here</a> </p>""", # noqa
|
|
"image_url": None,
|
|
},
|
|
"sms": {
|
|
"title": "KubeJobCompletion",
|
|
},
|
|
"phone_call": {
|
|
"title": "KubeJobCompletion",
|
|
},
|
|
"telegram": {
|
|
"title": "KubeJobCompletion",
|
|
"message": (
|
|
"<b>Status</b>: firing\n"
|
|
"<b>Labels:</b> \n"
|
|
"job: kube-state-metrics\n"
|
|
"instance: 10.143.139.7:8443\n"
|
|
"job_name: email-tracking-perform-initialization-1.0.50\n"
|
|
"severity: warning\n"
|
|
"alertname: KubeJobCompletion\n"
|
|
"namespace: default\n"
|
|
"prometheus: monitoring/k8s\n"
|
|
"<b>Annotations:</b>\n"
|
|
"message: Job default/email-tracking-perform-initialization-1.0.50 is taking more than one hour to complete.\n\n"
|
|
"runbook_url: https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubejobcompletion\n"
|
|
),
|
|
"image_url": None,
|
|
},
|
|
"group_distinction": "c6bf5494a2d3052459b4dac837e41455",
|
|
"is_resolve_signal": False,
|
|
"is_acknowledge_signal": False,
|
|
}
|
|
|
|
# Miscellaneous
|
|
example_payload = {
|
|
"receiver": "amixr",
|
|
"status": "firing",
|
|
"alerts": [
|
|
{
|
|
"status": "firing",
|
|
"labels": {
|
|
"alertname": "TestAlert",
|
|
"region": "eu-1",
|
|
},
|
|
"annotations": {"description": "This alert was sent by user for demonstration purposes"},
|
|
"startsAt": "2018-12-25T15:47:47.377363608Z",
|
|
"endsAt": "0001-01-01T00:00:00Z",
|
|
"generatorURL": "",
|
|
"amixr_demo": True,
|
|
}
|
|
],
|
|
"groupLabels": {},
|
|
"commonLabels": {},
|
|
"commonAnnotations": {},
|
|
"externalURL": "http://f1d1ef51d710:9093",
|
|
"version": "4",
|
|
"groupKey": "{}:{}",
|
|
}
|