Use Terraform to provision alerting resources

Используйте Grafana Provider для Terraform, чтобы управлять вашими ресурсами оповещений и провижинить их в вашу систему Grafana. Поддержка Grafana Alerting в Terraform-провайдере упрощает создание, управление и поддержку всего вашего стека Grafana Alerting как кода.

Это руководство описывает шаги и ссылки для провижининга ресурсов оповещений с помощью Terraform. Для практической демонстрации вы можете клонировать и попробовать этот пример с использованием Grafana OSS и Docker Compose.

Чтобы создавать и управлять ресурсами оповещений с помощью Terraform, вам нужно выполнить следующие задачи.

  1. Создайте API-ключ для настройки провайдера Terraform.
  2. Создайте свои ресурсы оповещений в формате Terraform, для чего
  3. Запустите terraform apply, чтобы провижинить ваши ресурсы оповещений.

Перед началом у вас должен быть доступный экземпляр Grafana и установленный Terraform на вашей машине.

Create an API key and configure the Terraform provider

Вы можете создать токен сервисного аккаунта для аутентификации Terraform в Grafana. Чтобы создать API-ключ для провижининга ресурсов оповещений, выполните следующие шаги.

  1. Создайте новый сервисный аккаунт.
  2. Назначьте роль или разрешение для доступа к Alerting provisioning API.
  3. Создайте новый токен сервисного аккаунта.
  4. Назовите и сохраните токен для использования в Terraform.

Теперь вы можете перейти в рабочий каталог для ваших конфигураций Terraform и создать файл с именем main.tf, например:

main.tf
terraform {
    required_providers {
        grafana = {
            source = "grafana/grafana"
            version = ">= 2.9.0"
        }
    }
}

provider "grafana" {
    url = <grafana-url>
    auth = <api-key>
}

Замените следующие значения:

  • <grafana-url> на URL экземпляра Grafana.
  • <api-key> на ранее созданный API-токен.

Эта конфигурация Terraform устанавливает Grafana Terraform provider и аутентифицируется в вашем экземпляре Grafana с помощью API-токена. О других вариантах аутентификации, включая basic-аутентификацию, см. документацию по опции auth.

Для Grafana Cloud см. инструкции по управлению стеком Grafana Cloud с помощью Terraform. Для управления доступом на основе ролей см. Провижининг RBAC с помощью Terraform и роли провижининга оповещений (fixed:alerting.provisioning.*).

Create Terraform configurations for alerting resources

Grafana Terraform provider позволяет управлять следующими ресурсами оповещений.

В этом разделе мы создадим конфигурации Terraform для каждого ресурса оповещения и продемонстрируем, как связать их вместе.

Add alert rules

