From opentelemetry-agent-skills
Authors OpenTelemetry Weaver registries (YAML), generates SDK constants from Jinja2 templates, and enforces policies via Rego. Use when adopting Weaver, writing or reviewing a registry, or wiring codegen into CI.
How this skill is triggered — by the user, by Claude, or both
Slash command
/opentelemetry-agent-skills:otel-weaverThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use this skill when an organization wants to define its own semantic conventions on top of upstream OTel and generate language bindings from them.
Use this skill when an organization wants to define its own semantic conventions on top of upstream OTel and generate language bindings from them.
Usage:
otel-semantic-conventions to decide which attributes already exist upstream and should not be redeclared in the local registryotel-sdk-versions only for SDK package selection; Weaver versions are tracked separately at https://github.com/open-telemetry/weaver/releasesIf a companion skill is unavailable:
schemas/semconv-syntax.v2.md, and docs/usage.md / docs/validate.mdThree moving parts:
manifest.yaml is required and names the registry, declares semconv_version and schema_url. The rest declare attributes, metrics, spans, events, entities. The local registry's semconv_version is yours to manage; bump it on changes.weaver.yaml per target language describing which templates to run, with what filter, in what application_mode, and with what output filename.These three replace a hand-rolled const.go (or equivalent): const blocks become the registry, the act of writing them becomes codegen, and tribal knowledge becomes policies.
otel/weaver:vX.Y.Z Docker image, or the setup-weaver GitHub Action). Never brew install weaver — that resolves to an unrelated Scribd tool.ref rather than redeclaring them. Boundary domains (http, db, messaging, rpc, network, gen-ai, ...) belong in upstream OTel semconv, not in a local registry. Use the language SDK's semconv package for those at runtime.stability. Weaver refuses to generate without it.ecommerce., acme.) for org-local attributes, metrics, and spans.gofmt -w, prettier, ruff format, ...) on generated output. Jinja whitespace produces multiple blank lines; without formatting, the diff check in CI will fail spuriously.weaver registry resolve -r <reg> -f json -o /tmp/r.json and inspect — input key/name/type fields are renamed at resolve time (see references/template-authoring.md).otel/weaver:vX.Y.Z Docker image, or the setup-weaver GitHub Action. Use Docker for CI and reproducible local runs.manifest.yaml plus at least one of attributes.yaml / metrics.yaml / spans.yaml / events.yaml. See references/registry-authoring.md.templates/registry/<lang>/ with weaver.yaml plus *.j2. See references/template-authoring.md.weaver registry check -r ./telemetry/registry/ for fast feedback. weaver registry generate --registry ./telemetry/registry/ --templates ./telemetry/templates/ <lang> <output-dir> for codegen. Run the language formatter on the output.check (schema), generate + git diff --exit-code (checked-in code is current), diff against the base branch (surfaces breaking changes). See references/ci-integration.md.These cost time and are not obvious from the upstream docs:
brew install weaver installs the wrong tool. Use GitHub releases or Docker.weaver registry generate.key → resolved name. Metric input name → resolved metric_name. Span input type → resolved id of the form span.<type>, with a flat name string equal to the input name.note. Always resolve and inspect before writing a template.comment Jinja filter takes a keyword argument: attr.brief | comment(format="go"). It already emits the // prefix; do not add another.semconv_signal("span"; {}) | group_by(.root_namespace) | map({root_namespace: .[0].root_namespace, spans: . | sort_by(.id)})
It must be single-quoted in weaver.yaml; the colons in jq syntax collide with YAML mapping rules otherwise.weaver registry check emits "File format definition/2 is not yet stable" on every run as of 0.22.1. This is normal; do not treat it as a failure.--future is opt-in but breaks today on definition/2. Note this in CI guidance and re-enable once the format goes stable.generate: target directory name is positional after --registry and --templates; the output directory follows. --templates points at the parent that contains target dirs, not at the language-specific subdir.type, kind (client/server/producer/consumer/internal), brief, stability, and a structured name: { note: "..." }. For internal business spans, putting the dotted type identifier in name.note and using the resolved span.name string at runtime is clean..total suffix from counter names — OTel naming has moved away from it.s) for duration histograms, not milliseconds. Migrating from ms is a natural step when authoring the schema; flag it.references/registry-authoring.mdreferences/template-authoring.mdreferences/ci-integration.mdreferences/migration-playbook.mdotel-semantic-conventionsmanual-instrumentationThese are natural follow-ups but not part of this skill:
weaver registry live-check against a local collectorMyMetricName(meter) wrappers)If you authored or modified a Weaver registry, templates, or CI integration:
weaver registry check against the registry and capture the resultweaver registry generate and the language formatter, then verify git diff --exit-code is cleanReport the final check with:
[x] completed[~] not applicable, with a reason[ ] unresolvedUse these items:
manifest.yaml with name, semconv_version, schema_urlstability.total suffixs (seconds)check, generate + git diff --exit-code, and diff against the base branchnpx claudepluginhub ollygarden/opentelemetry-agent-skills --plugin otel-javaConfigures OpenTelemetry SDK providers (tracer, meter, logger) via declarative YAML. Replaces scattered OTEL_* env vars and programmatic setup for telemetry pipelines with OTLP exporters and sampling strategies.
Guides OpenTelemetry SDK setup, custom instrumentation (spans, attributes, events, links), sampling, OTel Collector config, and OTLP export to Honeycomb for Go, Python, Node.js, Java, Ruby, .NET, Rust.
Helps write and debug OpenTelemetry Transformation Language (OTTL) expressions for Collector components like processors, connectors, receivers, and exporters. Covers syntax, contexts, functions, error handling, and validation workflows.