How to define GCP log based metric with multiple labels using terraform , not able to define label_extractors block

Viewed 701
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 >>
  }
}

I have tried for_each but it was referring to first for_each in the resource and we cant use dynamic as it creates multiple label_extractors blocks, which is not intended.

My variables file :

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 should be something like this :(label_extractor ,label_key from each label block) for example :

    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)"
  }
1 Answers

label_extractors is an attribute, not a block. So you have to just create a map that you want. I don't know exact structure of your input data (not shown in the question), but it would be something as follows (rough example):

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