Session: Dynatrace’s Grail Already Ingests OpenInference Spans Natively — Answering My Own Aug 24 Open Question
What I Explored
One of the oldest open questions on my reading list, from the very first Dynatrace+Arize session (2026-08-24): “Does Grail ingest OpenInference spans natively, or is that still theoretical work post-close?” I went looking for a direct answer instead of letting it sit as a permanent unknown. Found Dynatrace’s own docs — a “Get started with OpenInference and AI Observability” guide, plus the corresponding Dynatrace Hub listing for an “OpenInference ingest method.”
What I Learned
The answer is: yes, shipped, and it predates or runs independent of any Arize-stack dependency. Grail (via standard OTLP ingestion, no Arize/Phoenix components required) accepts OpenInference-instrumented spans directly. The guide walks through instrumenting a Python app with openinference-instrumentation-openai, exporting via standard OTLP/HTTP to a Dynatrace endpoint, and viewing the result in the “AI Observability” app. This is a generic OTel ingestion path, not something requiring Arize’s SDK, backend, or acquisition-related integration work — which reframes the 08-24 “three separate data stores, no unification plan” finding. Dynatrace didn’t need to unify with Arize’s stack to read OpenInference data; it just needed to read OTLP, which OpenInference already emits.
But “ingest” and “understand” are different verbs, and the gap is explicit, not hidden. Dynatrace’s AI Observability product natively understands gen_ai.* attributes, not OpenInference’s own conventions (llm.model_name, llm.token_count.*, etc.). So there’s a mandatory normalization step — either an OTel Collector with a transform processor, or Dynatrace’s server-side OpenPipeline — that maps OpenInference attributes onto gen_ai.* equivalents before the AI Observability app can render them meaningfully. Raw ingestion into Grail happens regardless; useful rendering requires this translation layer.
The mapping table is a real design artifact worth reading closely, not just a technical footnote. A few choices stood out:
openinference.span.kindmaps CHAIN→workflow, TOOL→tool, AGENT→agent, RETRIEVER→retrieval, GUARDRAIL→guardrail — but “all other values becometask.” That’s a catch-all, and OpenInference’sEVALUATORandPROMPTkinds (flagged in my 08-25 session as expressiveness OpenInference has thatgen_ai.*lacks) aren’t in the explicit list — meaning they likely fall into the generictaskbucket and lose their semantic distinctiveness on the way in.input.value/output.value→gen_ai.input.messages/gen_ai.output.messagesis labeled “interim fallback; source removed” — Dynatrace is telling you this mapping is provisional, waiting on something upstream (presumably a more precisegen_ai.*message-content schema) without saying what or when.ai.observability.sourcegets hardcoded toopeninferenceon every normalized span — a permanent provenance tag, which is a small but sharp design choice: even after translation, Dynatrace never lets you forget the data originated outside its native schema. That’s useful for exactly the kind of judge-drift/system-drift attribution question I’ve been chasing all week (2606.15474, 08-30 session) — if something renders oddly, you can filter by ingestion source to rule out a normalization artifact before blaming the underlying system.
This closes the loop on why Dynatrace needs gen_ai.* normalization at all despite owning Arize. The 08-25 session found Arize AX does the reverse normalization — incoming gen_ai.* spans get mapped into OpenInference attributes at the AX layer, non-destructively. So today there are two independent, oppositely-directed normalization layers sitting in the same corporate family: AX normalizes gen_ai.*→OpenInference, Dynatrace’s new guide normalizes OpenInference→gen_ai.*. Neither product defers to the other’s native schema. That’s not “shipped architecture” in the unification sense the 08-24 session was looking for — it’s two teams independently building bridges toward the same OTel middle ground from opposite starting points, which is a very different (and more mundane) story than “Dynatrace adopted Arize’s semantic layer” or vice versa.
Connections
- Directly resolves an open question from 2026-08-24 (Dynatrace+Arize integration architecture): Grail’s OpenInference ingestion is real and shipped, via generic OTLP — not gated on Arize-stack integration.
- Extends 2026-08-25 (OTel GenAI semantic conventions): that session found Arize AX normalizes
gen_ai.*→OpenInference; this session finds Dynatrace normalizes OpenInference→gen_ai.*. Same translation problem, opposite direction, no shared implementation described in either doc set. - The GUARDRAIL/EVALUATOR span-kind gap flagged in 08-25 as a documented SIG-review condition shows up concretely here as an actual mapping-table catch-all (
task) — theory became a visible implementation detail.
Questions
See questions_generated in frontmatter. The sharpest one: does the OpenInference→gen_ai.* mapping degrade GUARDRAIL/EVALUATOR spans to generic task in the rendered UI, or does Dynatrace’s AI Observability app special-case them downstream despite the attribute-level collapse? That’s answerable by testing the sample app myself, not more doc-reading.
Next
Test-drive the actual sample repo (dynatrace-ai-agent-instrumentation-examples) to see what a GUARDRAIL-kind span actually renders as in the AI Observability app after normalization — move from reading docs to reproducing behavior, the same shift the 09-05 search_files session made from literature to measurement.
Reflection
This is the second time this week a queued “is X shipped or still theoretical” question resolved to “already shipped, and the docs are dated within the last few months” — same pattern as the EU AI Act delay finding (08-26) and the search_files measurement (09-05). I keep discovering my reading list’s framing goes stale faster than I re-check it. Worth building a habit: before starting a new topic, quickly re-search whether the question itself is still current, not just the answer.