Add dashboard UID auto-generation and Gitea CI workflow
Some checks failed
terraform-dev / validate (push) Failing after 1m53s
terraform-dev / plan (push) Has been skipped
terraform-dev / apply (push) Has been skipped

This commit is contained in:
Alexandr
2026-03-25 06:41:19 +03:00
parent 345c5786b3
commit 558a23d916
83 changed files with 53372 additions and 1 deletions

View File

@ -0,0 +1,33 @@
locals {
# Default template for Telegram messages
default_telegram_message_template = try(
fileexists("${path.module}/template/alerts_message_tg.template") ?
replace(file("${path.module}/template/alerts_message_tg.template"), "__ORG_ID__", var.org_id) :
"Default message template",
"Default message template"
)
# Preparing settings for each contact point
contact_point_templates = {
for cp in var.contact_points :
cp.name => {
name = cp.name
type = cp.type
settings = cp.settings
# Check and load template from variables if specified and file exists
template = try(
(cp.settings["template"] != null && fileexists(cp.settings["template"])) ?
replace(replace(replace(file(cp.settings["template"]), "__ENV__", var.env), "__ORG_ID__", var.org_id), "__GRAFANA_URL__", var.grafana_url) :
local.default_telegram_message_template,
local.default_telegram_message_template
)
# Check and load title template if specified and file exists
title = try(
(cp.settings["title_template"] != null && fileexists(cp.settings["title_template"])) ?
replace(replace(replace(file(cp.settings["title_template"]), "__ENV__", var.env), "__ORG_ID__", var.org_id), "__GRAFANA_URL__", var.grafana_url) :
null,
null
)
}
}
}

View File

@ -0,0 +1,26 @@
resource "grafana_contact_point" "contact_points" {
for_each = { for cp in var.contact_points : "${cp.name}_${cp.type}" => cp }
org_id = var.org_id
name = each.value.name
disable_provenance = var.disable_provenance
dynamic "telegram" {
for_each = each.value.type == "telegram" ? [1] : []
content {
chat_id = each.value.settings["chat_id"]
token = each.value.settings["bot_token"]
message = local.contact_point_templates[each.value.name].template
parse_mode = "HTML"
}
}
dynamic "slack" {
for_each = each.value.type == "slack" ? [1] : []
content {
url = each.value.settings["webhook_url"]
title = try(local.contact_point_templates[each.value.name].title, null)
text = local.contact_point_templates[each.value.name].template
}
}
}

View File

@ -0,0 +1,4 @@
output "contact_point_ids" {
description = "Mapping of contact point names to their IDs"
value = { for k, v in grafana_contact_point.contact_points : k => v.id }
}

View File

