关于 otel-weaver
面向使用 Weaver 定义组织专属 OpenTelemetry 语义约定的团队的实用参考技能,指导编写注册表、基于模板生成代码、验证及 CI 检查。
主要功能
- 01YAML 语义注册表编写
- 02MiniJinja 模板指导
- 03注册表验证与代码生成
- 04Rego 策略概念
- 05用于架构和变更的 CI 检查
适用场景
- 01定义组织专属遥测约定
- 02从注册表生成语言绑定
- 03验证注册表及生成结果
- 04在 CI 中加入约定检查
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ ollygarden/ opentelemetry-agent-skills --skill otel-weaver安装后在 Claude Code 中输入/otel-weaver确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
evals/evals.jsonreferences/ci-integration.mdmigration-playbook.mdregistry-authoring.mdtemplate-authoring.mdscripts/inspect-resolved.sh详细介绍
OpenTelemetry Weaver
当组织希望在上游 OTel 语义约定的基础上定义自己的语义约定,并据此生成语言绑定时,请使用此技能。
用法:
- 配合
otel-semantic-conventions,确定哪些属性已存在于上游,因而不应在本地注册表中重新声明 - 最新 Weaver 版本:如果
otel-sdk-versions索引中列出了 Weaver,则使用该索引;否则使用 https://github.com/open-telemetry/weaver/releases;references/ci-integration.md中记录了带日期的 Weaver/semconv 兼容性信息,可用于离线回答
如果无法使用配套技能:
- 不要停止
- 如果可以从官方来源核实指导内容,就不要只依赖记忆
- 查阅 Weaver 仓库、
schemas/semconv-syntax.v2.md和docs/usage.md/docs/validate.md - 说明使用了哪种替代方案,并将任何未经核实的事项保留为未解决状态
心智模型
包含三个组成部分:
- 注册表 — YAML 文件目录。必须包含
manifest.yaml;其中声明file_format: definition_manifest/2.0(版本支持情况见:带日期的记录),其schema_url(OTel Schema URL 格式:http[s]://host/path/<version>)既用于命名注册表,也通过最后一个路径段标明其版本。依赖项也必须包含schema_url,并可选包含registry_path。其余文件声明attributes、metrics、spans、events、entities。schema_url中的版本段由你管理;有更改时应递增版本。(semconv_version和schema_base_url已弃用,改用schema_url;顶层name不是 v0.28.0 manifest 字段。) - 模板 — MiniJinja 文件目录(与 Jinja2 兼容,但并非完整的 Jinja2——自 v0.22.0 起,默认关闭自动转义,并支持循环中的
break/continue),另有每种目标语言对应的weaver.yaml,用于描述要运行哪些模板、使用何种过滤器、采用何种application_mode,以及输出文件名。 - 策略 — 由 Regorus(兼容 OPA)引擎评估的 Rego 规则,分属四个包:
before_resolution(原始解析组;不受支持,使用--v2时会跳过)、after_resolution(已解析的注册表)、comparison_after_resolution(仅在传入--baseline-registry时使用)和live_check_advice(在live-check期间按样本评估)。内置 OTel 策略是基础;自定义策略则叠加组织规则。
这三项取代了手工编写的 const.go(或同类文件):常量块变为注册表,编写常量的工作变为代码生成,约定俗成的知识则变为策略。
不可妥协的规则
- 通过 https://github.com/open-telemetry/weaver#install 中记录的方法之一安装 Weaver(发布二进制文件、
otel/weaver:vX.Y.ZDocker 镜像或setup-weaverGitHub Action)。切勿执行brew install weaver——它会安装 Scribd 的另一个无关工具。 - 上游 semconv 属性应通过
ref引用,而不是重新声明。边界域(http、db、messaging、rpc、network、gen-ai等)属于上游 OTel semconv,而不是本地注册表。运行时应使用语言 SDK 的 semconv 包来处理这些属性。 - 每个属性和信号定义都必须包含
stability;枚举成员也要包含——weaver registry check不会检测缺失的stability(参见 registry-authoring.md)。 - 在 v2 中,属性引用可以细化
brief、note、examples和annotations等字段,但不能细化stability或deprecated;这些字段始终取自属性定义。 - 组织本地属性、指标和跨度应使用域名前缀(例如
ecommerce.、acme.)。 - 对生成的输出运行语言格式化工具(
gofmt -w、prettier、ruff format等)。Jinja 的空白处理会产生多个空行;如果不进行格式化,CI 中的差异检查会错误地失败。 - 编写模板前,先确认解析后的架构形状。对于
definition/2注册表,使用{"v2": true}调用分组 jq 辅助函数;v2 模板ctx会保留key等属性字段、name等指标字段、跨度的type/kind和结构化的span.name.note,以及实体的type/identity/description。有关如何转储确切形状,请参见references/template-authoring.md。
工作流
- 安装或定位 Weaver。 按照 https://github.com/open-telemetry/weaver#install 中的上游安装说明操作——选择固定版本的发布二进制文件、
otel/weaver:vX.Y.ZDocker 镜像或setup-weaverGitHub Action。在 CI 和可复现的本地运行中使用 Docker。 - 编写注册表。 必需内容:
manifest.yaml,以及一个或多个声明属性、属性组、指标、跨度、事件或实体的definition/2YAML 文件。参见references/registry-authoring.md。 - 编写模板。 在
templates/registry/<lang>/下为每种语言创建一个目标目录,其中包含weaver.yaml和*.j2。参见references/template-authoring.md。 - 验证并生成。 使用
weaver registry check --v2 -r ./telemetry/registry/快速获取反馈。使用weaver registry generate --v2 --registry ./telemetry/registry/ --templates ./telemetry/templates/ <lang> <output-dir>生成代码。对输出运行语言格式化工具。 - 接入 CI。 设置三个检查关卡:
check(架构)、generate+git diff --exit-code(确保已提交的代码为最新版本)、与基础分支进行diff(发现破坏性变更)。参见references/ci-integration.md。
Weaver CLI 还有许多本工作流未涉及的子命令:用于快速检查注册表的 stats 和 json-schema、用于保持文档中的 semconv 片段为最新的 update-markdown、用于处理实时 OTLP 遥测数据的 emit/live-check/infer、用于写入自包含解析后注册表工件的 package(用于替代已弃用的 resolve)、用于向 LLM 工具公开注册表的 mcp,以及提供 HTTP + UI 模式的 serve。这些都不在本文范围内(见下文),但在认定 check/generate/diff 已涵盖全部功能前,值得先了解它们的存在。
注意事项
这些问题会浪费时间,而且上游文档中并未明确说明:
brew install weaver安装的是错误的工具。请使用 GitHub releases 或 Docker。- 生成的输出未经过格式化工具整理。在运行
weaver registry generate后,务必运行对应语言的格式化工具。 - Jq 辅助函数默认针对旧版 schema。对于
definition/2,请传入{"v2": true},并使用保留的 v2 字段:属性key、指标name、span 的type/kind和span.name.note,以及实体的type/identity/description。编写模板前,务必先生成并检查筛选后的ctx。 commentJinja 筛选器使用关键字参数:attr.brief | comment(format="go")。它已经会输出//前缀;请勿再添加一个。- 属性、指标、span、事件和实体都有预构建的分组 jq 筛选器(
semconv_grouped_attributes、semconv_grouped_metrics、semconv_grouped_spans、semconv_grouped_events、semconv_grouped_entities)。对于definition/2,请使用(例如)semconv_grouped_spans({"v2": true})作为折叠式 YAML 标量;不带参数的辅助函数默认选择旧版 schema。 - 对于自定义 v2 definition 文件,
weaver registry check会输出“File formatdefinition/2is not yet stable”(警告;在references/ci-integration.md的带日期记录中仍然如此)。这是正常情况;请勿将其视为失败。缺少 manifestfile_format也会发出警告;请添加该字段来修复。 --future默认不启用,但对于自定义 v2 registry,它仍会将definition/2不稳定警告(以及 manifest 缺少file_format的警告)提升为错误。请在格式稳定前保持关闭。generate的 CLI 参数顺序:目标目录名称是位置参数,位于--registry和--templates之后;输出目录紧随其后。--templates指向包含目标目录的父目录,而不是特定语言的子目录。- registry 中的 span 名称与运行时名称:必需的 schema 字段是
type、kind(client/server/producer/consumer/internal)、brief、stability,以及结构化的name: { note: "..." }。对于内部业务 span,将带点的类型标识符放入name.note,并在运行时渲染解析后的span.name.note字符串,是一种简洁的做法。 - 哪些内容不应放入本地 registry。 DB、HTTP、消息传递、RPC、网络、GenAI 等边界 span/属性遵循上游 OTel semconv。在将上游内容作为 manifest 依赖项引入之前,这些内容的检测应直接引用语言 SDK 的 semconv 包。这是最常见的建模错误。
- Counter 和 UpDownCounter 的名称不应附加
_total;这是 semconv v1.44.0 的命名规则。 - 根据 semconv v1.44.0 的单位指南,时长测量工具应使用秒(
s)。
按需加载的参考资料
- registry YAML 字段参考:
references/registry-authoring.md - Jinja2 模式、jq 筛选器、解析后结构速查表:
references/template-authoring.md - 可直接采用的 GitHub Actions 示例及带日期的版本兼容性记录:
references/ci-integration.md - 从手动维护常量迁移到 registry 的指南:
references/migration-playbook.md - 语义约定技能:
otel-semantic-conventions - 手动检测技能:
manual-instrumentation
不在范围内
以下是顺理成章的后续工作,但不属于此技能范围:
- 将 registry 发布为供下游使用者使用的带版本工件(
weaver registry package) - 将上游语义约定声明为 manifest 依赖项
- 针对实时 OTLP 遥测数据使用
weaver registry live-check/emit/infer weaver registry mcp/weaver serve- 超出内置策略范围的自定义 Rego 策略
- 辅助函数代码生成(
MyMetricName(meter)封装器)
验证约定
如果你创建或修改了 Weaver 注册表、模板或 CI 集成:
- 完成前重新打开已更改的文件
- 针对
definition/2注册表运行weaver registry check --v2,并记录结果 - 运行
weaver registry generate --v2和语言格式化工具,然后验证git diff --exit-code没有差异 - 使用代码库证据确认每个适用项
报告最终检查结果时使用:
[x]已完成[~]不适用,并说明原因[ ]尚未解决
使用以下检查项:
- 注册表包含
manifest.yaml,其中有file_format: definition_manifest/2.0,且schema_url的最后一个路径段为版本号 - 每个定义和枚举成员都有
stability - 组织本地属性/指标/跨度使用域前缀
- 本地没有重复添加边界域(http/db/messaging/rpc/network/gen-ai)条目
- Counter 和 UpDownCounter 名称没有
_total后缀 - 时长直方图使用
s(秒) - 模板使用与解析后的架构相匹配的 jq 筛选器(对于
definition/2,调用带有{"v2": true}的预构建semconv_grouped_*辅助函数) - 生成的输出符合格式规范
- CI 运行
check、generate+git diff --exit-code,以及与基准分支的diff - 已重新阅读更改过的文件
- 已说明剩余风险或缺口
评论
支持 Markdown