Skip to main content
skill CX Codex

otel-span-events-to-logs-migration — Claude Code skill

Guides OpenTelemetry instrumentation migrations from Span Events to the Logs API while retaining trace correlation. Use it to plan a migration or review existing calls.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add ollygarden/opentelemetry-agent-skills --skill otel-span-events-to-logs-migration -a claude-code
Open on GitHub

What otel-span-events-to-logs-migration does

The skill guides an agent through finding AddEvent, RecordException, and language-specific equivalents, then classifying each call site: move it to the Logs API, turn it into span attributes, or remove it. Migrated records should retain the span context, event name, attributes, and timestamp. For exceptions, the guidance covers exception.type and exception.message, with a stack trace when the language and error type make one meaningful.

Before changing code, check whether the OpenTelemetry SDK version supports log-based events, whether a LoggerProvider is configured, and whether downstream systems rely on events inside the span proto. If they do, configure an SDK bridge to map log records back to span events. Without a LoggerProvider, the migration also needs provider setup.

The workflow ends with re-reading changed files and checking each item against a migration checklist, with file references as evidence. It also gives specific guidance for Go logger and record attributes, and for the Java bridge after the contrib implementation was removed. Language-specific migration patterns are in references files.

What it helps with

  • find Span Event calls across a codebase
  • classify calls for migration, conversion to attributes, or removal
  • move events and exceptions to the Logs API with span context intact
  • check LoggerProvider setup and downstream compatibility needs
  • verify changed files against a migration checklist

Example prompts for the agent

  • Move AddEvent and RecordException calls to the Logs API while keeping their link to the active span.
  • Find every Span Event call and classify it for migration, conversion to attributes, or removal.
  • Review the OpenTelemetry migration against its checklist and cite files for each completed item.

How to install otel-span-events-to-logs-migration

1Skills CLI (Vercel)

npx skills add ollygarden/opentelemetry-agent-skills --skill otel-span-events-to-logs-migration -a claude-code

2Manually: put the files in place

~/.claude/skills/otel-span-events-to-logs-migration/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/otel-span-events-to-logs-migration/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about otel-span-events-to-logs-migration

How do I install otel-span-events-to-logs-migration in Claude Code?

Run npx skills add ollygarden/opentelemetry-agent-skills --skill otel-span-events-to-logs-migration -a claude-code. The skill file is at ~/.claude/skills/otel-span-events-to-logs-migration/SKILL.md.

What does otel-span-events-to-logs-migration do?

It helps migrate Span Event calls to the Logs API, classify call sites, and review the changes against a checklist. The workflow accounts for trace correlation and downstream compatibility.

What should I check before migrating OpenTelemetry Span Events?

Check that the SDK version supports log-based events, that a LoggerProvider is configured, and whether downstream systems need events in the span proto. If they do, configure the SDK bridge that maps logs back to span events.

Source text

SKILL.md · Apache-2.0
---
name: otel-span-events-to-logs-migration
description: Migrate OpenTelemetry Span Events (AddEvent, RecordException, and language equivalents) to the Logs API following the accepted OTEP 4430 migration plan. Use when migrating instrumentation from span events to log-based events, reviewing code that still uses AddEvent or RecordException, or planning a codebase migration while preserving trace correlation.
---

# Span Events to Logs Migration

Use this skill to migrate instrumentation from the Span Event API (`AddEvent`, `RecordException`, and language equivalents) to the Logs API, following the accepted [OTEP 4430 deprecation plan](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.61.0/oteps/4430-span-event-api-deprecation-plan.md).

## Background

The OpenTelemetry project accepted a plan to deprecate `Span.AddEvent` and `Span.RecordException` in favor of emitting events and exceptions through the Logs API. Span Events as a concept remain valid -- they can be emitted via logs that correlate to the active span, and optionally bridged back into the span proto.

Status as of 2026-10-03: OTEP 4430 is accepted, log-based event/exception emission is specified in the Logs API, and the SDK "event to span event bridge" is specified with Development status. The trace API methods `AddEvent`/`RecordException` are not yet formally marked Deprecated in the specification -- that step is still pending. Treat existing span-event calls as migration candidates, not automatically invalid code; some SDK-specific equivalents have already changed status (for example OpenTelemetry .NET's `Activity.RecordException` extension is `[Obsolete]` in favor of `Activity.AddException`, which is still a span-event API).

See `references/deprecation-plan.md` for the full context.

## Workflow

0. Prepare before migrating.
- check the project's OpenTelemetry SDK version supports log-based events (check the `otel-sdk-versions` skill's version index if available)
- identify whether the project has a LoggerProvider configured; if not, one must be set up
- determine if downstream consumers (backends, dashboards, alerts) depend on span events appearing in the span proto envelope

1. Scan the codebase for span event usage.
- search for `AddEvent`, `add_event`, `addEvent`, `RecordException`, `record_exception`, `recordException`, `RecordError`, `record_error`, `AddException`, and language-specific variants
- categorize each call site: general event, exception recording, or informational annotation
- note the span context, attributes, and timestamp usage at each site

2. Classify each call site using the decision tree.
- see `references/decision-tree.md` for the full classification logic
- the three outcomes are: migrate to log-based event, convert to span attributes, or remove

