Инфраструктура алертинга часто бывает сложной, в ней множество фрагментов пайплайна, которые то и дело находятся в разных местах. Масштабирование такой инфраструктуры для многих команд и организаций является особенно трудной задачей.

По мере роста организаций компонент наблюдаемости (observability), как правило, растет вместе с ними. Например, у вас может быть много компонентов, каждому из которых нужен свой набор алертов. У вас может быть несколько команд, каждая из которых имеет свой канал, по которому должны доставляться уведомления. У вас может быть несколько пайплайнов для деплоя, которые должны синхронизировать ваши алерты с вашим кодом. Не говоря уже о том, что отслеживание всего этого вручную отнимает много времени и чревато ошибками.

Рабочие процессы as-code (в виде кода) помогают упростить наблюдаемость в любом масштабе. С помощью Infrastructure as Code (IaC) вы можете определить инструментарий observability как составную часть компонентов, которым он необходим. Вы можете сохранить всю свою конфигурацию в системе контроля версий. Вы даже можете развернуть ее одновременно с остальной инфраструктурой, не прибегая к ручной обработке!

Именно поэтому мы рады объявить о широкой доступности поддержки провайдера Terraform для Grafana Alerting. Этот провайдер позволяет легко создавать, управлять и поддерживать весь стек Grafana Alerting в виде кода.

Присоединяйтесь к нам для знакомства с новой функциональностью и начните управлять инфраструктурой Grafana Alerting в виде кода уже сегодня.

Подключение Terraform к Grafana

Для предоставления алертов в Grafana вам понадобится Grafana версии 9.1 или более поздней, а также провайдер Terraform версии 1.27.0 или более поздней.

Создание API-ключа для инициализации

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

Мы также предоставляем выделенные роли RBAC (Role-based access control) для предоставления оповещений. Это позволит вам легко аутентифицироваться под учетной записью сервиса с минимальными разрешениями, необходимыми для предоставления инфраструктуры Grafana Alerting. Или, если вы предпочитаете базовую аутентификацию, это тоже подойдет!

Настройка провайдера Terraform

Поддержка Grafana Alerting включена в состав провайдера Grafana Terraform. Ниже вы можете увидеть пример того, как его настроить.

terraform {
    required_providers {
        grafana = {
            source = "grafana/grafana"
            version = ">= 1.28.2"
        }
    }
}

provider "grafana" {
    url = <YOUR_GRAFANA_URL>
    auth = <YOUR_GRAFANA_API_KEY>
}

Подготовка вашего стека Grafana Alerting к работе

Теперь давайте приступим к созданию нашего стека Grafana Alerting с помощью Terraform!

Контактные точки и шаблоны

Контактные точки — это то, что связывает стек алертинга с внешним миром. Они сообщают Grafana, как подключиться к вашим внешним системам и куда доставлять уведомления. Мы предоставляем более 15 различных интеграций на выбор.

Давайте рассмотрим пример создания контактной точки, которая отправляет уведомления об оповещениях в Slack.

resource "grafana_contact_point" "my_slack_contact_point" {
    name = "Send to My Slack Channel"

    slack {
        url = <YOUR_SLACK_WEBHOOK_URL>
        text = <<EOT
{{ len .Alerts.Firing }} alerts are firing!

Alert summaries:
{{ range .Alerts.Firing }}
{{ template "Alert Instance Template" . }}
{{ end }}
EOT
    }
}

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

Мы также можем использовать для проверки правильности работы контактной точки кнопку Test.

Поле text, представляющее содержимое отправляемого сообщения, поддерживает создание шаблонов в стиле Go. Это позволяет управлять шаблонами сообщений Grafana Alerting непосредственно в Terraform.

Вы также можете повторно использовать одни и те же шаблоны во многих контактных точках. В примере выше мы встраиваем совместный шаблон с помощью утверждения {{ template "Alert Instance Template" . }} Затем этим фрагментом можно управлять отдельно в Terraform:

resource "grafana_message_template" "my_alert_template" {
    name = "Alert Instance Template"

    template = <<EOT
{{ define "Alert Instance Template" }}
Firing: {{ .Labels.alertname }}
Silence: {{ .SilenceURL }}
{{ end }}
EOT
}

Политики уведомлений и маршрутизация

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

Давайте рассмотрим политику уведомлений, которая направляет все алерты в только что созданную контактную точку. Мы также сгруппируем алерты по alertname, то есть все уведомления, приходящие от алертов с одинаковым именем, будут сгруппированы в одно сообщение Slack.