Правила оповещения позволяют получать оповещения, выполняя запросы к любым бэкенд-источникам данных Grafana.

  1. Сначала создайте источник данных для запросов и папку для хранения ваших правил.

    В этом примере используется источник данных TestData.

    terraform
    resource "grafana_data_source" "<terraform_data_source_name>" {
        name = "TestData"
        type = "testdata"
    }
    
    resource "grafana_folder" "<terraform_folder_name>" {
        title = "My Rule Folder"
    }

    Замените следующие значения полей:

    • <terraform_data_source_name> на terraform-имя источника данных.
    • <terraform_folder_name> на terraform-имя папки.
  2. Создайте или найдите правило оповещения, которое хотите импортировать в Grafana.

  3. Экспортируйте группу правил оповещения в формате Terraform. Это экспортирует группу правил оповещения как ресурс Terraform grafana_rule_group.

    Вы можете отредактировать экспортированный ресурс или создать ресурс с нуля.

    terraform
    resource "grafana_rule_group" "<terraform_rule_group_name>" {
        name = "My Alert Rules"
        folder_uid = grafana_folder.<terraform_folder_name>.uid
        interval_seconds = 60
        org_id = 1
    
        rule {
            name = "My Random Walk Alert"
            condition = "C"
            for = "0s"
    
            // Query the datasource.
            data {
                ref_id = "A"
                relative_time_range {
                    from = 600
                    to = 0
                }
                datasource_uid = grafana_data_source.<terraform_data_source_name>.uid
                // `model` is a JSON blob that sends datasource-specific data.
                // It's different for every datasource. The alert's query is defined here.
                model = jsonencode({
                    intervalMs = 1000
                    maxDataPoints = 43200
                    refId = "A"
                })
            }
    
            // The query was configured to obtain data from the last 60 seconds. Let's alert on the average value of that series using a Reduce stage.
            data {
                datasource_uid = "__expr__"
                // You can also create a rule in the UI, then GET that rule to obtain the JSON.
                // This can be helpful when using more complex reduce expressions.
                model = <<EOT
    {"conditions":[{"evaluator":{"params":[0,0],"type":"gt"},"operator":{"type":"and"},"query":{"params":["A"]},"reducer":{"params":[],"type":"last"},"type":"avg"}],"datasource":{"name":"Expression","type":"__expr__","uid":"__expr__"},"expression":"A","hide":false,"intervalMs":1000,"maxDataPoints":43200,"reducer":"last","refId":"B","type":"reduce"}
    EOT
                ref_id = "B"
                relative_time_range {
                    from = 0
                    to = 0
                }
            }
    
            // Now, let's use a math expression as our threshold.
            // We want to alert when the value of stage "B" above exceeds 70.
            data {
                datasource_uid = "__expr__"
                ref_id = "C"
                relative_time_range {
                    from = 0
                    to = 0
                }
                model = jsonencode({
                    expression = "$B > 70"
                    type = "math"
                    refId = "C"
                })
            }
        }
    }

    Замените следующие значения полей:

    • <terraform_rule_group_name> на имя группы правил оповещения.

    Обратите внимание, что различные ресурсы Grafana связаны через значения uid в их конфигурациях Terraform. Значение uid будет сгенерировано случайным образом при провижининге.

    Чтобы связать группу правил оповещения с соответствующим источником данных и папкой в этом примере, замените следующие значения полей:

    • <terraform_data_source_name> на terraform-имя ранее определённого источника данных.
    • <terraform_folder_name> на terraform-имя ранее определённой папки.
  4. Продолжайте добавлять другие ресурсы Grafana или используйте Terraform CLI для провижининга.

Add contact points

Contact points — это получатели уведомлений об оповещениях.

  1. Создайте или найдите contact points, которые хотите импортировать в Grafana. Либо напишите ресурс в коде, как показано в примере ниже.

  2. Экспортируйте contact point в формате Terraform. Это экспортирует contact point как ресурс Terraform grafana_contact_point — при необходимости отредактируйте его.

  3. В этом примере уведомления заглушаются на выходных.

    terraform
     resource "grafana_contact_point" "<terraform_contact_point_name>" {
         name = "My contact point email"
    
         email {
             addresses               = ["<email_address>"]
         }
     }

    Замените следующие значения полей:

    • <terraform_contact_point_name> на terraform-имя contact point. Оно будет использоваться для ссылки на contact point в других ресурсах Terraform.
    • <email_address> на адрес электронной почты для получения уведомлений об оповещениях.
  4. Продолжайте добавлять другие ресурсы Grafana или используйте Terraform CLI для провижининга.

Add and enable notification templates

Шаблоны уведомлений позволяют настраивать уведомления об оповещениях для нескольких contact points.

  1. Создайте или найдите группу шаблонов уведомлений, которую хотите импортировать в Grafana. Либо напишите ресурс в коде, как показано в примере ниже.

  2. Экспортируйте группу шаблонов уведомлений как ресурс Terraform grafana_message_template.

    В этом примере создаётся группа шаблонов уведомлений с именем custom_emails, которая определяет шаблон custom_email.message.

    terraform
     resource "grafana_message_template" "<terraform_message_template_name>" {
         name = "custom_emails"
    
         template = <<EOT
     {{ define "custom_email.message" }}
     Lorem ipsum - Custom alert!
     {{ end }}
     EOT
     }

    Это позволяет contact points использовать шаблоны уведомлений ({{ define "<NAME>"}}) в пределах группы шаблонов уведомлений.

  3. В предыдущем contact point включите шаблон, задав свойство email.message следующим образом.

    terraform
     resource "grafana_contact_point" "<terraform_contact_point_name>" {
         name = "My contact point email"
    
         email {
             addresses               = ["<email_address>"]
             message                 = "{{ template \"custom_email.message\" .}}"
         }
     }
  4. Продолжайте добавлять другие ресурсы Grafana или используйте Terraform CLI для провижининга.

