Skip to content
Monitoring
Skill

/dt-setup-openinference-migration

Migrate a GenAI/LLM app off Traceloop/OpenLLMetry onto OpenInference with its OTel gen_ai.* semconv option enabled (`enable_genai_semconv` / `OPENINFERENCE_ENABLE_GENAI_SEMCONV`). Covers detecting the existing Traceloop setup, swapping the instrumentor per SDK, and the

From plugin
dynatrace
17236 skills1 MCP

Claude Code

$ npx -y skills add Dynatrace/dynatrace-for-ai --skill dt-setup-openinference-migration --agent claude-code

SKILL.md

dt-setup-openinference-migration.SKILL.md
name: dt-setup-openinference-migration
description: >-
  Migrate a GenAI/LLM app off Traceloop/OpenLLMetry onto OpenInference with its OTel gen_ai.*
  semconv option enabled (`enable_genai_semconv` / `OPENINFERENCE_ENABLE_GENAI_SEMCONV`). Covers
  detecting the existing Traceloop setup, swapping the instrumentor per SDK, and the
  ingestion-shape question that decides what's fixable afterward — an app-owned OTel trace
  exporter vs. instrumentation-only with OneAgent picking up the spans. Flags that the semconv
  option is additive, not a replacement — legacy llm.*/openinference.* attributes keep emitting
  alongside gen_ai.* — and covers the resulting cardinality trade-off and removal options
  (Collector transform vs. OpenPipeline), checking which is actually available first. Trigger:
  "migrate off Traceloop", "migrate off OpenLLMetry", "move to OpenInference", "enable
  OpenInference GenAI semconv". Do NOT use for a first instrumentation with no existing
  Traceloop setup, or an OpenInference app that never enables semconv (both dt-setup-genai).
license: Apache-2.0

Migrate off Traceloop/OpenLLMetry onto OpenInference

The migration-specific decision process for an app that's **already emitting spans via Traceloop/OpenLLMetry** and must move onto OpenInference with its `gen_ai.*` semantic-convention option on. It shares Detect/Validate machinery with **dt-setup-genai** — load that skill for the four-step instrument/enrich model, the `dtctl` validation contract, and multi-SDK handling. This skill covers only what differs: identifying the Traceloop setup, the instrumentor swap, and the gaps that remain once `gen_ai.*` flows — legacy attributes OpenInference keeps emitting, invocation parameters left unparsed, and guardrail signals the instrumentation never captured.

When you should not use this skill

  • No existing Traceloop/OpenLLMetry instrumentation to migrate away from → **dt-setup-genai**

(greenfield or enhance-existing instrumentation from scratch).

  • Already on OpenInference, semconv option never enabled, spans still arrive as

`llm.*`/`openinference.*` → load the **dt-setup-genai** skill and use its normalizer gate (`references/enrich-normalization.md`) instead — not a migration.

  • TypeScript/Node app, or any language other than Python → out of scope. The semconv option

this skill's flow depends on exists only in the Python OpenInference SDK today — a TypeScript app moving off Traceloop still needs dt-setup-genai's normalizer gate afterward, not this skill.

Where this skill must stop and ask

  • **Any edit to the customer's application code** — show the diff, get a yes, first.
  • **Whether to remove the legacy `llm.*`/`openinference.*` attributes** (step 4a) — a

trade-off, not a default to silently apply.

  • **Deploying an OTel Collector transform or an OpenPipeline pipeline** to the tenant — same

boundary dt-setup-genai draws — or the `gen_ai_normalizer` (collector processor or OpenPipeline pipeline), only after Validate shows gaps it would close. OpenPipeline needs extra care: its routing configuration is a single object shared by every pipeline on the tenant — read [references/openpipeline-safety.md](references/openpipeline-safety.md) first.

  • **Adding app code to capture a guardrail signal** the instrumentation doesn't emit (step 4c).
  • **Credentials** — never print, log, or store a token value.
  • **Message-content capture** — OpenInference captures prompt/response content by default,

independent of the semconv flag (as Traceloop does via `TRACELOOP_TRACE_CONTENT`); confirm the user still wants it once instrumentation changes hands.

The migration flow

baseline ─▶ detect Traceloop ─▶ ingestion shape ─▶ swap instrumentor ─▶ close semconv gaps ─▶ validate

0. Capture baseline and rollback state

Before editing anything, record what the service emits today and how to undo the change — the swap renames attributes and drops metrics that dashboards or alerts may read. Baseline query, consumer inventory, rollback checklist: [references/baseline-and-rollback.md](references/baseline-and-rollback.md).

