如何在Fluent-Bit向Loki发日志时用K8s元数据填充OTel资源属性?
解决Fluent-Bit通过OpenTelemetry输出向Loki添加动态标签的问题
核心方案
要从Kubernetes过滤器生成的元数据中提取字段填充otel_resource_attributes,可以通过以下两种动态字段映射方式实现:
方法一:使用Lua过滤器自定义字段映射
Lua过滤器支持直接访问日志中的Kubernetes元数据,编写简单逻辑将目标字段注入到OpenTelemetry资源属性中。
配置步骤
- 确保Kubernetes过滤器已正确提取元数据(比如
kubernetes.container_name、kubernetes.labels.app等字段,需根据你的集群标签调整) - 添加Lua过滤器配置:
[FILTER] Name lua Match kube.* script otel_attr_mapper.lua call inject_otel_attributes
- 创建
otel_attr_mapper.lua脚本:
function inject_otel_attributes(tag, timestamp, record) -- 初始化资源属性对象 record['otel_resource_attributes'] = record['otel_resource_attributes'] or {} -- 从K8s元数据提取container.name if record.kubernetes and record.kubernetes.container_name then record['otel_resource_attributes']['container.name'] = record.kubernetes.container_name end -- 从K8s标签提取service.name(示例用app标签,替换为你实际的服务标签) if record.kubernetes and record.kubernetes.labels and record.kubernetes.labels.app then record['otel_resource_attributes']['service.name'] = record.kubernetes.labels.app end return 2, timestamp, record end
方法二:使用modify过滤器(Fluent-Bit v1.9+支持)
modify过滤器支持直接从现有字段提取值,快速完成字段映射,适合简单场景。
配置示例
[FILTER] Name modify Match kube.* -- 将K8s容器名映射到otel资源属性 Add otel_resource_attributes.container.name ${kubernetes.container_name} -- 将K8s服务标签映射到otel资源属性(替换为你的实际标签键) Add otel_resource_attributes.service.name ${kubernetes.labels.app.kubernetes.io/name}
验证与注意事项
- 先通过
stdout输出插件确认Kubernetes过滤器已生成目标元数据字段,确保kubernetes.container_name、对应服务标签等存在 - 重启Fluent-Bit后,检查Loki中是否生成
container.name和service.name标签 - 若服务标签不是
app或app.kubernetes.io/name,需替换配置中的标签路径
内容的提问来源于stack exchange,提问作者Rajesh Dutta
相关产品推荐
相关产品推荐

