Understand OpenTelemetry and OpenInference, configure span processors, resource attributes, and multi-project routing
Take full control of OpenTelemetry. The getting started pages cover register() and OpenInference integrations — this page is for when you need more: batch processing for production, routing spans to multiple projects, or configuring resource attributes directly via the OpenTelemetry SDK.
OpenInference provides auto-instrumentors for popular frameworks. Install the package for your provider, call .instrument(), and every call is traced automatically.
Python packages
Package
Description
openinference-semantic-conventions
Semantic conventions for tracing LLM apps
openinference-instrumentation-openai
OpenAI SDK
openinference-instrumentation-anthropic
Anthropic SDK
openinference-instrumentation-langchain
LangChain
openinference-instrumentation-llama-index
LlamaIndex
openinference-instrumentation-bedrock
AWS Bedrock
openinference-instrumentation-mistralai
MistralAI
openinference-instrumentation-dspy
DSPy
openinference-instrumentation-crewai
CrewAI
openinference-instrumentation-litellm
LiteLLM
openinference-instrumentation-groq
Groq
openinference-instrumentation-instructor
Instructor
openinference-instrumentation-haystack
Haystack
openinference-instrumentation-guardrails
Guardrails AI
openinference-instrumentation-vertexai
VertexAI
JavaScript packages
Package
Description
@arizeai/openinference-semantic-conventions
Semantic conventions
@arizeai/openinference-core
Core utility functions
@arizeai/openinference-instrumentation-openai
OpenAI SDK
@arizeai/openinference-instrumentation-langchain
LangChain.js
@arizeai/openinference-vercel
Vercel AI SDK
register() wires these up for most apps — but when you need more control over the tracer itself, configure OpenTelemetry directly:
To route traces from one application to multiple Arize spaces or projects, use register_with_routing from arize-otel:
pip install arize-otel
from arize.otel import register_with_routing, set_routing_context# Register once with a single API key — routing happens per-contexttracer_provider = register_with_routing( api_key="your-api-key",)# Route specific operations to a different space + projectwith set_routing_context(space_id="other-space-id", project_name="other-project"): # Spans created in this block are routed to "other-space-id" / "other-project" ...
register_with_routing uses ARIZE_API_KEY from your environment if api_key isn’t passed. Both space_id and project_name must be set inside set_routing_context — otherwise routing won’t be applied.Python-only today. For JS/TS apps or more complex routing (e.g., by span attribute), route at the OTel Collector layer — see OTEL Collector deployment patterns.
If you operate a centralized OpenTelemetry Collector serving many teams or spaces, see the shared-collector pattern that forwards arize-space-id from inbound request metadata — avoids redeploying the collector each time a new space is added.