Cover image for Observability as Code: Managing Dashboards and Alerts with Terraform

Samson Tanimawo

点击式仪表盘的问题

你的团队有 200 个仪表盘。你不知道谁拥有它们。其中一半已经损坏。其余的显示的是昨天的现实。

这就是点击式操作债务,它比代码债务积累得更快。

可观测性即代码

每个仪表盘、告警和 SLO 定义都应该与你的服务代码一起存放在 Git 仓库中。

resource "datadog_dashboard" "api_gateway" {
  title       = "API Gateway - Golden Signals"
  description = "Owner: @platform-team"
  layout_type = "ordered"

  widget {
    timeseries_definition {
      title = "Request Rate (per second)"
      request {
        q = "sum:api.requests{service:gateway}.as_rate()"
      }
    }
  }

  widget {
    timeseries_definition {
      title = "P99 Latency"
      request {
        q = "max:api.latency{service:gateway}.as_count()"
      }
    }
  }
}

Enter fullscreen mode Exit fullscreen mode

它与服务的 main.tf 存放在一起。部署服务时,也会部署可观测性。

累积的好处

1. 所有权清晰。 文件有 CODEOWNERS 条目。PR 需要审查。

2. 仪表盘自动更新。 重命名服务?Terraform 重构会传播到所有仪表盘。

3. 漂移检测。 有人在 UI 中点击了“另存为”,导致该仪表盘不同步。terraform plan 会捕获到它。

4. 生产前审查。 告警变更通过 PR 审查。不再有“谁设置了这个阈值?”的问题。

各平台工具

datadog:
  provider: DataDog/datadog
  resources: datadog_monitor, datadog_dashboard, datadog_slo

grafana:
  provider: grafana/grafana
  resources: grafana_dashboard, grafana_alert_rule

prometheus:
  approach: YAML files in Git, deployed by ArgoCD
  resources: alert rules, recording rules

new_relic:
  provider: newrelic/newrelic
  resources: newrelic_alert_policy, newrelic_dashboard

Enter fullscreen mode Exit fullscreen mode

选择一个单一事实来源。不要混用。

真实示例

我们有一个模块,它接收服务名称并生成完整的可观测性栈:

module "service_observability" {
  source = "./modules/observability"

  service_name = "payment-processor"
  team_slack   = "#payments"
  severity_map = {
    error_rate_pct = 1.0
    p99_latency_ms = 500
    saturation_pct = 80
  }

  slo_targets = {
    availability = 0.9995
    latency_p99  = 0.99
  }
}

Enter fullscreen mode Exit fullscreen mode

一次模块调用即可创建:3 个仪表盘、8 个告警、2 个 SLO、一个 Slack 频道绑定,以及一个 PagerDuty 升级策略。

最难的部分

代码很容易。最难的部分是:

  1. 迁移现有的点击式仪表盘 — 预算 2 周
  2. 让工程师编辑 YAML/HCL 而非 UI — 预算 3 个月的提醒
  3. 阻止 UI 编辑 — 有些工具允许你将仪表盘设为只读
  4. 审查告警变更 — PR 审查者需要上下文

要避免的反模式

不要为工程师想要的每个自定义图表编写 Terraform。那会导致 500 行的仪表盘模块,没人能理解。

相反,将标准仪表盘(黄金信号、RED/USE、SLO 燃尽率)定义为模块。如果工程师想添加自己的自定义仪表盘,允许他们在 UI 中操作,但将其标记为“仅探索”(不用于告警)。

核心可观测性 = 代码。实验性探索 = UI。

迁移策略

第 1 周:选择 1 个服务,将其仪表盘转换为 Terraform
第 2 周:将告警 + SLO 添加到 Terraform
第 3 周:删除 UI 版本
第 4 周:从模式中创建模块
第 2 个月:推广到另外 10 个服务
第 3 个月:要求所有新服务使用该模块

六个月后,你的点击式操作债务消失,可观测性变得可复现。


作者:Dr. Samson Tanimawo
BSc · MSc · MBA · PhD
Founder & CEO, Nova AI Ops. https://novaaiops.com