首页 > 解决方案 > 如何使用 terraform 定义具有多个标签的基于 GCP 日志的指标,但无法定义 label_extractors 块

问题描述

resource "google_logging_metric" "logging_metric" {
  for_each = { for inst in var.log_based_metrics : inst.name => inst }
  name = each.value.name
  filter = each.value.filter
  metric_descriptor {
    metric_kind = each.value.metric_kind
    value_type = each.value.value_type
    dynamic "labels" {
      for_each = each.value.labels
      content {
        key = labels.value["label_key"]
        value_type = labels.value["label_value_type"]
        description = labels.value["label_description"]
      }
    }
    display_name = each.value.display_name
  }
  label_extractors = {
    << How to define multiple label_keys with label extractors >>
  }
}

我试过 for_each 但它指的是资源中的第一个 for_each ,我们不能使用动态,因为它创建了多个 label_extractors 块,这不是有意的。

我的变量文件:

log_based_metrics = [
  {
    name = "name1",
    filter = "something"
    metric_kind = "DELTA",
    value_type = "INT64",
    labels = [
      {
         label_key = "deployment",
         label_value_type = "STRING",
         label_description = "deployment",
         label_extractor = "REGEXP_EXTRACT(jsonPayload.involvedObject.name, \"(.*)-[^-]*-[^-]*$\")"
       }
    ]
  },
  {
    name = "name2",
    filter = "something",
    metric_kind = "DELTA",
    value_type = "INT64",
    labels = [
      {
        label_key = "deployment",
        label_value_type = "STRING",
        label_description = "deployment",
        label_extractor = "REGEXP_EXTRACT(jsonPayload.involvedObject.name, \"(.*)-[^-]*-[^-]*$\")"
      }
    ]
  },
  {
    name = "name3",
    filter = "something",
    metric_kind = "DELTA",
    value_type = "INT64",
    labels = [
      {
        label_key = "deployment",
        label_value_type = "STRING",
        label_description = "deployment",
        label_extractor = "REGEXP_EXTRACT(jsonPayload.involvedObject.name, \"(.*)-[^-]*-[^-]*$\")"
      }
    ]

}]

label_extractor 应该是这样的 :(label_extractor ,label_key from each label block) 例如:

    labels {
      key         = "mass"
      value_type  = "STRING"
      description = "amount of matter"
    }
    labels {
      key         = "sku"
      value_type  = "INT64"
      description = "Identifying number for item"
    }
    display_name = "My metric"
  }
  value_extractor = "EXTRACT(jsonPayload.request)"
  label_extractors = {
    "mass" = "EXTRACT(jsonPayload.request)"
    "sku"  = "EXTRACT(jsonPayload.id)"
  }

标签: google-cloud-platformterraform

解决方案


label_extractors是一个属性,而不是一个块。所以你只需要创建一个你想要的地图。我不知道您输入数据的确切结构(问题中未显示),但它会如下所示(粗略示例):

label_extractors = { for val in each.value.labels: val.label_key => val.label_extractor  }

推荐阅读