关于 otel-ottl
otel-ottl 是编写 Collector 组件中 OpenTelemetry Transformation Language 语句的参考技能,基于 collector-contrib v0.163.0,涵盖上下文、函数、错误处理和端到端验证。
主要功能
- 01选择组件与上下文
- 02核对函数签名和版本
- 03错误行为配置指引
- 04OTTL 语法与 YAML 易错点
- 05Collector 验证工作流
适用场景
- 01重写遥测属性
- 02过滤或路由遥测数据
- 03检查 OTTL 与 Collector 版本的兼容性
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ ollygarden/ opentelemetry-agent-skills --skill otel-ottl安装后在 Claude Code 中输入/otel-ottl确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
evals/evals.jsonreferences/contexts.mdfunctions.mdquick-reference.md详细介绍
OpenTelemetry 转换语言(OTTL)
OTTL 可在 Collector 组件中转换或筛选遥测数据。本技能固定使用 collector-contrib v0.163.0。函数、路径、默认值和功能门的可用性因版本而异;如果用户使用的版本不同,请对照相应的上游标签进行核实。
v0.162.0 和 v0.163.0 中 OTTL 功能门的日期状态见 references/functions.md。
工作流
- 选择组件。
transform会重写数据,filter会丢弃数据,tail_sampling会决定是否保留链路,routing会将遥测数据发送到管道。组件决定其可用的上下文和函数。 - 选择可用的最低层级上下文。 较低层级的上下文可以读取其父级(例如,span 可以读取
resource.attributes),但父级无法读取子级。对于数据点属性,请使用datapoint,而不要遍历metric.data_points。 - 核实每个发出的函数,然后编写语句。 在 references/functions.md 中确认每个函数的准确标识符和签名。如果找不到某个标识符,请将其视为不受支持,而不要推导或替换成看似合理的名称。
set或delete_key等编辑器会修改数据,并且可能带有where条件。ParseJSON和IsMatch等转换器会返回值,不会修改数据。 - 明确设置错误行为。
ignore会记录语句错误并继续;silent会继续执行但不记录错误;propagate会返回错误,并可能导致组件丢弃载荷。Transform 和 filter 默认使用ignore;transform 的默认错误功能门已于 v0.162.0 移除,因此在--feature-gates中指定它会导致启动失败(历史记录:otel-collector技能中的 transform 特殊情况);filter 的功能门则已稳定,无法禁用。Routing 在其 beta 默认错误功能门启用时也默认使用ignore。对于 routing,ignore会将发生错误的载荷发送到default_pipelines;请配置此回退,否则载荷会被丢弃。 - 端到端验证。 验证准确的 Collector 版本(从 v0.163 起,
validate也会解析 routing connector 条件),然后发送已知遥测数据并检查 file-exporter 输出。请使用 telemetrygen recipe。
set(span.attributes["env"], "prod") where resource.attributes["env"] == nil
仅加载任务所需内容
对于单个路径或函数,请只阅读相关章节,而不要加载完整目录。
安全性与正确性检查
- 转换前,先对可选或多态输入进行保护:
where x != nil、IsString(x)或相应的类型检查。 - 对仅处理 JSON 对象的场景,在调用
ParseJSON前同时检查类型和形状,例如IsString(log.body) and IsMatch(log.body.string, "(?s)^\\s*\\{.*\\}\\s*$")。RE2 的(?s)标志允许对象包含换行符。解析后再检查IsMap,无法阻止数组或标量 JSON 被解析。 - 对固定版本的请求,请根据对应的发布标签确认所有选用的路径和函数;
不要假定此技能 v0.163 基准中列出的函数在较早版本中存在。对于 v0.156 的 JSON 对象解析,
ParseJSON、IsString和IsMatch均可使用,不受 v0.157 的 alpha lambda 功能门控限制。 - 请求元数据为只读,且可能包含凭据。仅复制明确列入允许列表的非敏感键。OTLP 元数据路由需要在接收器上设置
include_metadata: true。 HTTP/客户端标头的拼写形式可能保留原样(otelcol.client.metadata["X-Tenant"][0]); gRPC 元数据键为小写(otelcol.grpc.metadata["x-tenant"][0])。 - 自 v0.156 起,路由
request上下文已弃用;请使用otelcol.client.metadata或otelcol.grpc.metadata。 - 针对日志记录的共享资源或范围数据重写,需要设置
flatten_data: true,并启用 alphatransform.flatten.logs功能门控。此操作会复制并重新分组数据;请勿意外启用。 - 自 v0.161 起,
set(target, nil)不再是无操作:ottl.set.allowNil功能门控在 v0.161 中进入 beta 阶段,并在 v0.162 中稳定(无法禁用)。nil 值会清空 map、slice 或pcommon.Value目标(会创建一个值为空的属性键),并在标量目标上报错。如果目标在输入缺失时必须保持不变,请使用where source != nil保护。 - 对标识符进行哈希并不一定能将其匿名化。保留个人数据的确定性哈希前,请遵循组织的数据处理政策。
常见语法陷阱
- 在 Collector YAML 中,将 OTTL 替换反向引用
${1}写作$${1}。像$1REDACTED这样的替换内容会被视为字面值,且不会报错,但捕获内容替换会静默失败。 - Go RE2 不接受较大的计数重复模式,例如
(.{1024}).*;请使用带 nil/类型保护的Substring和Len,或对 map 使用truncate_all。 - 当前的 span 事件路径使用
spanevent.*,而非span_event.*。缓存路径需限定上下文,例如span.cache["parsed"]。 - 当 YAML 中的 map 字面量包含冒号后的空格时,包含该字面量的 OTTL 语句必须加引号,例如
'set(log.attributes["a"], {"foo": "bar"})';否则 YAML 会将:解析为映射。 - 自 v0.159 起,多态
pcommon.Value路径会根据其底层类型进行比较;map 和 slice 仅支持相等和不等比较,而原始值也支持大小比较。 - 使用
Decode(value, "base64");Base64Decode已在 v0.161 中移除。 - OTTL 字符串中的正则表达式转义符需双写(
\\d、\\s、\\.)。
上游来源
评论
支持 Markdown