3. Apply the migration for each call site.
- see `references/migration-patterns.md` for language-specific before/after patterns
- ensure the replacement log record carries the correct span context, event name, attributes, and timestamp; for exceptions use the applicable semantic-convention event name (normally an operation-specific `.exception` name), reserving `exception` for generic handlers
- in Go (1.47.0+, Logs API/SDK stable), get loggers with `otel.Logger` from the root `go.opentelemetry.io/otel` package (`otel/log/global` is deprecated)
- in Java, the contrib `io.opentelemetry.contrib.eventbridge.EventToSpanEventBridge` was removed in opentelemetry-java-contrib v1.60.0; use `io.opentelemetry.sdk.extension.incubator.logs.EventToSpanEventBridge` from `opentelemetry-sdk-extension-incubator` (see `references/backward-compat.md`)
- in Go, `log.Record.AddAttributes` accepts `attribute.KeyValue`: use `attribute.String(...)`, not `log.String(...)`; set the event name with `Record.SetEventName(...)`
- for exceptions, preserve the applicable semconv attributes: `exception.type` and `exception.message` (at least one is required), plus `exception.stacktrace` when the language/error type makes it meaningful (in Go, omit it unless an error library preserves the origin stack -- do not call `runtime.Stack` at the emit site)

4. If backward compatibility is needed, configure the SDK bridge.
- see `references/backward-compat.md`
- this is an SDK-level log processor that converts log-based events back to span events
- only needed when downstream systems require span events in the same proto envelope as the span

5. Verify the migration.

## Required Completion Loop

Follow this loop every time:
1. scan and classify all span event call sites
2. migrate each call site following the decision tree and patterns
3. review the changed code against the checklist below
4. re-open the changed files and confirm each checklist item with codebase evidence
5. if any item is unresolved, patch the code or mark it not applicable with a reason, then repeat the review
6. do not finish until every checklist item is completed or explicitly marked not applicable

Do not mark a checklist item complete based on intent alone. Mark it complete only after confirming it in the current codebase.

## Migration Checklist

For every item, report one of these statuses in the final answer:
- `[x]` completed
- `[~]` not applicable, with a reason
- `[ ]` unresolved

Include file references as evidence for every completed item.

- `[ ]` All general span-event call sites identified and classified, including `AddEvent` / `add_event` / `addEvent` and language equivalents such as .NET `ActivityEvent`.
- `[ ]` All exception span-event call sites identified and classified, including `RecordException` / `record_exception` / `recordException` and language equivalents such as Go `RecordError`, Rust `record_error`, and .NET `AddException`.
- `[ ]` A LoggerProvider is configured in the SDK setup (or already existed).
- `[ ]` Each migrated event uses the Logs API with the correct event name and attributes.
- `[ ]` Each migrated exception preserves the applicable semconv attributes: `exception.type` and `exception.message` (at least one is required), plus `exception.stacktrace` when the language/error type makes it meaningful.
- `[ ]` Migrated log records carry the active span context for trace correlation.
- `[ ]` Call sites classified as "convert to span attributes" now use span attributes instead.
- `[ ]` Call sites classified as "remove" have been removed with justification.
- `[ ]` Backward compatibility bridge is configured if downstream systems require span events in the span envelope.
- `[ ]` No remaining span-event API call sites are left unintentionally; any retained `AddEvent` / `RecordException` / `RecordError` / `AddException` / `ActivityEvent` / equivalent call is justified for current-version compatibility.
- `[ ]` The changed files were re-read after implementation to verify the final state.
- `[ ]` The final answer includes this checklist, file evidence, and any remaining risks or gaps.

## Final Review Format

In the final answer, include the checklist in this format:
- `[x]` LoggerProvider configured. Evidence: `src/telemetry/setup.go:42` -- added OTLP log exporter with batch processor.
- `[~]` Backward compatibility bridge. Reason: no downstream systems depend on span events in the proto envelope.
- `[ ]` Exception migration. Missing evidence; re-check required.

© ollygarden · Apache-2.0 · ollygarden/opentelemetry-agent-skills

Similar skills

All skills for DevOps and infrastructure →

From the same set20

otel-weaver Guides OpenTelemetry Weaver registry authoring, codegen, and CI validation. It replaces manual telemetry constants with schema-driven code. CX Codex +1 ★ 116repo stars otel-upgrade This skill assesses OpenTelemetry upgrades against a repository’s versions and evidence. Use it to plan a move to a new SDK, Collector, or related component. CX Codex +1 ★ 116repo stars otel-telemetrygen Builds version-pinned telemetrygen commands for synthetic OTLP traces, metrics and logs aimed at a collector. CX Codex +1 ★ 116repo stars otel-telemetry-emissions Version-pinned registry of telemetry emitted by OpenTelemetry components and SDKs. Inspect spans, metrics, and logs before updating collector pipelines. CX Codex +1 ★ 116repo stars otel-semantic-conventions A skill that looks up released OpenTelemetry semantic conventions: group names, attributes and span naming rules. Useful when the agent would otherwise invent keys. CX Codex +1 ★ 116repo stars otel-sdk-versions Looks up released OpenTelemetry SDKs, Collector components, config schemas, and semantic conventions. Helps pick compatible versions when adding telemetry. CX Codex +1 ★ 116repo stars otel-ruby Guides an agent through OpenTelemetry setup and troubleshooting in Ruby services. Use it for tracing, experimental metrics and logs, or library instrumentation. CX Codex +1 ★ 116repo stars otel-python A skill that helps your agent set up and debug OpenTelemetry in Python services: SDK config, declarative YAML, zero-code instrumentation. CX Codex +1 ★ 116repo stars

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor