You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform Datadog仪表盘配置如何复用相似widget块并保留顺序?

最优方案:单动态块遍历结构化配置列表

该方案可完全保留widget原有顺序,仅需写1次组件逻辑,无重复代码。

实现思路

将所有widget的配置统一存入结构化的local变量,为每个条目增加类型标记,动态块内部根据类型渲染对应结构的widget即可。

locals {
  dashboard_widgets = [
    # 前两个时间序列图表
    {
      type       = "alert_graph"
      alert_id   = "895605"
      viz_type   = "timeseries"
      title      = "Widget Title"
      live_span  = "1h"
    },
    {
      type       = "alert_graph"
      alert_id   = "895605"
      viz_type   = "timeseries"
      title      = "Widget Title"
      live_span  = "2h"
    },
    # 中间特殊数值组件
    {
      type       = "alert_value"
      alert_id   = "895605"
      precision  = 3
      unit       = "b"
      text_align = "center"
      title      = "Widget Title"
    },
    # 后两个时间序列图表
    {
      type       = "alert_graph"
      alert_id   = "895605"
      viz_type   = "timeseries"
      title      = "Widget Title"
      live_span  = "1w"
    },
    {
      type       = "alert_graph"
      alert_id   = "895605"
      viz_type   = "timeseries"
      title      = "Widget Title"
      live_span  = "2w"
    }
  ]
}

resource "datadog_dashboard" "ordered_dashboard" {
  title        = "Ordered Layout Dashboard"
  description  = "Created using the Datadog provider in Terraform"
  layout_type  = "ordered"
  is_read_only = true

  dynamic "widget" {
    for_each = local.dashboard_widgets
    content {
      # 按类型渲染不同组件
      dynamic "alert_graph_definition" {
        for_each = widget.value.type == "alert_graph" ? [widget.value] : []
        content {
          alert_id  = alert_graph_definition.value.alert_id
          viz_type  = alert_graph_definition.value.viz_type
          title     = alert_graph_definition.value.title
          live_span = alert_graph_definition.value.live_span
        }
      }

      dynamic "alert_value_definition" {
        for_each = widget.value.type == "alert_value" ? [widget.value] : []
        content {
          alert_id   = alert_value_definition.value.alert_id
          precision  = alert_value_definition.value.precision
          unit       = alert_value_definition.value.unit
          text_align = alert_value_definition.value.text_align
          title      = alert_value_definition.value.title
        }
      }
    }
  }
}

方案优势

  • 完全保留原始widget顺序,local列表的顺序就是仪表盘最终渲染的顺序
  • 无重复的组件逻辑代码,新增同类型组件仅需在local列表增加对应条目
  • 后续扩展其他widget类型仅需新增对应的内层动态块即可

生产场景进阶优化

如果组件数量多、公共参数重复度高,可进一步简化配置:

locals {
  # 提取公共参数,修改时仅需改一处
  common_alert_params = {
    alert_id = "895605"
    viz_type = "timeseries"
    title    = "Widget Title"
  }
  # 批量生成所有时间序列组件配置
  alert_graph_widgets = [
    for span in ["1h", "2h", "1w", "2w"] : merge(local.common_alert_params, {type = "alert_graph", live_span = span})
  ]
  # 特殊数值组件配置
  alert_value_widget = {
    type       = "alert_value"
    alert_id   = "895605"
    precision  = 3
    unit       = "b"
    text_align = "center"
    title      = "Widget Title"
  }
  # 按顺序拼接最终widget列表
  dashboard_widgets = concat(
    slice(local.alert_graph_widgets, 0, 2),
    [local.alert_value_widget],
    slice(local.alert_graph_widgets, 2, 4)
  )
}

内容的提问来源于stack exchange,提问作者TuanDT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:30:03