关于 otel-ottl
面向 OpenTelemetry 用户的 OTTL 表达式参考,介绍语法、函数、错误处理与性能实践,适用于编写遥测数据转换和过滤规则。
主要功能
- 01使用路径表达式访问遥测数据
- 02编写条件转换与过滤表达式
- 03使用转换器和编辑器函数
- 04配置错误处理模式
- 05优化表达式执行效率
适用场景
- 01脱敏或删除敏感遥测属性
- 02按条件丢弃遥测数据
- 03规范高基数属性
- 04为遥测补充静态属性
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dash0hq/ agent-skills --skill otel-ottl安装后在 Claude Code 中输入/otel-ottl确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
rules/cardinality.mdcomponents.mdenrichment.mdfunction-reference.mdpatterns.mdredaction.md详细介绍
OpenTelemetry 转换语言(OTTL)
使用 OTTL 的组件
OTTL 不仅限于 transform 和 filter 处理器。 处理器(transform、filter、tailsampling、logdedup)和连接器(routing、count、sum、signaltometrics)都接受 OTTL 表达式。 请参阅组件,了解完整列表和使用场景。
OTTL 语法
路径表达式
使用点号表示法导航遥测数据:
span.name
span.attributes["http.method"]
resource.attributes["service.name"]
上下文(第一个路径段):resource、scope、span、spanevent、metric、datapoint、log。
枚举
枚举字段使用 int64 常量:
span.status.code == STATUS_CODE_ERROR
span.kind == SPAN_KIND_SERVER
运算符
赋值:= — 比较:==、!=、>、<、>=、<= — 逻辑:and、or、not
函数
转换器(大写,返回值):
ToUpperCase(span.attributes["http.request.method"])
Substring(log.body.string, 0, 1024)
Concat(["prefix", span.attributes["request.id"]], "-")
IsMatch(metric.name, "^k8s\\..*$")
编辑器(小写,原地修改数据):
set(span.attributes["region"], "us-east-1")
delete_key(resource.attributes, "internal.key")
limit(log.attributes, 10, [])
请参阅函数参考,了解编辑器和转换器的完整列表。
条件语句
使用 where 有条件地应用转换:
span.attributes["db.statement"] = "REDACTED" where resource.attributes["service.name"] == "accounting"
Nil 检查
使用 nil 检查是否缺失(而非 null):
resource.attributes["service.name"] != nil
验证工作流
- 验证配置语法 — 运行
otelcol validate --config=config.yaml,在启动 Collector 前检查编译错误。 - 使用 debug exporter 测试 — 将转换后的遥测数据路由到
debugexporter 并检查输出:
exporters:
debug:
verbosity: detailed
service:
pipelines:
traces:
receivers: [otlp]
processors: [transform]
exporters: [debug] # swap in production exporter once validated
- 在生产环境中设置
error_mode: ignore— 请参阅错误处理。 - 切换到生产环境的 exporter — 将
debug替换为生产环境的 exporter。
常见模式
- 设置属性
- 按模式丢弃遥测数据
- 丢弃过期数据
- 补齐缺失的时间戳
- Filter 处理器示例
- Transform 处理器示例
- 防御性 Nil 检查
- 编辑敏感数据 — 策略:替换、遮蔽、哈希、删除和丢弃。
- 规范化高基数属性 — 路径段、IP 遮蔽以及属性数量和长度限制。
- 使用静态属性丰富遥测数据
错误处理
编译错误
在处理器初始化期间发生,并会阻止 Collector 启动:
- 语法无效(缺少引号)
- 未知函数
- 路径表达式无效
- 类型不匹配
运行时错误
在遥测数据处理期间发生:
- 访问不存在的属性
- 类型转换失败
- 函数执行错误
错误模式配置
始终显式设置 error_mode;默认值因组件而异。
从 Collector Contrib v0.153.0 起,transform 和 filter 处理器的默认值为 ignore;在此之前,默认值为 propagate。
routing 和 signaltometrics 连接器的默认值为 propagate。
count 和 sum 连接器没有 error_mode 键,且始终会传播错误。
| 模式 | 行为 | 使用场景 |
|---|---|---|
ignore | 记录错误并继续执行下一条语句 | 生产环境和一般用途 — transform 和 filter 处理器的默认值 |
propagate | 将错误返回到流水线,并从 Collector 丢弃负载 | 开发环境和严格环境,适合需要捕获每个错误的场景 |
silent | 忽略错误且不记录日志 | 错误日志会造成干扰,且转换已知安全的高流量流水线 |
processors:
transform:
error_mode: ignore
trace_statements:
- set(span.attributes["parsed"], ParseJSON(span.attributes["json_body"]))
语句是一个扁平列表;Collector 会根据路径前缀推断上下文(span、metric、datapoint、log 等)。
只有当一组语句混合了无法推断为单一上下文的路径,或者需要组级条件或 error_mode 时,才使用带有显式 context: 的对象形式。
性能
使用 where 子句尽早跳过项目。
# BAD — runs replace_pattern on every span
replace_pattern(span.attributes["url.path"], "/\\d+", "/{id}")
# GOOD — skips spans that lack the attribute
replace_pattern(span.attributes["url.path"], "/\\d+", "/{id}") where span.attributes["url.path"] != nil