@ -0,0 +1,144 @@
{{- define "print_links" -}}
{{- /* Panel link and GeneratorURL are both primary references */ -}}
{{- if .PanelURL -}}
[📊 Graph]({{ .PanelURL }})
{{- else -}}
{{- if and .Labels (index .Labels "panel_id") -}}
{{- $dashboard_uid := index .Labels "dashboard_uid" -}}
{{- if not $dashboard_uid -}}
{{- $service := index .Labels "service" -}}
{{- if $service -}}
{{- $dashboard_uid = printf "%s-dashboard" $service -}}
{{- end -}}
{{- end -}}
{{- if $dashboard_uid -}}
{{- $url := printf "__GRAFANA_URL__/d/%s?orgId=__ORG_ID__&viewPanel=%s&refresh=2s" $dashboard_uid (index .Labels "panel_id") -}}
[📊 Graph]({{ $url }})
{{- end -}}
{{- end -}}
{{- end -}}
{{- if and (eq .Status "firing") (.GeneratorURL) -}}
{{- " " -}}[⚡ Check Alert]({{ .GeneratorURL }})
{{- end -}}
{{- if and (eq .Status "firing") (.SilenceURL) -}}
{{- " " -}}[🤐 Mute]({{ .SilenceURL }})
{{- end -}}
{{- if .DashboardURL -}}
{{- " " -}}[📈 Dashboard]({{ .DashboardURL }})
{{- end -}}
{{- end -}}
{{- define "print_alert" -}}
{{- $status := "" -}}
{{- $severity := "" -}}
{{- if index .Labels "severity" -}}
{{- $severity = index .Labels "severity" -}}
{{- end -}}
{{- if eq .Status "resolved" -}}
{{- $status = "🟢" -}}
{{- else if eq $severity "disaster" -}}
{{- $status = "🔴" -}}
{{- else if eq $severity "critical" -}}
{{- $status = "🟣" -}}
{{- else if eq $severity "performance" -}}
{{- $status = "🟡" -}}
{{- else -}}
{{- $status = "🟠" -}}
{{- end -}}
{{- $summary := index .Annotations "summary" -}}
{{- $description := index .Annotations "description" -}}
{{- $alertname := index .Labels "alertname" -}}
{{- if or (eq $alertname "DatasourceNoData") (eq $alertname "DatasourceError") -}}
{{- $summary = $alertname -}}
{{- $alertname = index .Labels "rulename" -}}
{{- end -}}
{{- $instance := index .Labels "instance" -}}
{{- $service := "" -}}
{{- if index .Labels "service" -}}
{{- $service = index .Labels "service" -}}
{{- end -}}
{{ $status }} **{{ $instance }}**{{ "\n" }}
{{- if $service -}}
{{ $service }}: {{ $alertname }}{{ "\n" }}
{{- else -}}
{{ $alertname }}{{ "\n" }}
{{- end -}}
{{- if eq $severity "disaster" -}}🚨 {{ $summary }}{{ "\n" }}
{{- else if eq $severity "critical" -}}🚨 {{ $summary }}{{ "\n" }}
{{- else if eq $severity "performance" -}}🐌 {{ $summary }}{{ "\n" }}
{{- else -}}⚠️ {{ $summary }}{{ "\n" }}
{{- end -}}
{{- if $description -}}
{{- "\n" -}}
{{ $description }}{{ "\n" }}
{{- end -}}
{{- $common_labels := coll.Dict "environment" "__ENV__" -}}
{{- range $label, $value := $common_labels -}}
`{{ $label }}: {{ $value }}`{{ "\n" }}
{{- end -}}
{{- $has_labels := false -}}
{{- range $label, $value := .Labels -}}
{{- if and (ne $label "alertname") (ne $label "datasource_uid") (ne $label "grafana_folder") (ne $label "job")
(ne $label "details") (ne $label "ref_id") (ne $label "rulename") (ne $label "instance")
(ne $label "service") (ne $label "severity") (ne $label "dashboard_uid") (ne $label "panel_id")
(ne $label "ip_version") (ne $label "ip") (ne $label "hostname") (ne $label "role") (ne $label "team")
(ne $label "id") (ne $label "endpoint") (ne $label "hostgroup") (ne $label "module")
(ne $label "servername") (ne $label "type") (ne $label "vm_project_id") (ne $label "vm_account_id") -}}
{{- $has_labels = true -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $has_labels -}}
{{- range $label, $value := .Labels -}}
{{- if and (ne $label "alertname") (ne $label "datasource_uid") (ne $label "grafana_folder") (ne $label "job")
(ne $label "details") (ne $label "ref_id") (ne $label "rulename") (ne $label "instance")
(ne $label "service") (ne $label "severity") (ne $label "dashboard_uid") (ne $label "panel_id")
(ne $label "ip_version") (ne $label "ip") (ne $label "hostname") (ne $label "role") (ne $label "team")
(ne $label "id") (ne $label "endpoint") (ne $label "hostgroup") (ne $label "module")
(ne $label "servername") (ne $label "type") (ne $label "vm_project_id") (ne $label "vm_account_id") -}}
`{{ $label }}: {{ $value }}`{{ "\n" }}
{{- end -}}
{{- end -}}
{{- end -}}
{{- if eq .Status "firing" -}}
{{- "\n" -}}
{{- template "print_links" . -}}
{{- end -}}
{{- end -}}
{{- define "print_alerts" -}}
{{- range $index, $alert := . -}}
{{- if ne $index 0 -}}
{{ "---" }}{{ "\n" }}
{{- end -}}
{{- template "print_alert" $alert -}}
{{- end -}}
{{- end -}}
{{- with .Alerts -}}
{{- if .Firing -}}
**🔥 Firing Alerts**{{ "\n" }}
{{ "---" }}{{ "\n" }}
{{- template "print_alerts" .Firing -}}
{{- end -}}
{{- if and .Firing .Resolved -}}
{{ "\n\n" }}
{{- end -}}
{{- if .Resolved -}}
**✅ Resolved Alerts**{{ "\n" }}
{{ "---" }}{{ "\n" }}
{{- template "print_alerts" .Resolved -}}
{{- end -}}
{{- end -}}

View File

