菜单
文档breadcrumb arrow Grafana Alloybreadcrumb arrow 参考breadcrumb arrow 组件breadcrumb arrow otelcolbreadcrumb arrow otelcol.processor.k8sattributes
开源

otelcol.processor.k8sattributes

otelcol.processor.k8sattributes 接收来自其他 otelcol 组件的遥测数据,并将 Kubernetes 元数据添加到跨度、日志或指标的资源属性中。

注意

otelcol.processor.k8sattributes 是 OpenTelemetry Collector 的 k8sattributes 处理器的包装器。如果需要,错误报告或功能请求将被重定向到上游仓库。

您可以通过不同的标签指定多个 otelcol.processor.k8sattributes 组件。

用法

alloy
otelcol.processor.k8sattributes "LABEL" {
  output {
    metrics = [...]
    logs    = [...]
    traces  = [...]
  }
}

参数

支持以下参数

名称类型描述默认必需
auth_type字符串连接到 Kubernetes API 时的认证方法。serviceAccount
透传布尔值以原样透传信号,仅添加一个k8s.pod.ip资源属性。

auth_type支持的值有:

  • none:无需认证。
  • serviceAccount:使用Kubernetes为每个Pod自动配置的内置服务帐户。
  • kubeConfig:使用kubectl使用的本地凭证。
  • tls:使用客户端TLS认证。

passthrough设置为true启用otelcol.processor.k8sattributes的“透传模式”

  • 仅添加一个k8s.pod.ip资源属性。
  • 不会添加其他元数据。
  • 不会访问Kubernetes API。
  • 为了正确检测Pod IP,Alloy必须直接从服务接收跨度。
  • 当配置Alloy作为Kubernetes部署时,passthrough设置很有用。作为部署运行的Alloy无法检测生成遥测数据的Pod的IP地址,除非有已知的IP属性。如果部署Alloy从作为DaemonSet部署的Alloy接收遥测数据,那么其中一些属性可能缺失。作为一种解决方案,您可以配置具有passthrough设置为true的DaemonSet Alloys。

以下块在otelcol.processor.k8sattributes的定义内受支持

层次结构描述必需
输出输出配置接收到的遥测数据的发送位置。
提取提取从Kubernetes提取数据的规则。
提取 > 注释注释从Kubernetes注释创建资源属性。
提取 > 标签提取标签从Kubernetes标签创建资源属性。
过滤过滤过滤从Kubernetes加载的数据。
过滤 > 字段字段通过通用的Kubernetes字段过滤Pod。
过滤 > 标签过滤标签通过Kubernetes标签过滤Pod。
pod_associationpod_association将Pod元数据与遥测信号关联的规则。
pod_association > 来源来源用于识别Pod的源信息。
排除排除排除要处理的Pod。
排除 > podpodPod信息。
debug_metricsdebug_metrics配置此组件生成的指标以监控其状态。

>符号表示更深的嵌套级别。例如,extract > annotation指的是在extract块内定义的annotation块。

提取块

extract块配置从Pod提取哪些元数据、注释和标签。

以下属性受支持

名称类型描述默认必需
元数据列表(string)预配置要添加的元数据键。见下文

当前支持的metadata键有

  • k8s.pod.name
  • k8s.pod.uid
  • k8s.deployment.name
  • k8s.node.name
  • k8s.namespace.name
  • k8s.pod.start_time
  • k8s.replicaset.name
  • k8s.replicaset.uid
  • k8s.daemonset.name
  • k8s.daemonset.uid
  • k8s.job.name
  • k8s.job.uid
  • k8s.cronjob.name
  • k8s.statefulset.name
  • k8s.statefulset.uid
  • k8s.container.name
  • container.image.name
  • container.image.tag
  • container.id

