Перейти к содержанию

Provisioning алертов и контакт-поинтов


Алерты: вы разобрались с ручным созданием в части VI. Теперь вопрос: как перенести это в Git?

Исторически сложилось так: алертинг в Grafana долго жил без полноценного Provisioning'а. Только с 2023 появились нормальные API и конфиги для него. В Grafana 13.1.3 Provisioning алертов полностью поддерживается — contact points, notification templates, mute timings, alert rules, notification policies.


Структура конфига

Всё это описывается в одном YAML-файле (или нескольких — Grafana читает все). Например:

apiVersion: 1

contactPoints:
  - orgId: 1
    name: default
    receivers:
      - uid: cp_one
        type: email
        settings:
          addresses: oncall@company.ru
          singleEmail: false

notificationPolicies:
  - orgId: 1
    receiver: default
    group_by: ["alertname", "severity"]
    group_wait: 30s
    group_interval: 5m
    repeat_interval: 12h
    routes:
      - receiver: db-oncall
        object_matchers:
          - ["service", "=", "database"]
        group_by: ["alertname"]
        mute_time_intervals: ["weekends"]

notificationTemplates:
  - orgId: 1
    name: company-slack
    template: |
      {{ define "company-slack.title" }}
        [{{ .Status }}] {{ .Labels.alertname }}
      {{ end }}

muteTimeIntervals:
  - orgId: 1
    name: weekends
    time_intervals:
      - weekdays: "saturday-sunday"

alertRules:
  - orgId: 1
    name: High CPU
    uid: rule-uid
    condition: B
    folderUID: folder-federal
    ruleGroup: main
    noDataState: Alerting
    execErrState: Error
    for: 5m
    annotations:
      summary: "High CPU usage on {{ $labels.instance }}"
      description: "CPU used over 90% for 5 minutes"
      runbook_url: "https://wiki.company.run/alerts/high-cpu.md"
    labels:
      severity: warning
    data:
      - refId: A
        relativeTimeRange:
          from: 600
          to: 0
        model:
          expr: avg by(instance) (rate(node_cpu_seconds_total{mode!="idle"}[5m])) > 0.9

Поле data содержит query-ы от источников данных. relativeTimeRange — это "откат назад" на 600 секунд. RefId — ссылки внутри движка алертов.

Важно! Провайдер дашбордов управляет JSON-файлами. Провайдер алертов — YAML-файлами. Это разные провайдеры, они не связаны.


Group by и маршрутизация

В Object matchers можно ссылаться на метки label — они берутся из алерта. Синтаксис object_matchers использует тот же язык выражений что и сам алертинг — читайте доку Grafana.

Пример: [["service", "=", "database"]] — все алерты, где service метка равна "database", пойдут ресиверу "db-oncall".


Как применять

Grafana ищет в provisioning/alerting/*.yml и загружает все ресурсы. При изменении достаточно перезапустить Grafana или, в версии 13.1.3, послать SIGHUP для перечитывания provisioning/ без рестарта.

Mute Timings provisioning

Mute timings — это окна тишины. Их можно задать как в локальной зоне, так и глобально. В конфиге — как выше. Важно: time_intervals — массив; каждый элемент содержит недельные дни и часть дня (часы). Например, ночные выходные:

  - weekdays: "friday"
    times:
      - start_time: "20:00"
        end_time: "23:59"
  - weekdays: "saturday-sunday"

Проверьте документацию: синтаксис times стыкуется с IANA time zone.



Далее: Provisioning плагинов