@ -0,0 +1,127 @@
{{- define "print_links" -}}
{{- /* Panel link and GeneratorURL are both primary references */ -}}
{{- if .PanelURL -}}
<{{ .PanelURL }}|📊 Graph>
{{- else -}}
{{- /* Use dashboard_uid and panel_id from labels with fallback to service-based dashboard_uid */ -}}
{{- if and .Labels (index .Labels "panel_id") -}}
{{- $dashboard_uid := index .Labels "dashboard_uid" -}}
{{- if not $dashboard_uid -}}
{{- $service := index .Labels "service" -}}
{{- if $service -}}
{{- $dashboard_uid = printf "%s-dashboard" $service -}}
{{- end -}}
{{- end -}}
{{- if and $dashboard_uid -}}
{{- $url := printf "__GRAFANA_URL__/d/%s?orgId=__ORG_ID__&viewPanel=%s&refresh=2s" $dashboard_uid (index .Labels "panel_id") -}}
<{{ $url }}|📊 Graph>
{{- end -}}
{{- end -}}
{{- end -}}
{{- if and (eq .Status "firing") (.GeneratorURL) -}}
{{- " " -}}<{{ .GeneratorURL }}|⚡ Check Alert>
{{- end -}}
{{- if and (eq .Status "firing") (.SilenceURL) -}}
{{- " " -}}<{{ .SilenceURL }}|🤐 Mute>
{{- end -}}
{{- if .DashboardURL -}}
{{- " " -}}<{{ .DashboardURL }}|dashboard>
{{- end -}}
{{- end -}}
{{- define "print_alert" -}}
{{- $status := "" -}}
{{- $severity := "" -}}
{{- if index .Labels "severity" -}}
{{- $severity = index .Labels "severity" -}}
{{- end -}}
{{- if eq .Status "resolved" -}}
{{- $status = "🟢" -}}
{{- else if eq $severity "disaster" -}}
{{- $status = "🔴" -}}
{{- else if eq $severity "critical" -}}
{{- $status = "🔴" -}}
{{- else if eq $severity "performance" -}}
{{- $status = "🟡" -}}
{{- else -}}
{{- $status = "🟠" -}}
{{- end -}}
{{- $summary := index .Annotations "summary" -}}
{{- $description := index .Annotations "description" -}}
{{- $alertname := index .Labels "alertname" -}}
{{- if or (eq $alertname "DatasourceNoData") (eq $alertname "DatasourceError") -}}
{{- $summary = $alertname -}}
{{- $alertname = index .Labels "rulename" -}}
{{- end -}}
{{- $instance := index .Labels "instance" -}}
{{- $service := "" -}}
{{- if index .Labels "service" -}}
{{- $service = index .Labels "service" -}}
{{- end -}}
{{ $status }} **{{ $instance }}** {{ "\n" }}
{{- if $service -}}
{{ $service }}: {{ $alertname }}{{ "\n" }}
{{- else -}}
{{ $alertname }}{{ "\n" }}
{{- end -}}
{{ "\n" }}
{{- if eq $severity "disaster" -}}🚨 {{ $summary }}{{ "\n" }}
{{- else if eq $severity "critical" -}}🚨 {{ $summary }}{{ "\n" }}
{{- else if eq $severity "performance" -}}🐌 {{ $summary }}{{ "\n" }}
{{- else -}}⚠️ {{ $summary }}{{ "\n" }}
{{- end -}}
{{- if $description -}}
{{- "\n" -}}
{{ $description }}{{ "\n" }}
{{- end -}}
{{- $has_labels := false -}}
{{- range $label, $value := .Labels -}}
{{- if and (ne $label "alertname") (ne $label "datasource_uid") (ne $label "grafana_folder") (ne $label "job") (ne $label "details") (ne $label "ref_id") (ne $label "rulename") (ne $label "instance") (ne $label "service") (ne $label "severity") (ne $label "dashboard_uid") (ne $label "panel_id") (ne $label "ip_version") (ne $label "ip") (ne $label "hostname") (ne $label "role") (ne $label "team") (ne $label "id") (ne $label "endpoint") (ne $label "hostgroup") (ne $label "module") (ne $label "servername") (ne $label "type") (ne $label "vm_project_id") (ne $label "vm_account_id") (ne $label "environment") (ne $label "rack") (ne $label "server_type") -}}
{{- $has_labels = true -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $has_labels -}}
{{- range $label, $value := .Labels -}}
{{- if and (ne $label "alertname") (ne $label "datasource_uid") (ne $label "grafana_folder") (ne $label "job") (ne $label "details") (ne $label "ref_id") (ne $label "rulename") (ne $label "instance") (ne $label "service") (ne $label "severity") (ne $label "dashboard_uid") (ne $label "panel_id") (ne $label "ip_version") (ne $label "ip") (ne $label "hostname") (ne $label "role") (ne $label "team") (ne $label "id") (ne $label "endpoint") (ne $label "hostgroup") (ne $label "module") (ne $label "servername") (ne $label "type") (ne $label "vm_project_id") (ne $label "vm_account_id") (ne $label "environment") (ne $label "rack") (ne $label "server_type") -}}
{{ $label }}: {{ $value }}{{ "\n" }}
{{- end -}}
{{- end -}}
{{- end -}}
{{- if eq .Status "firing" -}}
{{- if $has_labels -}}{{- "\n" -}}{{- end -}}
{{- template "print_links" . -}}
{{- end -}}
{{- end -}}
{{- define "print_alerts" -}}
{{- range $index, $alert := . -}}
{{- if ne $index 0 -}}
{{ "---" }}{{ "\n" }}
{{- end -}}
{{- template "print_alert" $alert -}}
{{- end -}}
{{- end -}}
{{- with .Alerts -}}
{{- if .Firing -}}
**🔥 Firing Alerts**{{ "\n" }}
{{ "---" }}{{ "\n" }}
{{- template "print_alerts" .Firing -}}
{{- end -}}
{{- if and .Firing .Resolved -}}
{{ "\n\n" }}
{{- end -}}
{{- if .Resolved -}}
**✅ Resolved Alerts**{{ "\n" }}
{{ "---" }}{{ "\n" }}
{{- template "print_alerts" .Resolved -}}
{{- end -}}
{{- end -}}