resource "grafana_notification_policy" "my_policy" {
    group_by = ["alertname"]
    contact_point = grafana_contact_point.my_slack_contact_point.name
}

Тайминги отключения звука

Тайминги отключения звука позволяют отключать уведомления об алертах на определенные периоды времени.

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

resource "grafana_mute_timing" "my_mute_timing" {
    name = "My Mute Timing"

    intervals {
        weekdays = ["saturday", "sunday"]
    }
}

Вы можете установить время отключения звука для определенных уведомлений, указав его в политике уведомлений. Рассмотрим пример отключения звука всех уведомлений с меткой a=b в выходные дни.

resource "grafana_notification_policy" "my_policy" {
    group_by = ["alertname"]
    contact_point = grafana_contact_point.my_slack_contact_point.name

    policy {
        matcher {
            label = "a"
            match = "="
            value = "b"
        }
        group_by = ["alertname"]
        contact_point = grafana_contact_point.my_slack_contact_point.name
        mute_timings = [grafana_mute_timing.my_mute_timing.name]
    }
}

Правила алерта

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

Сначала создадим источник данных для запроса и папку для хранения наших правил. Пока что мы будем использовать встроенный источник данных TestData.

resource "grafana_data_source" "testdata_datasource" {
    name = "TestData"
    type = "testdata"
}

resource "grafana_folder" "rule_folder" {
    title = "My Rule Folder"
}

Затем давайте определим правило алерта. Подробнее о том, что вы можете делать с помощью правил алерта, читайте в нашем руководстве по созданию алертов под управлением Grafana.

Правила всегда организованы в группы, поэтому давайте обернем наше правило  используя ресурс grafana_rule_group.

resource "grafana_rule_group" "my_rule_group" {
    name = "My Alert Rules"
    folder_uid = grafana_folder.rule_folder.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.testdata_datasource.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 = "-100"
            // 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 = "-100"
            ref_id = "C"
            relative_time_range {
                from = 0
                to = 0
            }
            model = jsonencode({
                expression = "$B > 70"
                type = "math"
                refId = "C"
            })
        }
    }
}

Затем алерт появится на панели правил. Здесь можно увидеть, срабатывает ли правило или нет. Вы также можете увидеть визуализацию каждого из этапов запроса правила.

Когда наш алерт сработает, Grafana направит уведомление через политику, которую мы определили ранее.

Поскольку мы настроили эту политику на отправку уведомлений о тревоге в наш контактный центр Slack, встроенный в Grafana Alertmanager автоматически отправит сообщение нашему каналу Slack!

Узнайте больше о Grafana Alerting

С тех пор как в Grafana 9.0 был развернут новый опыт Grafana Alerting, мы добавили множество новых функциональных возможностей и улучшений. Чтобы узнать больше, вы можете посмотреть наше углубленное изучение Grafana Alerting или прочитать документацию по Grafana Alerting.

Если вы ищете дополнительные способы подготовки своего стека оповещений, ознакомьтесь с нашим сообщением в блоге о предоставлении файлов.

Наконец, если вы не видите нужной вам фичи или у вас есть замечания по поводу новой поддержки Terraform или Grafana Alerting в целом, пожалуйста, дайте нам знать! Вы можете сделать это, открыв проблему в GitHub-репозитории провайдера, GitHub-репозитории Grafana или спросив в канале #alerting в Grafana Labs Community Slack.


Какие есть стратегии сбора метрик мониторинга ИТ-инфраструктуры, как выбрать подходящую? Как использовать собранные метрики для обеспечения более надежного и эффективного мониторинга? Обсудим эти вопросы на открытом уроке, который пройдет 1 июня в 20:00 в рамках курса «Observability: мониторинг, логирование, трейсинг». На этом занятии мы:

  • Разберемся в основных стратегиях сбора метрик для мониторинга ИТ-инфраструктуры.

  • Узнаем, какие типы метрик могут быть использованы в мониторинге, и почему Prometheus использует pull-модель для сбора метрик.

  • Рассмотрим различные источники метрик, такие как логи, и изучим, как они могут быть использованы в качестве источника метрик для мониторинга ИТ-инфраструктуры.

  • Рассмотрим, какие преимущества и недостатки имеют push-модель и pull-модель сбора метрик, и когда и как использовать каждую из них.

Записывайтесь на открытый урок по ссылке.

Комментарии (0)