默认情况下,如果未指定metadata,则以下字段将提取并添加到跨度、指标和日志中作为资源属性

  • k8s.pod.name
  • k8s.pod.uid
  • k8s.pod.start_time
  • k8s.namespace.name
  • k8s.node.name
  • k8s.deployment.name(如果Pod由部署控制)
  • k8s.container.name(需要设置以下附加属性:container.id
  • container.image.name(需要设置以下附加属性之一:container.idk8s.container.name
  • container.image.tag(需要设置以下附加属性之一:container.idk8s.container.name

注释块

annotation块配置如何提取Kubernetes注释。

以下属性受支持

名称类型描述默认必需
字符串标签或注释的来源。允许的值有 podnamespacenodepod
key_regex字符串用于提取与正则表达式匹配的键的正则表达式。""
key字符串注释或标签名称。此键必须与注释或标签名称完全匹配。""
regex字符串一个可选字段,用于从复杂字段值中提取子字符串。""
tag_name字符串添加到日志、指标或跟踪的资源属性的名称。""

当您没有指定 tag_name 时,将使用以下格式的默认标签名称

  • k8s.pod.annotations.<annotation key>
  • k8s.pod.labels.<label key>

例如,如果未指定 tag_name 且键为 git_sha,属性名称将是 k8s.pod.annotations.git_sha

您可以选择设置 key 属性或 key_regex 属性,但不能同时设置两个。当存在 key_regex 时,tag_name 支持对命名捕获和位置捕获的向后引用。

例如,假设您的 Pod 规范包含以下标签

  • app.kubernetes.io/component: mysql
  • app.kubernetes.io/version: 5.7.21

如果您想为前缀为 app.kubernetes.io/ 的所有标签添加标签,并删除前缀,则可以指定以下提取规则

alloy
extract {
  label {
    from = "pod"
    key_regex = "kubernetes.io/(.*)"
    tag_name  = "$1"
  }
}

这些规则将 componentversion 标签添加到跟踪或指标中。

您可以将 from 属性设置为 "pod""namespace"

label block

使用 label block 配置如何提取 Kubernetes 标签。

以下属性受支持

名称类型描述默认必需
字符串标签或注释的来源。允许的值有 podnamespacenodepod
key_regex字符串用于提取与正则表达式匹配的键的正则表达式。""
key字符串注释或标签名称。此键必须与注释或标签名称完全匹配。""
regex字符串一个可选字段,用于从复杂字段值中提取子字符串。""
tag_name字符串添加到日志、指标或跟踪的资源属性的名称。""

当您没有指定 tag_name 时,将使用以下格式的默认标签名称

  • k8s.pod.annotations.<annotation key>
  • k8s.pod.labels.<label key>

例如,如果未指定 tag_name 且键为 git_sha,属性名称将是 k8s.pod.annotations.git_sha

您可以选择设置 key 属性或 key_regex 属性,但不能同时设置两个。当存在 key_regex 时,tag_name 支持对命名捕获和位置捕获的向后引用。

例如,假设您的 Pod 规范包含以下标签

  • app.kubernetes.io/component: mysql
  • app.kubernetes.io/version: 5.7.21

如果您想为前缀为 app.kubernetes.io/ 的所有标签添加标签,并删除前缀,则可以指定以下提取规则

alloy
extract {
  label {
    from = "pod"
    key_regex = "kubernetes.io/(.*)"
    tag_name  = "$1"
  }
}

这些规则将 componentversion 标签添加到跟踪或指标中。

您可以将 from 属性设置为 "pod""namespace"

filter block

使用 filter block 配置从哪些节点获取数据以及哪些字段和标签要获取。

以下属性受支持

名称类型描述默认必需
node字符串配置 Kubernetes 节点名称或主机名。""
namespace字符串根据提供的命名空间过滤所有 Pod。忽略其他所有 Pod。""

如果指定了 node,则 otelcol.processor.k8sattributes 将忽略未在指定节点上运行的任何 Pod。

field block

使用 field block 允许您通过通用 Kubernetes 字段过滤 Pod。

以下属性受支持

名称类型描述默认必需
key字符串过滤器可以使用的关键或名称。
value字符串与过滤器可以使用的键相关联的值。
op字符串在给定键:值对上应用过滤操作的过滤操作。equals

对于 op,允许以下值

  • equals:字段值必须等于提供的值。
  • not-equals:字段值必须不等于提供的值。
  • exists:字段值必须存在。仅适用于 annotation 字段。
  • does-not-exist:字段值必须不存在。仅适用于 annotation 字段。

label block

使用 label block 允许您通过通用 Kubernetes 标签过滤 Pod。

以下属性受支持

名称类型描述默认必需
key字符串过滤器可以使用的关键或名称。
value字符串与过滤器可以使用的键相关联的值。
op字符串在给定键:值对上应用过滤操作的过滤操作。equals

对于 op,允许以下值

  • equals:字段值必须等于提供的值。
  • not-equals:字段值必须不等于提供的值。
  • exists:字段值必须存在。仅适用于 annotation 字段。
  • does-not-exist:字段值必须不存在。仅适用于 annotation 字段。

pod_association block

使用 pod_association block 配置如何关联日志/跟踪/指标到 Pod 的规则。

不支持任何参数的 pod_association block,完全通过子块进行配置。

可以多次重复 pod_association block,以配置额外的规则。

示例

alloy
pod_association {
    source {
        from = "resource_attribute"
        name = "k8s.pod.ip"
    }
}

pod_association {
    source {
        from = "resource_attribute"
        name = "k8s.pod.uid"
    }
    source {
        from = "connection"
    }
}

source block

《source》块配置了Pod关联规则。该规则由《k8sattributes》处理器使用,以确定与遥测信号关联的Pod。

当在《pod_association》块内部指定多个《source》块时,必须匹配两个《source》块才能将Pod与遥测信号关联。

以下属性受支持

名称类型描述默认必需
字符串关联方法。目前支持《resource_attribute》和《connection》
名称字符串名称表示提取的关键名称。例如,ippod_uidk8s.pod.ip

排除块

《exclude》块配置了从处理器中排除哪些Pod。

注意

默认情况下,名称为jaeger-agentjaeger-collector的Pod将被排除。

Pod块

《pod》块配置要排除的Pod,使其不通过处理器处理。

以下属性受支持

名称类型描述默认必需
名称字符串Pod的名称

输出块

《output》块配置了一组组件,用于将结果遥测数据转发到。

支持以下参数

名称类型描述默认必需
日志list(otelcol.Consumer)要发送日志的目标消费者列表。[]
度量list(otelcol.Consumer)要发送度量到目标消费者的列表。[]
跟踪list(otelcol.Consumer)要发送跟踪到目标消费者的列表。[]

您必须指定《output》块,但所有参数都是可选的。默认情况下,遥测数据将被丢弃。根据需要配置《metrics》、《logs》和《traces》参数,以将遥测数据发送到其他组件。

调试度量块

《debug_metrics》块配置了该组件生成以监控其状态的度量。

支持以下参数

名称类型描述默认必需
disable_high_cardinality_metrics布尔值是否禁用某些高基数度量。true
级别字符串控制包装收集器发出的度量详细程度。"详细"

disable_high_cardinality_metrics是Grafana Alloy在OpenTelemetry Collector中的telemetry.disableHighCardinalityMetrics功能门控的等价物。它移除了可能导致高基数度量的属性。例如,从HTTP和gRPC连接的度量中移除了具有IP地址和端口号的属性。

注意

如果配置了,disable_high_cardinality_metrics仅适用于otelcol.exporter.*otelcol.receiver.*组件。

level是OpenTelemetry Collector中telemetry.metrics.level功能门的Alloy等价物。可能的值是"none""basic""normal""detailed"

导出字段

以下字段被导出,并可由其他组件引用

名称类型描述
输入otelcol.Consumer其他组件可以使用它发送遥测数据的值。

input接受任何遥测信号(度量、日志或跟踪)的otelcol.Consumer数据。

组件健康

otelcol.processor.k8sattributes只有在给定无效配置时才会报告为不健康。

调试信息

otelcol.processor.k8sattributes不公开任何特定于组件的调试信息。

示例

基本用法

在大多数情况下,这足以开始。它将为所有日志、指标和跟踪添加这些资源属性

  • k8s.namespace.name
  • k8s.pod.name
  • k8s.pod.uid
  • k8s.pod.start_time
  • k8s.deployment.name
  • k8s.node.name

示例

alloy
otelcol.receiver.otlp "default" {
  http {}
  grpc {}

  output {
    metrics = [otelcol.processor.k8sattributes.default.input]
    logs    = [otelcol.processor.k8sattributes.default.input]
    traces  = [otelcol.processor.k8sattributes.default.input]
  }
}

otelcol.processor.k8sattributes "default" {
  output {
    metrics = [otelcol.exporter.otlp.default.input]
    logs    = [otelcol.exporter.otlp.default.input]
    traces  = [otelcol.exporter.otlp.default.input]
  }
}

otelcol.exporter.otlp "default" {
  client {
    endpoint = sys.env("OTLP_ENDPOINT")
  }
}

添加其他元数据和标签

alloy
otelcol.receiver.otlp "default" {
  http {}
  grpc {}

  output {
    metrics = [otelcol.processor.k8sattributes.default.input]
    logs    = [otelcol.processor.k8sattributes.default.input]
    traces  = [otelcol.processor.k8sattributes.default.input]
  }
}

otelcol.processor.k8sattributes "default" {
  extract {
    label {
      from      = "pod"
      key_regex = "(.*)/(.*)"
      tag_name  = "$1.$2"
    }

    metadata = [
      "k8s.namespace.name",
      "k8s.deployment.name",
      "k8s.statefulset.name",
      "k8s.daemonset.name",
      "k8s.cronjob.name",
      "k8s.job.name",
      "k8s.node.name",
      "k8s.pod.name",
      "k8s.pod.uid",
      "k8s.pod.start_time",
    ]
  }

  output {
    metrics = [otelcol.exporter.otlp.default.input]
    logs    = [otelcol.exporter.otlp.default.input]
    traces  = [otelcol.exporter.otlp.default.input]
  }
}

otelcol.exporter.otlp "default" {
  client {
    endpoint = sys.env("OTLP_ENDPOINT")
  }
}

将Kubernetes元数据添加到Prometheus指标

otelcol.processor.k8sattributes以资源属性的形式将元数据添加到度量信号。要将元数据作为Prometheus指标的标签显示,必须将OTLP属性从资源属性转换为数据点属性。一种方法是使用otelcol.processor.transform组件。

alloy
otelcol.receiver.otlp "default" {
  http {}
  grpc {}

  output {
    metrics = [otelcol.processor.k8sattributes.default.input]
  }
}

otelcol.processor.k8sattributes "default" {
  extract {
    label {
      from = "pod"
    }

    metadata = [
      "k8s.namespace.name",
      "k8s.pod.name",
    ]
  }

  output {
    metrics = [otelcol.processor.transform.add_kube_attrs.input]
  }
}

otelcol.processor.transform "add_kube_attrs" {
  error_mode = "ignore"

  metric_statements {
    context = "datapoint"
    statements = [
      "set(attributes[\"k8s.pod.name\"], resource.attributes[\"k8s.pod.name\"])",
      "set(attributes[\"k8s.namespace.name\"], resource.attributes[\"k8s.namespace.name\"])",
    ]
  }

  output {
    metrics = [otelcol.exporter.prometheus.default.input]
  }
}

otelcol.exporter.prometheus "default" {
  forward_to = [prometheus.remote_write.mimir.receiver]
}

prometheus.remote_write "mimir" {
  endpoint {
    url = "http://mimir:9009/api/v1/push"
  }
}

兼容组件

otelcol.processor.k8sattributes可以接受以下组件的参数

otelcol.processor.k8sattributes的导出可以被以下组件消费

注意

连接某些组件可能不合理,或者组件可能需要进一步配置才能正确连接。请参阅相关文档以获取更多详细信息。