Add mute timings

Mute timings приостанавливают уведомления об оповещениях на заранее определённые интервалы.

  1. Создайте или найдите mute timings, которые хотите импортировать в Grafana. Либо напишите ресурс в коде, как показано в примере ниже.

  2. Экспортируйте mute timing в формате Terraform. Это экспортирует mute timing как ресурс Terraform grafana_mute_timing — при необходимости отредактируйте его.

  3. В этом примере уведомления отключаются на выходных.

    terraform
     resource "grafana_mute_timing" "<terraform_mute_timing_name>" {
         name = "No weekends"
    
         intervals {
             weekdays = ["saturday", "sunday"]
         }
     }

    Замените следующие значения полей:

    • <terraform_mute_timing_name> на имя ресурса Terraform. Оно будет использоваться для ссылки на mute timing в дереве политик уведомлений Terraform.
  4. Продолжайте добавлять другие ресурсы Grafana или используйте Terraform CLI для провижининга.

Add the notification policy tree

Политики уведомлений определяют, как маршрутизировать экземпляры оповещений к вашим contact points.

Warning

Since the policy tree is a single resource, provisioning it will overwrite all policies in the notification policy tree. However, it does not affect internal policies created when alert rules directly select a contact point.

  1. Найдите дерево политик уведомлений по умолчанию. Либо напишите ресурс в коде, как показано в примере ниже.

  2. Экспортируйте дерево политик уведомлений в формате Terraform. Это экспортирует его как ресурс Terraform grafana_notification_policy — при необходимости отредактируйте его.

    terraform
    resource "grafana_notification_policy" "my_policy_tree" {
    contact_point = grafana_contact_point.<terraform_contact_point_name>.name
    ...
    
    policy {
        contact_point = grafana_contact_point.<terraform_contact_point_name>.name
    
        matcher {...}
    
        mute_timings = [grafana_mute_timing.<terraform_mute_timing_name>.name]
    }
    }

    Чтобы настроить ранее созданные mute timing и contact point в дереве политик уведомлений, замените следующие значения полей:

    • <terraform_data_source_name> на terraform-имя ранее определённого contact point.
    • <terraform_folder_name> на terraform-имя ранее определённого mute timing.
  3. Продолжайте добавлять другие ресурсы Grafana или используйте Terraform CLI для провижининга.

Enable editing resources in the Grafana UI

По умолчанию вы не можете редактировать ресурсы, провижиненные через Terraform, в Grafana. Это гарантирует, что ваш стек оповещений всегда остаётся синхронизированным с вашим кодом Terraform.

Чтобы сделать провижиненные ресурсы редактируемыми в интерфейсе Grafana, включите атрибут disable_provenance для ресурсов оповещений.

terraform
resource "grafana_contact_point" "my_contact_point" {
  name = "My Contact Point"

  disable_provenance = true
}

resource "grafana_message_template" "custom_notification_template_group" {
  name     = "custom_notification_template_group"
  template = "{{define \"template1\" }}Say{{ end }}{{define \"template2\" }}Hi!{{ end }}"

  disable_provenance = true
}
...

Provision Grafana resources with Terraform

Чтобы создать ранее описанные ресурсы оповещений в Grafana с помощью Terraform CLI, выполните следующие шаги.

  1. Инициализируйте рабочий каталог, содержащий файлы конфигурации Terraform.

    shell
    terraform init

    Эта команда инициализирует каталог Terraform, устанавливая Grafana Terraform provider, настроенный в файле main.tf.

  2. Примените файлы конфигурации Terraform, чтобы провижинить ресурсы.

    shell
    terraform apply

    Перед применением любых изменений к Grafana Terraform отображает план выполнения и запрашивает ваше подтверждение.

    shell
     Plan: 4 to add, 0 to change, 0 to destroy.
    
     Do you want to perform these actions?
     Terraform will perform the actions described above.
     Only 'yes' will be accepted to approve.
    
     Enter a value:

    После того как вы подтвердите продолжение изменений, Terraform создаст провижиненные ресурсы в Grafana!

    shell
    Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

Теперь вы можете открыть Grafana, чтобы проверить создание различных ресурсов.

More examples

Дополнительные примеры по концепции этого руководства: