Organize and isolate traces using projects in Phoenix
Projects provide a way to organize and isolate traces in Phoenix. Each project maintains separate traces, evaluations, and datasets, making it easy to manage multiple applications or environments.
# Separate projects per applicationregister(project_name="customer-chatbot")register(project_name="document-qa")register(project_name="code-assistant")
import os# Separate projects per environmentenv = os.getenv("ENVIRONMENT", "development")register(project_name=f"my-app-{env}")# Results in:# - my-app-development# - my-app-staging# - my-app-production
# Separate projects for experimentsregister(project_name="rag-baseline")register(project_name="rag-with-reranking")register(project_name="rag-hybrid-search")
The using_project context manager is deprecated and will be removed in a future release. It has been moved to openinference-instrumentation as dangerously_using_project.
from phoenix.trace import using_project# Default projecttracer_provider = register(project_name="default-project")# Temporarily switch to different projectwith using_project("experiment-project"): # Traces created here go to "experiment-project" result = run_experiment()# Back to "default-project"
This approach modifies span resources dynamically and should not be used in production or complex OpenTelemetry setups.
import phoenix as px# Connect to Phoenixclient = px.Client(endpoint="http://localhost:6006")# List all projectsprojects = client.list_projects()for project in projects: print(f"Project: {project.name}") print(f" Traces: {project.trace_count}") print(f" Created: {project.created_at}")
import phoenix as pxclient = px.Client()# Get spans for specific projectspans = client.get_spans( project_name="my-application", limit=100)# Get evaluations for specific project evaluations = client.get_evaluations( project_name="my-application")
from phoenix.otel import TracerProvider, BatchSpanProcessorfrom opentelemetry.sdk.resources import Resourcefrom phoenix.otel import PROJECT_NAMEimport random# Create providers for each variantvariant_a_provider = TracerProvider( resource=Resource({PROJECT_NAME: "experiment-variant-a"}), verbose=False)variant_a_provider.add_span_processor( BatchSpanProcessor(endpoint="http://localhost:6006/v1/traces"))variant_b_provider = TracerProvider( resource=Resource({PROJECT_NAME: "experiment-variant-b"}), verbose=False)variant_b_provider.add_span_processor( BatchSpanProcessor(endpoint="http://localhost:6006/v1/traces"))def get_tracer(user_id: str): """Route users to different variants.""" if hash(user_id) % 2 == 0: return variant_a_provider.get_tracer("variant-a") else: return variant_b_provider.get_tracer("variant-b")# Use in applicationtracer = get_tracer("user-123")with tracer.start_as_current_span("process-request"): # Traces go to appropriate project based on variant result = process_request()