otelcol.processor.k8sattributes
otelcol.processor.k8sattributes
接收来自其他 otelcol
组件的遥测数据,并将 Kubernetes 元数据添加到跨度、日志或指标的资源属性中。
注意
otelcol.processor.k8sattributes
是 OpenTelemetry Collector 的k8sattributes
处理器的包装器。如果需要,错误报告或功能请求将被重定向到上游仓库。
您可以通过不同的标签指定多个 otelcol.processor.k8sattributes
组件。
用法
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_association | pod_association | 将Pod元数据与遥测信号关联的规则。 | 无 |
pod_association > 来源 | 来源 | 用于识别Pod的源信息。 | 无 |
排除 | 排除 | 排除要处理的Pod。 | 无 |
排除 > pod | pod | Pod信息。 | 无 |
debug_metrics | debug_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.id
或k8s.container.name
)container.image.tag
(需要设置以下附加属性之一:container.id
或k8s.container.name
)
注释块
annotation
块配置如何提取Kubernetes注释。
以下属性受支持
名称 | 类型 | 描述 | 默认 | 必需 |
---|---|---|---|---|
从 | 字符串 | 标签或注释的来源。允许的值有 pod 、namespace 和 node 。 | pod | 无 |
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/
的所有标签添加标签,并删除前缀,则可以指定以下提取规则
extract {
label {
from = "pod"
key_regex = "kubernetes.io/(.*)"
tag_name = "$1"
}
}
这些规则将 component
和 version
标签添加到跟踪或指标中。
您可以将 from
属性设置为 "pod"
或 "namespace"
。
label block
使用 label
block 配置如何提取 Kubernetes 标签。
以下属性受支持
名称 | 类型 | 描述 | 默认 | 必需 |
---|---|---|---|---|
从 | 字符串 | 标签或注释的来源。允许的值有 pod 、namespace 和 node 。 | pod | 无 |
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/
的所有标签添加标签,并删除前缀,则可以指定以下提取规则
extract {
label {
from = "pod"
key_regex = "kubernetes.io/(.*)"
tag_name = "$1"
}
}
这些规则将 component
和 version
标签添加到跟踪或指标中。
您可以将 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,以配置额外的规则。
示例
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》 | 是 | |
名称 | 字符串 | 名称表示提取的关键名称。例如,ip 、pod_uid 、k8s.pod.ip | 无 |
排除块
《exclude》块配置了从处理器中排除哪些Pod。
注意
默认情况下,名称为jaeger-agent
或jaeger-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
示例
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")
}
}
添加其他元数据和标签
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
组件。
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
的导出可以被以下组件消费
注意
连接某些组件可能不合理,或者组件可能需要进一步配置才能正确连接。请参阅相关文档以获取更多详细信息。