Skip to main content
The CrewAI integration is OpenTelemetry end to end — but it takes two halves, and CrewAI itself provides neither:
  1. 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.
  2. Receivingdecimalai.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

There are no 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. Without openinference-instrumentation-crewai it captures nothing (an exporter with no spans to export) and says so at WARNING. Without a provider instrumentor it captures the crew shape — the kickoff span and each task’s span — with no LLM call, no model and no token counts, and says so at INFO.
  • LiteLLM is an optional CrewAI extra now, and init() does not reach it. Older CrewAI routed every model string through LiteLLM, where LiteLLMInstrumentor emitted the LLM spans. On the version we measured (1.15.16) litellm ships only with pip install "crewai[litellm]", and llm="openai/…" uses CrewAI’s own OpenAI provider, which calls the openai SDK directly — which is why openinference-instrumentation-openai is the package in the install line. If your setup does route through LiteLLM, init(crewai=True) will not pick it up: it auto-activates the openai, anthropic and google-genai instrumentors and no others. Install openinference-instrumentation-litellm and call LiteLLMInstrumentor().instrument() yourself — it binds to the tracer provider init() 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= to init() 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.