Start the Phoenix collector locally

Arize Phoenix is a local-first trace viewer that speaks OpenTelemetry. You run it on your laptop or in a container, your app sends spans to it, and you click through a timeline UI that understands LLM-specific attributes. Free, open source, no account.

Where Phoenix sits in your stack

Your Python app emits OTel spans through the OpenInference instrumentation. Phoenix is the collector, the storage, and the UI all in one.

Terminal
bash
git clone https://github.com/learnwithparam/llm-observability-phoenix.git
cd llm-observability-phoenix

# Install everything, including phoenix and openinference
make setup

# Copy env template and set your keys
cp .env.example .env
# Edit .env with OPENAI_API_KEY and SERPER_API_KEY

Clone the repo, install dependencies, and wire your keys. Phoenix ships with the workshop so you do not install anything separately.

docker-compose.yml
yaml
services:
  phoenix:
    image: arizephoenix/phoenix:latest
    container_name: phoenix
    ports:
      - "6006:6006"   # UI and OTLP gRPC
      - "4317:4317"   # OTLP HTTP
    environment:
      - PHOENIX_WORKING_DIR=/mnt/phoenix
    volumes:
      - ./phoenix-data:/mnt/phoenix

Phoenix runs fine with uv alone, but a Compose service is the cleanest way to keep traces persistent across restarts.

Terminal
bash
# Option 1: start Phoenix via uv
uv run phoenix serve

# Option 2: docker compose
docker compose up -d phoenix

# Then open the UI
open http://localhost:6006

Either path exposes the UI on port 6006 and the OTel ingest on 4317. The course uses the uv path by default.

Validation checklist: Phoenix is online

Loading practice…