foreach
实验性:这是一项实验性功能。实验性功能可能会频繁发生重大变更,并且可能会被移除而没有等效替代。必须将
stability.level
标志设置为experimental
才能使用该功能。
foreach
块对列表中的每个项运行一个独立的管道。
用法
foreach "<LABEL>" {
collection = [...]
var = "<VAR_NAME>"
template {
...
}
}
参数
您可以将以下参数与 foreach
一起使用
名称 | 类型 | 描述 | 默认值 | 必需 |
---|---|---|---|---|
collection | list(any) | 要遍历的项列表。 | 是 | |
var | string | 引用集合中当前项的变量名称。 | 是 | |
enable_metrics | bool | 是否在 Alloy /metrics 端点暴露调试指标。 | false | 否 |
collection
列表中的项可以是任何类型,例如 bool、string、list 或 map。
警告
当
collection
包含大量元素时,将enable_metrics
设置为true
可能会导致 Alloy/metric
端点出现大量指标。
块
您可以将以下块与 foreach
一起使用
块 | 描述 | 必需 |
---|---|---|
template | 要运行的组件管道。 | 是 |
template
template
块包含 Alloy 组件的定义,这些组件将为集合中的每个项运行。块的内容看起来像普通的 Alloy 配置文件,不同之处在于您可以使用 var
中定义的关键字来引用集合中的当前项。
template
块内的组件可以使用在 foreach
块外部定义的组件的导出。但是,foreach
外部的组件不能使用在 foreach
的 template
块内部定义的组件的导出。
示例
以下示例展示了如何动态地在服务发现目标上运行 Prometheus 导出器。
prometheus.exporter.*
组件通常需要被监控的某个特定实例的地址。例如,prometheus.exporter.redis
有一个用于被观察 Redis 实例的 redis_addr
属性。另一方面,discovery.*
组件(例如 discovery.kubernetes
)输出一个目标列表,如下所示:
[
{
__address__ = "10.42.0.16:5432",
__meta_kubernetes_namespace = "ns1",
__meta_kubernetes_pod_container_id = "containerd://96b77d035d0bbe27bb173d8fc0c56d21965892a50e4e6eab9f6cffdb90b275fb",
__meta_kubernetes_pod_container_image = "postgres:bullseye",
__meta_kubernetes_pod_container_init = "false",
__meta_kubernetes_pod_container_name = "pgcont",
__meta_kubernetes_pod_container_port_name = "pg-db",
__meta_kubernetes_pod_container_port_number = "5432",
__meta_kubernetes_pod_container_port_protocol = "TCP",
__meta_kubernetes_pod_controller_kind = "ReplicaSet",
__meta_kubernetes_pod_controller_name = "postgres-db-cd54547b9",
__meta_kubernetes_pod_host_ip = "172.25.0.2",
__meta_kubernetes_pod_ip = "10.42.0.16",
__meta_kubernetes_pod_label_name = "postgres-db",
__meta_kubernetes_pod_label_pod_template_hash = "cd54547b9",
__meta_kubernetes_pod_labelpresent_name = "true",
__meta_kubernetes_pod_labelpresent_pod_template_hash = "true",
__meta_kubernetes_pod_name = "postgres-db-cd54547b9-4zpds",
__meta_kubernetes_pod_node_name = "k3d-asserts-test-server-0",
__meta_kubernetes_pod_phase = "Running",
__meta_kubernetes_pod_ready = "true",
__meta_kubernetes_pod_uid = "7cdcacdc-4a2d-460a-b1fb-6340700c4cac",
},
{
__address__ = "10.42.0.20:6379",
__meta_kubernetes_namespace = "ns1",
__meta_kubernetes_pod_container_id = "containerd://68f2f0eacd880eb4a141d833aafc1f297f7d9bdf00f4c787f9fcc964a039d278",
__meta_kubernetes_pod_container_image = "redis:latest",
__meta_kubernetes_pod_container_init = "false",
__meta_kubernetes_pod_container_name = "redis-cont",
__meta_kubernetes_pod_container_port_name = "redis-db",
__meta_kubernetes_pod_container_port_number = "6379",
__meta_kubernetes_pod_container_port_protocol = "TCP",
__meta_kubernetes_pod_controller_kind = "ReplicaSet",
__meta_kubernetes_pod_controller_name = "redis-db-778b66cb7d",
__meta_kubernetes_pod_host_ip = "172.25.0.2",
__meta_kubernetes_pod_ip = "10.42.0.20",
__meta_kubernetes_pod_label_name = "redis-db",
__meta_kubernetes_pod_label_pod_template_hash = "778b66cb7d",
__meta_kubernetes_pod_labelpresent_name = "true",
__meta_kubernetes_pod_labelpresent_pod_template_hash = "true",
__meta_kubernetes_pod_name = "redis-db-778b66cb7d-wxmf6",
__meta_kubernetes_pod_node_name = "k3d-asserts-test-server-0",
__meta_kubernetes_pod_phase = "Running",
__meta_kubernetes_pod_ready = "true",
__meta_kubernetes_pod_uid = "ae74e400-8eda-4b02-b4c8-669473fb001b",
}
]
您可以使用 foreach
遍历每个目标并为其启动一个独立的组件管道。以下示例配置展示了如何为 discovery.kubernetes
发现的每个 Redis 实例启动一个 prometheus.exporter.redis
实例。来自 discovery.kubernetes
的额外 Kubernetes 标签也会添加到 prometheus.exporter.redis
创建的指标中。
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 密钥。