本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Terraform 创建和管理警报资源
本文档主题专为支持 Grafana 版本 10.x 的 Grafana 工作空间而设计。
有关支持 Grafana 9.x 版本的 Grafana 工作空间,请参阅。在 Grafana 版本 9 中工作
有关支持 Grafana 8.x 版本的 Grafana 工作空间,请参阅。在 Grafana 版本 8 中工作
使用 Terraform 的 Grafana 提供程序来管理你的警报资源并将其配置到你的 Grafana 系统中。Terraform 提供者对 Grafana Alerting 的支持使您可以轻松地以代码形式创建、管理和维护整个 Grafana 警报堆栈。
有关使用 Terraform 管理警报资源的更多信息,请参阅 Terraform 文档中的 Grafana 提供者文档
完成以下任务,使用 Terraform 创建和管理您的警报资源。
-
创建用于配置的 API 密钥。
-
配置 Terraform 提供程序。
-
在 Terraform 中定义你的警报资源。
-
运行
terraform apply
以配置您的警报资源。
先决条件
-
确保你有 grafana/grafana Ter
raform 提供商 1.27.0 或更高版本。 -
确保你使用的是 Grafana 9.1 或更高版本。如果您使用 Grafana 版本 9 创建了亚马逊托管 Grafana 实例,则会出现这种情况。
创建用于置备的 API 密钥
你可以创建一个普通的 Grafana API 密钥来使用 Grafana 对 Terraform 进行身份验证。大多数使用 API 密钥的现有工具都应自动使用新的 Grafana 警报支持。有关创建用于 Terraform 的密钥的具体信息,请参阅使用 Terraform 实现亚马逊托管 Gra
创建用于置备的 API 密钥
-
为您的 CI 管道创建一个新的服务帐号。
-
分配角色 “访问警报规则配置 API”。
-
创建新的服务帐号令牌。
-
命名并保存令牌以在 Terraform 中使用。
或者,您可以使用基本身份验证。要查看所有支持的身份验证格式,请参阅 Ter raform 文档中的 Grafana
配置 Terraform 提供者
Grafana 警报支持包含在 Grafana Terraform 提供程序中。
以下是可用于配置 Terraform 提供程序的示例。
terraform { required_providers { grafana = { source = "grafana/grafana" version = ">= 1.28.2" } } } provider "grafana" { url = <YOUR_GRAFANA_URL> auth = <YOUR_GRAFANA_API_KEY> }
配置联络点和模板
联络点将警报堆栈与外界连接起来。他们告诉 Grafana 如何连接外部系统以及在哪里发送通知。有超过十五种不同的集成
配置联系方式和模板
-
将此代码块复制到本地计算机上的.tf 文件中。将
< slack-webhook-url >
替换为您的 Slack 网络挂钩网址(或其他联系点详细信息)。此示例创建了一个向 Slack 发送警报通知的联系点。
resource "grafana_contact_point" "my_slack_contact_point" { name = "Send to My Slack Channel" slack { url =
<slack-webhook-url>
text = <<EOT {{ len .Alerts.Firing }} alerts are firing! Alert summaries: {{ range .Alerts.Firing }} {{ template "Alert Instance Template" . }} {{ end }} EOT } } -
在文本字段中输入通知文本。
该
text
字段支持 Go 风格的模板。这使您可以直接在 Terraform 中管理 Grafana 警报通知模板。 -
运行
terraform apply
命令。 -
前往 Grafana 用户界面并查看联系人的详细信息。
您无法在用户界面中编辑通过 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 如何路由警报实例,而不是路由到哪里。它们使用标签和匹配器系统将触发警报连接到您先前定义的联系点。
配置通知策略和路由
-
将此代码块复制到本地计算机上的.tf 文件中。
在此示例中,警报按分组
alertname
,这意味着来自同名警报的所有通知都被分组到同一个 Slack 消息中。如果您想以不同的方式发送特定通知,则可以添加子策略。子策略允许您根据标签匹配将路由应用于不同的警报。在此示例中,我们对标签为 a=b 的所有警报应用静音计时。
resource "grafana_notification_policy" "my_policy" { group_by = ["alertname"] contact_point = grafana_contact_point.my_slack_contact_point.name group_wait = "45s" group_interval = "6m" repeat_interval = "3h" policy { matcher { label = "a" match = "=" value = "b" } group_by = ["..."] contact_point = grafana_contact_point.a_different_contact_point.name mute_timings = [grafana_mute_timing.my_mute_timing.name] policy { matcher { label = "sublabel" match = "=" value = "subvalue" } contact_point = grafana_contact_point.a_third_contact_point.name group_by = ["..."] } } }
-
在 mute_timings 字段中,将静音计时与您的通知策略相关联。
-
运行
terraform apply
命令。 -
前往 Grafana 用户界面并查看您的通知政策的详细信息。
注意
您无法通过用户界面编辑从 Terraform 配置的资源。这样可以确保您的警报堆栈始终与您的代码保持同步。
-
单击 “测试” 以验证通知点是否正常工作。
设置静音计时
静音计时允许在定义的时间段内将警报通知静音。
设置静音计时
-
将此代码块复制到本地计算机上的.tf 文件中。
在此示例中,警报通知在周末处于静音状态。
resource "grafana_mute_timing" "my_mute_timing" { name = "My Mute Timing" intervals { times { start = "04:56" end = "14:17" } weekdays = ["saturday", "sunday", "tuesday:thursday"] months = ["january:march", "12"] years = ["2025:2027"] } }
-
运行
terraform apply
命令。 -
前往 Grafana 用户界面,查看静音时间的详细信息。
-
使用
mute_timings
字段在通知策略中引用您新创建的静音计时。这会将您的静音时间应用于您的部分或全部通知。注意
您无法通过用户界面编辑从 Terraform 配置的资源。这样可以确保您的警报堆栈始终与您的代码保持同步。
-
单击 “测试” 以验证静音计时是否正常运行。
配置警报规则
警报规则允许您针对任何 Grafana 数据源发出警报。这可以是您已经配置的数据源,也可以在 Terraform 中定义您的数据源
配置警报规则
-
创建一个要查询的数据源和一个用于存储规则的文件夹。
在本示例中,使用配置用于测试 TestData 的数据源数据源。
可以在 Grafana 中针对任何后端数据源定义警报。
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 = "__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" }) } } }
-
前往 Grafana 用户界面并查看您的警报规则。
您可以查看警报规则是否正在触发。您还可以看到警报规则每个查询阶段的可视化效果。
警报触发时,Grafana 会通过您定义的策略发送通知。
例如,如果你选择 Slack 作为联系人,Grafana 的嵌入式警报管理器会自动向 Sl
ack 发布消息。