View File

@ -0,0 +1,127 @@
{{- define "print_links" -}}
{{- /* Panel link and GeneratorURL are both primary references */ -}}
{{- if .PanelURL -}}
<{{ .PanelURL }}|📊 Graph>
{{- else -}}
{{- /* Use dashboard_uid and panel_id from labels with fallback to service-based dashboard_uid */ -}}
{{- if and .Labels (index .Labels "panel_id") -}}
{{- $dashboard_uid := index .Labels "dashboard_uid" -}}
{{- if not $dashboard_uid -}}
{{- $service := index .Labels "service" -}}
{{- if $service -}}
{{- $dashboard_uid = printf "%s-dashboard" $service -}}
{{- end -}}
{{- end -}}
{{- if and $dashboard_uid -}}
{{- $url := printf "__GRAFANA_URL__/d/%s?orgId=__ORG_ID__&viewPanel=%s&refresh=2s" $dashboard_uid (index .Labels "panel_id") -}}
<{{ $url }}|📊 Graph>
{{- end -}}
{{- end -}}
{{- end -}}
{{- if and (eq .Status "firing") (.GeneratorURL) -}}
{{- " " -}}<{{ .GeneratorURL }}|⚡ Check Alert>
{{- end -}}
{{- if and (eq .Status "firing") (.SilenceURL) -}}
{{- " " -}}<{{ .SilenceURL }}|🤐 Mute>
{{- end -}}
{{- if .DashboardURL -}}
{{- " " -}}<{{ .DashboardURL }}|dashboard>
{{- end -}}
{{- end -}}
{{- define "print_alert" -}}
{{- $status := "" -}}
{{- $severity := "" -}}
{{- if index .Labels "severity" -}}
{{- $severity = index .Labels "severity" -}}
{{- end -}}
{{- if eq .Status "resolved" -}}
{{- $status = "🟢" -}}
{{- else if eq $severity "disaster" -}}
{{- $status = "🔴" -}}
{{- else if eq $severity "critical" -}}
{{- $status = "🔴" -}}
{{- else if eq $severity "performance" -}}
{{- $status = "🟡" -}}
{{- else -}}
{{- $status = "🟠" -}}
{{- end -}}
{{- $summary := index .Annotations "summary" -}}
{{- $description := index .Annotations "description" -}}
{{- $alertname := index .Labels "alertname" -}}
{{- if or (eq $alertname "DatasourceNoData") (eq $alertname "DatasourceError") -}}
{{- $summary = $alertname -}}
{{- $alertname = index .Labels "rulename" -}}
{{- end -}}
{{- $instance := index .Labels "instance" -}}
{{- $service := "" -}}
{{- if index .Labels "service" -}}
{{- $service = index .Labels "service" -}}
{{- end -}}
{{ $status }} **{{ $instance }}** {{ "\n" }}
{{- if $service -}}
{{ $service }}: {{ $alertname }}{{ "\n" }}
{{- else -}}
{{ $alertname }}{{ "\n" }}
{{- end -}}
{{ "\n" }}
{{- if eq $severity "disaster" -}}🚨 {{ $summary }}{{ "\n" }}
{{- else if eq $severity "critical" -}}🚨 {{ $summary }}{{ "\n" }}
{{- else if eq $severity "performance" -}}🐌 {{ $summary }}{{ "\n" }}
{{- else -}}⚠️ {{ $summary }}{{ "\n" }}
{{- end -}}
{{- if $description -}}
{{- "\n" -}}
{{- $description -}}{{ "\n" }}
{{- end -}}
{{- $has_labels := false -}}
{{- range $label, $value := .Labels -}}
{{- if and (ne $label "alertname") (ne $label "datasource_uid") (ne $label "grafana_folder") (ne $label "job") (ne $label "details") (ne $label "ref_id") (ne $label "rulename") (ne $label "instance") (ne $label "service") (ne $label "severity") (ne $label "dashboard_uid") (ne $label "panel_id") (ne $label "ip_version") (ne $label "ip") (ne $label "hostname") (ne $label "role") (ne $label "team") (ne $label "id") (ne $label "endpoint") (ne $label "hostgroup") (ne $label "module") (ne $label "servername") (ne $label "type") (ne $label "vm_project_id") (ne $label "vm_account_id") (ne $label "environment") (ne $label "rack") (ne $label "server_type") -}}
{{- $has_labels = true -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $has_labels -}}
{{- range $label, $value := .Labels -}}
{{- if and (ne $label "alertname") (ne $label "datasource_uid") (ne $label "grafana_folder") (ne $label "job") (ne $label "details") (ne $label "ref_id") (ne $label "rulename") (ne $label "instance") (ne $label "service") (ne $label "severity") (ne $label "dashboard_uid") (ne $label "panel_id") (ne $label "ip_version") (ne $label "ip") (ne $label "hostname") (ne $label "role") (ne $label "team") (ne $label "id") (ne $label "endpoint") (ne $label "hostgroup") (ne $label "module") (ne $label "servername") (ne $label "type") (ne $label "vm_project_id") (ne $label "vm_account_id") (ne $label "environment") (ne $label "rack") (ne $label "server_type") -}}
{{ $label }}: {{ $value }}{{ "\n" }}
{{- end -}}
{{- end -}}
{{- end -}}
{{- if eq .Status "firing" -}}
{{- if $has_labels -}}{{- "\n" -}}{{- end -}}
{{- template "print_links" . -}}
{{- end -}}
{{- end -}}
{{- define "print_alerts" -}}
{{- range $index, $alert := . -}}
{{- if ne $index 0 -}}
{{ "---" }}{{ "\n" }}
{{- end -}}
{{- template "print_alert" $alert -}}
{{- end -}}
{{- end -}}
{{- with .Alerts -}}
{{- if .Firing -}}
**🔥 Firing Alerts**{{ "\n" }}
{{ "---" }}{{ "\n" }}
{{- template "print_alerts" .Firing -}}
{{- end -}}
{{- if and .Firing .Resolved -}}
{{ "\n\n" }}
{{- end -}}
{{- if .Resolved -}}
**✅ Resolved Alerts**{{ "\n" }}
{{ "---" }}{{ "\n" }}
{{- template "print_alerts" .Resolved -}}
{{- end -}}
{{- end -}}