1. Detect the existing Traceloop/OpenLLMetry setup

Confirm this is actually a migration — grep patterns and the package-name trap (some Traceloop packages are named `opentelemetry-instrumentation-<sdk>`, like genuine OTel ones) are in [references/detect-traceloop.md](references/detect-traceloop.md). Record which SDK(s) it wraps — each needs its own `openinference-instrumentation-<sdk>` replacement in step 3.

2. Confirm the ingestion shape

This decides what's actually fixable in step 4, so settle it before touching code. Three situations, not interchangeable for the cardinality question:

  • **App-owned trace exporter** — the app builds its own `TracerProvider`, attaches a

`BatchSpanProcessor` + OTLP exporter, and calls `set_tracer_provider(...)` before the instrumentor runs. The app controls the exporter, so a collector can sit in front of it.

  • **Instrumentation-only, OneAgent picks it up** — the code calls only the instrumentor's

`.instrument(...)`, with no `TracerProvider`/exporter setup; on a OneAgent-monitored host, OneAgent captures the spans by injecting into the process. Nothing the app controls sits on the wire, so a collector transform isn't an option later — only OpenPipeline can touch these spans post-ingestion.

  • **Traceloop-managed exporter** — the app calls `Traceloop.init()` and none of the symbols

above appear, but Traceloop itself creates the `TracerProvider` and a default OTLP exporter (destination via `TRACELOOP_BASE_URL`/`TRACELOOP_HEADERS`/`TRACELOOP_API_KEY`). Replacing it with only an OpenInference instrumentor silently drops the export path — first add an explicit provider + exporter with the same destination, then remove the init. `init_instrumentations(...)` is different: instrumentation only, like the second shape.

Full detection heuristic and a worked example of each shap

Read more
@dynatrace
Ships withdynatrace

Everything AI agents need to work with Dynatrace, starting with skills. Skills are portable knowledge packages following the Agent Skills open format. They give AI coding agents the domain-specific context to query, analyze, and interpret Dynatrace data.

17236 skills1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
172
Star history of Dynatrace/dynatrace-for-ai on GitHub, a chart by star-history.com

Other skills on dynatrace.

dt-alerting

dt-alerting

End-to-end Dynatrace alerting lifecycle — anomaly detector setup and model selection (static threshold, adaptive baseline,…

@dynatrace@dynatraceInstall Skill
dt-app-dashboards

dt-app-dashboards

Work with Dynatrace dashboards - create, modify, query, and analyze dashboard JSON including tiles, layouts, DQL queries,…

@dynatrace@dynatraceInstall Skill
dt-app-notebooks

dt-app-notebooks

Work with Dynatrace notebooks - create, modify, query, and analyze notebook JSON including sections, DQL queries, and…

@dynatrace@dynatraceInstall Skill
dt-dql-essentials

dt-dql-essentials

Core DQL syntax, pitfalls, query patterns, and query optimization. Load to write, build, fix, or OPTIMIZE a DQL query — prevents…

@dynatrace@dynatraceInstall Skill
dt-js-runtime

dt-js-runtime

Dynatrace server-side JS runtime — function contract, runtime limits, Web APIs, Node.js modules, fetch with credential vault, and…

@dynatrace@dynatraceInstall Skill
dt-migration

dt-migration

Migrate Dynatrace classic and Gen2 entity-based DQL to Smartscape equivalents. Covers three scenarios. (1) mass data queries…

@dynatrace@dynatraceInstall Skill

More skills from other plugins.

agentdb-advanced

agentdb-advanced

Master advanced AgentDB features including QUIC synchronization, multi-database management, custom distance metrics, hybrid…

ruview12d102k
@ruvnet@ruvnetInstall Skill
install

install

Kubeshark installation and deployment skill. Use this skill whenever the user wants to install Kubeshark, deploy Kubeshark to a…

@kubeshark@kubesharkInstall Skill
scan

scan

Scan a project with sentrux to get structural health grades (A-F) across 14 dimensions including coupling, cycles, cohesion, dead…

sentrux7mo3.3k
@sentrux@sentruxInstall Skill
phone-input

phone-input

Call the user on the phone for real-time voice conversations. Use this when you need input, want to report on completed work, or…

callme7mo2.7k
@zeframlou@zeframlouInstall Skill

Questions about dt-setup-openinference-migration.

Which coding agents can use dt-setup-openinference-migration?
dt-setup-openinference-migration installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.