菜单
实验性

foreach

实验性:这是一项实验性功能。实验性功能可能会频繁发生重大变更,并且可能会被移除而没有等效替代。必须将 stability.level 标志设置为 experimental 才能使用该功能。

foreach 块对列表中的每个项运行一个独立的管道。

用法

alloy
foreach "<LABEL>" {
  collection = [...]
  var        = "<VAR_NAME>"
  template {
    ...
  }
}

参数

您可以将以下参数与 foreach 一起使用

名称类型描述默认值必需
collectionlist(any)要遍历的项列表。
varstring引用集合中当前项的变量名称。
enable_metricsbool是否在 Alloy /metrics 端点暴露调试指标。false

collection 列表中的项可以是任何类型,例如 bool、string、list 或 map。

警告

collection 包含大量元素时,将 enable_metrics 设置为 true 可能会导致 Alloy /metric 端点出现大量指标。

您可以将以下块与 foreach 一起使用

描述必需
template要运行的组件管道。

template

template 块包含 Alloy 组件的定义,这些组件将为集合中的每个项运行。块的内容看起来像普通的 Alloy 配置文件,不同之处在于您可以使用 var 中定义的关键字来引用集合中的当前项。

template 块内的组件可以使用在 foreach 块外部定义的组件的导出。但是,foreach 外部的组件不能使用在 foreachtemplate 块内部定义的组件的导出。

示例

以下示例展示了如何动态地在服务发现目标上运行 Prometheus 导出器。

prometheus.exporter.* 组件通常需要被监控的某个特定实例的地址。例如,prometheus.exporter.redis 有一个用于被观察 Redis 实例的 redis_addr 属性。另一方面,discovery.* 组件(例如 discovery.kubernetes)输出一个目标列表,如下所示:

您可以使用 foreach 遍历每个目标并为其启动一个独立的组件管道。以下示例配置展示了如何为 discovery.kubernetes 发现的每个 Redis 实例启动一个 prometheus.exporter.redis 实例。来自 discovery.kubernetes 的额外 Kubernetes 标签也会添加到 prometheus.exporter.redis 创建的指标中。

alloy
discovery.kubernetes "default" {
    role = "pod"
}

discovery.relabel "redis" {
    targets = discovery.kubernetes.default.targets

    // Remove all targets except the Redis ones.
    rule {
        source_labels = ["__meta_kubernetes_pod_container_name"]
        regex         = "redis-cont"
        action        = "keep"
    }
}

// Collect metrics for each Redis instance.
foreach "redis" {
    collection = discovery.relabel.redis.output
    var        = "each"

    template {
        prometheus.exporter.redis "default" {
            // This is the "__address__" label from discovery.kubernetes.
            redis_addr = each["__address__"]
        }

        prometheus.scrape "default" {
            targets    = prometheus.exporter.redis.default.targets
            forward_to = [prometheus.relabel.default.receiver]
        }

        // Add labels from discovery.kubernetes.
        prometheus.relabel "default" {
            rule {
                replacement  = each["__meta_kubernetes_namespace"]
                target_label = "k8s_namespace"
                action       = "replace"
            }

            rule {
                replacement  = each["__meta_kubernetes_pod_container_name"]
                target_label = "k8s_pod_container_name"
                action       = "replace"
            }

            forward_to = [prometheus.remote_write.mimir.receiver]
        }
    }
}

prometheus.remote_write "mimir" {
    endpoint {
        url = "https://prometheus-xxx.grafana.net/api/prom/push"

        basic_auth {
            username = sys.env("<PROMETHEUS_USERNAME>")
            password = sys.env("<GRAFANA_CLOUD_API_KEY>")
        }
    }
}

替换以下内容

  • <PROMETHEUS_USERNAME>:您的 Prometheus 用户名。
  • <GRAFANA_CLOUD_API_KEY>:您的 Grafana Cloud API 密钥。