View File

@ -0,0 +1,138 @@
{{- define "print_links" -}}
{{- /* Panel link and GeneratorURL are both primary references */ -}}
{{- if .PanelURL -}}
[📊 Graph]({{ .PanelURL }})
{{- else -}}
{{- if and .Labels (index .Labels "panel_id") -}}
{{- $dashboard_uid := index .Labels "dashboard_uid" -}}
{{- if not $dashboard_uid -}}
{{- $service := index .Labels "service" -}}
{{- if $service -}}
{{- $dashboard_uid = printf "%s-dashboard" $service -}}
{{- end -}}
{{- end -}}
{{- if $dashboard_uid -}}
{{- $url := printf "__GRAFANA_URL__/d/%s?orgId=__ORG_ID__&viewPanel=%s&refresh=2s" $dashboard_uid (index .Labels "panel_id") -}}
[📊 Graph]({{ $url }})
{{- end -}}
{{- end -}}
{{- end -}}
{{- if and (eq .Status "firing") (.GeneratorURL) -}}
{{- " " -}}[⚡ Check Alert]({{ .GeneratorURL }})
{{- end -}}
{{- if and (eq .Status "firing") (.SilenceURL) -}}
{{- " " -}}[🤐 Mute]({{ .SilenceURL }})
{{- end -}}
{{- if .DashboardURL -}}
{{- " " -}}[📈 Dashboard]({{ .DashboardURL }})
{{- end -}}
{{- end -}}
{{- define "print_alert" -}}
{{- $status := "" -}}
{{- $severity := "" -}}
{{- if index .Labels "severity" -}}
{{- $severity = index .Labels "severity" -}}
{{- end -}}
{{- if eq .Status "resolved" -}}
{{- $status = "🟢" -}}
{{- else if eq $severity "disaster" -}}
{{- $status = "🔴" -}}
{{- else if eq $severity "critical" -}}
{{- $status = "🟣" -}}
{{- else if eq $severity "performance" -}}
{{- $status = "🟡" -}}
{{- else -}}
{{- $status = "🟠" -}}
{{- end -}}
{{- $summary := index .Annotations "summary" -}}
{{- $alertname := index .Labels "alertname" -}}
{{- if or (eq $alertname "DatasourceNoData") (eq $alertname "DatasourceError") -}}
{{- $summary = $alertname -}}
{{- $alertname = index .Labels "rulename" -}}
{{- end -}}
{{- $instance := index .Labels "instance" -}}
{{- $service := "" -}}
{{- if index .Labels "service" -}}
{{- $service = index .Labels "service" -}}
{{- end -}}
{{ $status }} **{{ $instance }}**{{ "\n" }}
{{- if $service -}}
{{ $service }}: {{ $alertname }}{{ "\n" }}
{{- else -}}
{{ $alertname }}{{ "\n" }}
{{- end -}}
{{- if eq $severity "disaster" -}}🚨 {{ $summary }}{{ "\n" }}
{{- else if eq $severity "critical" -}}🚨 {{ $summary }}{{ "\n" }}
{{- else if eq $severity "performance" -}}🐌 {{ $summary }}{{ "\n" }}
{{- else -}}⚠️ {{ $summary }}{{ "\n" }}
{{- end -}}
{{- $common_labels := coll.Dict "environment" "__ENV__" -}}
{{- range $label, $value := $common_labels -}}
`{{ $label }}: {{ $value }}`{{ "\n" }}
{{- end -}}
{{- $has_labels := false -}}
{{- range $label, $value := .Labels -}}
{{- if and (ne $label "alertname") (ne $label "datasource_uid") (ne $label "grafana_folder") (ne $label "job")
(ne $label "details") (ne $label "ref_id") (ne $label "rulename") (ne $label "instance")
(ne $label "service") (ne $label "severity") (ne $label "dashboard_uid") (ne $label "panel_id")
(ne $label "ip_version") (ne $label "ip") (ne $label "hostname") (ne $label "role") (ne $label "team")
(ne $label "id") (ne $label "endpoint") (ne $label "hostgroup") (ne $label "module")
(ne $label "servername") (ne $label "type") (ne $label "vm_project_id") (ne $label "vm_account_id") -}}
{{- $has_labels = true -}}
{{- break -}}
{{- end -}}
{{- end -}}
{{- if $has_labels -}}
{{- range $label, $value := .Labels -}}
{{- if and (ne $label "alertname") (ne $label "datasource_uid") (ne $label "grafana_folder") (ne $label "job")
(ne $label "details") (ne $label "ref_id") (ne $label "rulename") (ne $label "instance")
(ne $label "service") (ne $label "severity") (ne $label "dashboard_uid") (ne $label "panel_id")
(ne $label "ip_version") (ne $label "ip") (ne $label "hostname") (ne $label "role") (ne $label "team")
(ne $label "id") (ne $label "endpoint") (ne $label "hostgroup") (ne $label "module")
(ne $label "servername") (ne $label "type") (ne $label "vm_project_id") (ne $label "vm_account_id") -}}
`{{ $label }}: {{ $value }}`{{ "\n" }}
{{- end -}}
{{- end -}}
{{- end -}}
{{- if eq .Status "firing" -}}
{{- "\n" -}}
{{- template "print_links" . -}}
{{- end -}}
{{- end -}}
{{- define "print_alerts" -}}
{{- range $index, $alert := . -}}
{{- if ne $index 0 -}}
{{ "---" }}{{ "\n" }}
{{- end -}}
{{- template "print_alert" $alert -}}
{{- end -}}
{{- end -}}
{{- with .Alerts -}}
{{- if .Firing -}}
**🔥 Firing Alerts**{{ "\n" }}
{{ "---" }}{{ "\n" }}
{{- template "print_alerts" .Firing -}}
{{- end -}}
{{- if and .Firing .Resolved -}}
{{ "\n\n" }}
{{- end -}}
{{- if .Resolved -}}
**✅ Resolved Alerts**{{ "\n" }}
{{ "---" }}{{ "\n" }}
{{- template "print_alerts" .Resolved -}}
{{- end -}}
{{- end -}}

