otel-weaver について
Weaver で組織固有の OpenTelemetry セマンティック規約を定義するチーム向けの実践的なリファレンススキルです。レジストリ作成、テンプレートによるコード生成、検証、CI チェックを案内します。
主な機能
- 01YAML セマンティックレジストリの作成
- 02MiniJinja テンプレートのガイド
- 03レジストリ検証とコード生成
- 04Rego ポリシーの概念
- 05スキーマと変更を確認する CI チェック
活用シーン
- 01組織固有のテレメトリー規約の定義
- 02レジストリからの言語バインディング生成
- 03レジストリと生成物の検証
- 04CI への規約チェック追加
インストール
コマンドをコピーしてターミナルで実行します。
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 バージョン:Weaver が掲載されている場合は
otel-sdk-versionsインデックス、そうでない場合は 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を参照してください - 使用した代替手段を明示し、未検証の項目は未解決のままにしてください
基本的な考え方
構成要素は 3 つです。
- レジストリ — YAML ファイルのディレクトリです。
manifest.yamlは必須で、そのschema_url(OTel スキーマ 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.26.1 のマニフェストフィールドではありません。) - テンプレート — MiniJinja ファイルのディレクトリです(Jinja2 と互換性がありますが、Jinja2 の全機能を備えているわけではありません。v0.22.0 以降、自動エスケープはデフォルトで無効であり、ループ内の
break/continueがサポートされています)。また、対象言語ごとにweaver.yamlを用意し、実行するテンプレート、適用するフィルター、application_mode、出力ファイル名を指定します。 - ポリシー — Regorus(OPA 互換)エンジンで評価される Rego ルールで、4 つのパッケージがあります。
before_resolution(解析済みの未処理グループ。--v2ではサポートされず、スキップされます)、after_resolution(解決済みレジストリ)、comparison_after_resolution(--baseline-registryを渡した場合のみ)、live_check_advice(live-check中、サンプルごと)です。組み込みの OTel ポリシーが最低限の基準となり、カスタムポリシーを重ねて組織固有のルールを適用します。
この 3 つの要素で、独自に作成した const.go(またはそれに相当するもの)を置き換えます。定数ブロックはレジストリになり、それを書く作業はコード生成に置き換わり、暗黙知はポリシーになります。
譲れないルール
- https://github.com/open-telemetry/weaver#install に記載されているいずれかの方法(リリースバイナリ、
otel/weaver:vX.Y.ZDocker イメージ、またはsetup-weaverGitHub Action)で Weaver をインストールしてください。brew install weaverは実行しないでください。無関係な Scribd のツールがインストールされます。 - 上流の semconv 属性は再定義せず、
refで参照してください。境界ドメイン(http、db、messaging、rpc、network、gen-aiなど)は、ローカルレジストリではなく上流の OTel semconv に属します。実行時には、それらの属性に言語 SDK の semconv パッケージを使用してください。 - すべての属性とシグナルの定義には
stabilityが必要です。v2 構文ガイドの要件に従い、列挙型のメンバーにも指定してください。Weaver v0.26.1 は、定義にstabilityがない場合はエラーにしますが、通常モードでは列挙型メンバーのstabilityがない場合は致命的でない警告のみを報告します。 - v2 では、属性参照で
brief、note、examples、annotationsなどのフィールドは詳細化できますが、stabilityやdeprecatedは変更できません。これらは常に属性定義から取得されます。 - 組織内の属性、メトリクス、スパンには、ドメインプレフィックス(例:
ecommerce.、acme.)を使用してください。 - 生成された出力には、言語フォーマッター(
gofmt -w、prettier、ruff formatなど)を実行してください。Jinja の空白処理により複数の空行が生成されるため、フォーマットしないと CI の差分チェックで誤って失敗します。 - テンプレートを作成する前に、解決後のスキーマ形状を確認してください。
definition/2レジストリでは、グループ化された jq ヘルパーを{"v2": true}とともに呼び出してください。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と、属性、属性グループ、メトリクス、スパン、イベント、またはエンティティを宣言する 1 つ以上の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 に組み込みます。 3 つのゲートがあります。
check(スキーマ)、generateとgit diff --exit-code(チェックイン済みコードが最新であること)、ベースブランチとの差分(破壊的変更を検出)です。references/ci-integration.mdを参照してください。
Weaver CLI には、このワークフローで扱う以外にも多くのサブコマンドがあります。レジストリの簡易チェックには stats と json-schema、ドキュメント内の semconv の抜粋を最新に保つには update-markdown、ライブの OTLP テレメトリを扱うには emit/live-check/infer、自己完結型の解決済みレジストリアーティファクト(非推奨の resolve の後継)を書き出すには package、LLM ツールにレジストリを公開するには mcp、HTTP+UI モードには serve を使用できます。これらはここでは対象外ですが(以下を参照)、check/generate/diff が機能のすべてだと思い込む前に、存在を知っておくとよいでしょう。
注意点
時間がかかり、上流ドキュメントからは分かりにくい点です。
brew install weaverでは、別のツールがインストールされます。GitHub のリリースまたは Docker を使用してください。- 生成された出力はフォーマッターで整形された状態ではありません。
weaver registry generateの後には、必ず言語のフォーマッターを実行してください。 - Jq ヘルパーのデフォルトは、レガシースキーマを対象としています。
definition/2では{"v2": true}を渡し、保持される v2 フィールド(属性のkey、メトリクスのname、スパンのtype``/kindとspan.name.note、さらにエンティティのtype/`identity/description)を使用してください。テンプレートを書く前に、必ずフィルタリング済みのctxを生成して確認してください。 commentJinja フィルターはキーワード引数を取ります:attr.brief | comment(format="go")。//のプレフィックスはすでに出力されるため、追加しないでください。- 属性、メトリクス、スパン、イベント、エンティティには、それぞれグループ化済みの jq フィルター(
semconv_grouped_attributes、semconv_grouped_metrics、semconv_grouped_spans、semconv_grouped_events、semconv_grouped_entities)が用意されています。definition/2では、たとえばsemconv_grouped_spans({"v2": true})を折りたたみ形式の YAML スカラーとして使用してください。引数なしのヘルパーは、デフォルトでレガシースキーマを選択します。 weaver registry checkは、カスタム v2 定義ファイルに対して「File formatdefinition/2is not yet stable」(警告)を出力します(references/ci-integration.mdの日付付き記録でも同様です)。これは通常の動作であり、失敗として扱わないでください。--futureは明示的に指定する必要がありますが、カスタム v2 レジストリではdefinition/2の不安定性に関する警告をエラーに引き上げます。形式が安定するまでは指定しないでください。generateの CLI 引数の順序では、ターゲットディレクトリ名は位置引数として--registryと--templatesの後に置きます。出力ディレクトリはその後に続きます。--templatesには、言語固有のサブディレクトリではなく、ターゲットディレクトリを含む親ディレクトリを指定します。- レジストリ内のスパン名と実行時のスパン名について:必須のスキーマフィールドは、
type、kind(client/server/producer/consumer/internal)、brief、stability、および構造化されたname: { note: "..." }です。内部ビジネススパンでは、ドット区切りの型識別子をname.noteに入れ、実行時には解決済みのspan.name.note文字列を出力する方法がすっきりしています。 - ローカルレジストリに含めないもの。 DB、HTTP、メッセージング、RPC、ネットワーク、GenAI などの境界スパン/属性は、上流の OTel セマンティック規約に従います。上流の規約をマニフェスト依存関係として取り込むまでは、これらの計装では言語 SDK のセマンティック規約パッケージを直接参照してください。これは最もよくあるモデル化の間違いです。
- Counter と UpDownCounter の名前には、
_totalを追加しないでください。これは semconv v1.44.0 の命名規則です。 - 時間の長さを測るインストゥルメントでは、semconv v1.44.0 の単位ガイダンスに従い、秒(
s)を使用してください。
必要に応じて読み込む参考資料
- レジストリ YAML フィールドのリファレンス:
references/registry-authoring.md - Jinja2 のパターン、jq フィルター、解決済みの形状の早見表:
references/template-authoring.md - すぐに利用できる GitHub Actions の例と、日付付きのバージョン互換性記録:
references/ci-integration.md - 手動管理の定数からレジストリへの移行手順:
references/migration-playbook.md - セマンティック規約スキル:
otel-semantic-conventions - 手動計装スキル:
manual-instrumentation
対象外
次の項目は自然な次のステップですが、このスキルの対象ではありません。
- 下流の利用者向けにレジストリをバージョン付きアーティファクトとして公開すること(
weaver registry package) - 上流のセマンティック規約をマニフェスト依存関係として宣言すること
- ライブ 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があり、schema_urlの末尾のパス要素がバージョンになっている - すべての定義と列挙型メンバーに
stabilityがある - 組織固有の属性/メトリクス/スパンにドメインプレフィックスが付いている
- 境界ドメイン(http/db/messaging/rpc/network/gen-ai)の項目がローカルで重複定義されていない
- Counter と UpDownCounter の名前に
_totalサフィックスが付いていない - duration ヒストグラムで
s(秒)を使用している - テンプレートが、解決済みスキーマに一致する jq フィルターを使用している(
definition/2では、事前構築済みのsemconv_grouped_*ヘルパーを{"v2": true}とともに呼び出す) - 生成された出力がフォーマッターに準拠している
- CI で
check、generateとgit diff --exit-code、およびベースブランチとの差分確認を実行している - 変更したファイルを再度読み直している
- 残っているリスクや不足事項を明記している