- Emitting — CrewAI does not emit OTel spans through your application’s tracer provider. (Its built-in telemetry runs on a private, internal provider that reports product usage to CrewAI’s own servers — deliberately never installed globally, so nothing from it ever reaches your exporter.) Span emission comes from the OpenInference instrumentors.
- Receiving —
decimalai.init(crewai=True)wires DecimalAI’s OTel exporter as the global tracer provider and activates those instrumentors against it, which turns their spans into DecimalAI traces.
Install
openinference-instrumentation-openai has no line in the snippet below and is still required for model names and token counts. CrewAI’s own instrumentor emits the crew, task and tool spans but no LLM span at all — the model detail comes from whichever provider SDK CrewAI actually called. decimalai.init(crewai=True) activates the provider instrumentor for you, for every provider SDK it can import (openai, anthropic, google-genai), so this is a package to have installed rather than a line to write. Swap in openinference-instrumentation-anthropic or -google-genai if your agents use anthropic/… or gemini/… models.
Use
instrument() lines to write: init(crewai=True) installs DecimalAI’s exporter as the global tracer provider and then activates CrewAIInstrumentor and the provider instrumentors against it. Order matters only in that decimalai.init() should run before the crew does.
What gets captured
- Each task in the crew as a span (
CrewAIInstrumentor) - Agent-to-agent conversations and tool calls with inputs and outputs (
CrewAIInstrumentor) - LLM generations underneath each agent’s reasoning step, with the model name, token counts and the messages themselves — from the provider instrumentor, not from
CrewAIInstrumentor, which emits no LLM span
Caveats
- Both halves are required, and it is the packages that decide whether you have both.
init(crewai=True)turns the emitters on for you, but only the ones that are installed, and a missing one is a log line rather than an error — so an install line short a package produces a quiet, partial trace rather than a failure. Withoutopeninference-instrumentation-crewaiit captures nothing (an exporter with no spans to export) and says so atWARNING. Without a provider instrumentor it captures the crew shape — thekickoffspan and each task’s span — with no LLM call, no model and no token counts, and says so atINFO. - LiteLLM is an optional CrewAI extra now, and
init()does not reach it. Older CrewAI routed every model string through LiteLLM, whereLiteLLMInstrumentoremitted the LLM spans. On the version we measured (1.15.16)litellmships only withpip install "crewai[litellm]", andllm="openai/…"uses CrewAI’s own OpenAI provider, which calls theopenaiSDK directly — which is whyopeninference-instrumentation-openaiis the package in the install line. If your setup does route through LiteLLM,init(crewai=True)will not pick it up: it auto-activates theopenai,anthropicandgoogle-genaiinstrumentors and no others. Installopeninference-instrumentation-litellmand callLiteLLMInstrumentor().instrument()yourself — it binds to the tracer providerinit()already set, and the LLM spans land. - Manifest detection captures tool names only — schemas aren’t always exposed through CrewAI’s API. Use
register_manifest()for schema-aware tracking. - Multi-crew setups: each crew is its own DecimalAI “agent” by default. Pass
agent_name=toinit()if you want them unified.
What’s next
Multi-agent guide
Modeling crew-of-crews patterns.
Manifests
Register a manifest explicitly to capture tool schemas.