View File

@ -0,0 +1 @@
{{ if .Alerts.Firing }}[FIRING:{{ len .Alerts.Firing }}]{{ else }}[RESOLVED]{{ end }} {{ (index .Alerts 0).Labels.alertname }} at {{ (index .Alerts 0).Labels.instance }}

View File

@ -0,0 +1,60 @@
{{ define "custom_alert.title" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}: {{ .Alerts.Firing | len }}{{ if gt (.Alerts.Resolved | len) 0 }}, RESOLVED: {{ .Alerts.Resolved | len }}{{ end }}{{ end }}]{{ if gt (len .GroupLabels) 0 }} Grouped by: {{ range .CommonLabels.SortedPairs }}{{ .Name }}: {{ .Value }}{{ end }}{{ end }}{{ end }}
{{ define "__text_alert_name" }}{{ range .Labels.SortedPairs }}{{ if eq .Name "alertname" }}{{ .Value }}{{ end }}{{ end }}{{ end }}
{{ define "__text_alert_summary" }}{{ range .Annotations.SortedPairs }}{{ if eq .Name "summary" }}{{ .Value }}
{{ end }}{{ end }}{{ end }}
{{ define "__text_alert_description" }}{{ range .Annotations.SortedPairs }}{{ if eq .Name "description" }}{{ .Value }}{{ end }}{{ end }}{{ end }}
{{ define "__text_alert_runbook_url" }}{{ range .Annotations.SortedPairs }}{{ if eq .Name "runbook_url" }}
:bookmark_tabs: <{{ .Value }}|Playbook>{{ end }}{{ end }}{{ end }}
{{ define "__text_alert_firing_item" }}:bell:
{{ $alertName := (index .Labels "alertname") }}
Labels: {{ range .Labels.SortedPairs }}
{{- if ne .Name "alertname" }}
{{- if ne .Name "ref_id" }}
{{- if ne .Name "datasource_uid" }}
{{- if ne .Name "rule_uid" }}
- {{ if and (eq .Name "cluster") (eq $alertName "Kube-apiserver or blackbox is down") }}request_from_cluster{{ else }}{{ .Name }}{{ end }} = {{ .Value }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
Actions:
{{ if gt (len .DashboardURL) 0 }}➡️ <{{ .DashboardURL }}|Go to dashboard>{{ end }}
{{ if gt (len .PanelURL) 0 }}:chart_with_upwards_trend: <{{ .PanelURL }}|Go to panel>{{ end }}
{{ if gt (len .GeneratorURL) 0 }}:arrow_right: <{{ .GeneratorURL }}|Go to alert>{{ end }}
{{ if gt (len .SilenceURL) 0 }}:mute: <{{ .SilenceURL }}|Silence alert>{{ end }}{{ template "__text_alert_runbook_url" . }}{{ end }}
{{ define "__text_alert_resolved_item" }}:large_green_circle: {{ template "__text_alert_name" . }}
{{ $alertName := (index .Labels "alertname") }}
Labels: {{ range .Labels.SortedPairs }}
{{- if ne .Name "alertname" }}
{{- if ne .Name "ref_id" }}
{{- if ne .Name "datasource_uid" }}
{{- if ne .Name "rule_uid" }}
- {{ if and (eq .Name "cluster") (eq $alertName "Kube-apiserver or blackbox is down") }}request_from_cluster{{ else }}{{ .Name }}{{ end }} = {{ .Value }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
Actions:
{{ if gt (len .DashboardURL) 0 }}➡️ <{{ .DashboardURL }}|Go to dashboard>{{ end }}
{{ if gt (len .PanelURL) 0 }}:chart_with_upwards_trend: <{{ .PanelURL }}|Go to panel>{{ end }}
{{ if gt (len .GeneratorURL) 0 }}:arrow_right: <{{ .GeneratorURL }}|Go to alert>{{ end }}{{ end }}
{{ define "__text_alert_list_firing" }}{{ range . }}
{{ template "__text_alert_firing_item" . }}{{ end }}{{ end }}
{{ define "__text_alert_list_resolved" }}{{ range . }}
{{ template "__text_alert_resolved_item" . }}{{ end }}{{ end }}
{{ define "custom_alert.message" }}
{{ if gt (len .Alerts.Firing) 0 }}{{ .Alerts.Firing | len }} Firing{{ template "__text_alert_list_firing" .Alerts.Firing }}{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}{{ .Alerts.Resolved | len }} Resolved{{ template "__text_alert_list_resolved" .Alerts.Resolved }}{{ end }}{{ end }}

View File

@ -0,0 +1,70 @@
{{ define "telegram_message" }}
{{ if gt (len .Alerts.Firing) 0 }}
<b>🔥 {{ len .Alerts.Firing }} alert(s) firing:</b>
{{ range .Alerts.Firing }} {{ template "telegram_alert_firing" .}} {{ end }} {{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
<b>✅ {{ len .Alerts.Resolved }} alert(s) resolved:</b>
{{ range .Alerts.Resolved }} {{ template "telegram_alert_resolved" .}} {{ end }} {{ end }}
{{ end }}
{{ define "telegram_alert_firing" }}
<b>Value = </b>
{{- $value := .Values }}
{{- if ne (printf "%.1f" $value.A) "0.0" }}
{{- printf "%.1f" $value.A }}{{- end }}
{{- if ne (printf "%.1f" $value.B) "0.0" }} {{- printf "%.1f" $value.B }}{{- end }}
<b>Labels:</b>
{{- if index .Labels "name" }}
- Name = {{ index .Labels "name" }}
{{- end }}
{{- if index .Labels "instance" }}
- IP = {{ index .Labels "instance" }}
{{- end }}
{{- if index .Labels "Severity" }}
- Severity = {{ index .Labels "Severity" }}
{{- end }}
{{- if index .Labels "grafana_folder" }}
- Grafana_folder = {{ index .Labels "grafana_folder" }}
{{- end }}
{{- if index .Labels "volume" }}
- Volume = {{ index .Labels "volume" }}
{{- end }}
{{- if index .Labels "mountpoint" }}
- Mountpoint = {{ index .Labels "mountpoint" }}
{{- end }}
{{- if index .Labels "job" }}
- OS = {{ index .Labels "job" }}
{{- end }}
{{- if index .Labels "loc" }}
- Location = {{ index .Labels "loc" }}
{{- end }}
{{ end }}
{{ define "telegram_alert_resolved" }}
<b>{{ .Labels.alertname }}</b>
Node: <b>{{ .Annotations.Node }}</b>
{{ .Annotations.AlertValues }}
<b>Labels:</b>
{{- if index .Labels "name" }}
- Name = {{ index .Labels "name" }}
{{- end }}
{{- if index .Labels "instance" }}
- IP = {{ index .Labels "instance" }}
{{- end }}
{{- if index .Labels "Severity" }}
- Severity = {{ index .Labels "Severity" }}
{{- end }}
{{- if index .Labels "grafana_folder" }}
- Grafana_folder = {{ index .Labels "grafana_folder" }}
{{- end }}
{{- if index .Labels "volume" }}
- Volume = {{ index .Labels "volume" }}
{{- end }}
{{- if index .Labels "mountpoint" }}
- Mountpoint = {{ index .Labels "mountpoint" }}
{{- end }}
{{- if index .Labels "job" }}
- OS = {{ index .Labels "job" }}
{{- end }}
{{- if index .Labels "loc" }}
- Location = {{ index .Labels "loc" }}
{{- end }}
{{ end }}

View File

@ -0,0 +1,29 @@
variable "contact_points" {
description = "List of contact points for Grafana alerts"
type = list(object({
name = string
type = string
settings = map(string)
}))
}
variable "disable_provenance" {
description = "Controls whether Grafana provisioning is disabled"
type = bool
default = true
}
variable "org_id" {
description = "ID of the Grafana organization"
type = string
}
variable "grafana_url" {
description = "Grafana URL"
type = string
}
variable "env" {
description = "Grafana environment"
type = string
}

View File

@ -0,0 +1,7 @@
terraform {
required_providers {
grafana = {
source = "grafana/grafana"
}
}
}