Uptrace
Observability backend for traces, metrics and logs that accepts OpenTelemetry data.
- Replaces
-
Paid application monitoring services, such as Datadog.
All open-source alternatives to Datadog
- Difficulty
-
Difficulty: Hard
10 services (3 database or broker: clickhouse-server, postgres, redis), 13 volume mounts, no env values to set, host access: host_network, host_pid. Heuristic score 9 of 11: hard. A source checkout is needed, so the rating is at least medium.
- Stack
Go (language), ClickHouse (database), PostgreSQL (database), Redis (database)
- Deployment
docker_compose
- Requirements
Not stated.
- License
-
AGPL-3.0(OSI-approved open source) - Business model
-
Unknown
The README at the pinned commit does not state a business model, so it stays unknown.
Source: github.com/uptrace/uptrace/blob/1e622ff/README.md, read on .
- Repository
GitHub stats
- Stars
- 4,306
- Forks
- 223
- Open issues and pull requests
- 53
- Last push
- 2026-10-22
- Latest release
- v2.1.0-rc.2
- Released
- 2026-10-22
From the GitHub API on . These numbers are a snapshot, not live. GitHub detected the license as AGPL-3.0.
Compose file
services:
clickhouse:
image: clickhouse/clickhouse-server:26.3
restart: on-failure
environment:
CLICKHOUSE_USER: uptrace
CLICKHOUSE_PASSWORD: uptrace
CLICKHOUSE_DB: uptrace
healthcheck:
test: ['CMD', 'wget', '--spider', '-q', 'localhost:8123/ping']
interval: 1s
timeout: 1s
retries: 30
start_period: 120s
volumes:
- ch_data:/var/lib/clickhouse
ports:
- '8123:8123'
- '9000:9000'
postgres:
image: postgres:17-alpine
restart: on-failure
environment:
PGDATA: /var/lib/postgresql/data/pgdata
POSTGRES_USER: uptrace
POSTGRES_PASSWORD: uptrace
POSTGRES_DB: uptrace
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U uptrace -d uptrace']
interval: 1s
timeout: 1s
retries: 30
volumes:
- 'pg_data3:/var/lib/postgresql/data/pgdata'
ports:
- '5432:5432'
redis:
image: redis:6.2.2-alpine
restart: on-failure
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 1s
timeout: 1s
retries: 30
uptrace:
image: 'uptrace/uptrace:2.1.0-rc.1'
restart: on-failure
volumes:
- ./uptrace.yml:/etc/uptrace/config.yml
- ./certs/server.crt:/etc/uptrace/server.crt
- ./certs/server.key:/etc/uptrace/server.key
#environment:
# - DEBUG=2
ports:
- '14317:4317'
- '14318:80'
depends_on:
clickhouse:
condition: service_healthy
postgres:
condition: service_healthy
redis:
condition: service_healthy
otelcol:
image: otel/opentelemetry-collector-contrib:0.123.0
restart: on-failure
volumes:
- ./otel-collector.yaml:/etc/otelcol-contrib/config.yaml
ports:
- '4317:4317'
- '4318:4318'
extra_hosts:
- 'host.docker.internal:host-gateway'
depends_on:
- uptrace
mailpit:
image: axllent/mailpit
restart: always
ports:
- 1025:1025
- 8025:8025
environment:
MP_MAX_MESSAGES: 5000
MP_DATA_FILE: /data/mailpit.db
MP_SMTP_AUTH_ACCEPT_ANY: 1
MP_SMTP_AUTH_ALLOW_INSECURE: 1
volumes:
- mailpit_data:/data
vector:
image: timberio/vector:0.28.X-alpine
volumes:
- ./vector.toml:/etc/vector/vector.toml:ro
grafana:
image: grafana/grafana:12.0.0
restart: on-failure
volumes:
- ./grafana/datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml
- ./grafana/custom.ini:/etc/grafana/grafana.ini
ports:
- '3000:3000'
extra_hosts:
- 'host.docker.internal:host-gateway'
prometheus:
image: prom/prometheus:v2.36.2
restart: always
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
extra_hosts:
- 'host.docker.internal:host-gateway'
node_exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
command:
- '--path.rootfs=/host'
network_mode: host
pid: host
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
volumes:
ch_data:
pg_data3:
prometheus_data:
mailpit_data:
From the app's own repository: github.com/uptrace/uptrace/blob/1e622ff/example/docker/docker-compose.yml.
Compose file from uptrace/uptrace, used inside a checkout of that repository (documented setup B).
Install
- Docker with the Compose plugin and git (github.com/uptrace/uptrace/blob/1e622ff/example/docker/README.md)
A host with Docker, the Docker Compose plugin and git. This entry needs a checkout of the project repository.
- Get the source at commit 1e622ff (github.com/uptrace/uptrace/blob/1e622ff/example/docker/README.md)
git init uptrace cd uptrace git remote add origin https://github.com/uptrace/uptrace.git git sparse-checkout init --cone git sparse-checkout set example/docker git fetch --depth 1 --filter=blob:none origin 1e622fff165391a26bbebc135e4c4f8a843ef1bd git checkout FETCH_HEAD - Go to the folder the docs use (github.com/uptrace/uptrace/blob/1e622ff/example/docker/README.md)
cd example/docker - The compose file in the checkout: example/docker/docker-compose.yml (shown here for reading) (github.com/uptrace/uptrace/blob/1e622ff/example/docker/docker-compose.yml)
Use the compose file shown above.
- What the compose file check ran with (github.com/uptrace/uptrace/blob/1e622ff/example/docker/README.md)
The compose file check ran in a checkout of uptrace/uptrace at 1e622fff165391a26bbebc135e4c4f8a843ef1bd (a sparse checkout: the top-level files and the folder example/docker), in the folder example/docker. The Docker demo guide tells the reader to clone the repository, go into example/docker and run docker compose pull and docker compose up -d.
- Start it (github.com/uptrace/uptrace/blob/1e622ff/example/docker/README.md)
docker compose up -d - Open the app (github.com/uptrace/uptrace/blob/1e622ff/example/docker/docker-compose.yml)
Open http://localhost:14318. The compose file publishes host port 14318 for the uptrace service. The demo guide says to open the Uptrace UI at this address.
Compose file check: config_ok on 2026-10-22.
Gotchas and maintenance
Gotchas
- Some images use the latest tag or no tag. Images without a pinned version: mailpit: axllent/mailpit (no tag), node_exporter: quay.io/prometheus/node-exporter:latest. A later pull can get a different version. (github.com/uptrace/uptrace/blob/1e622ff/example/docker/docker-compose.yml, checked 2026-10-22)
- The compose file publishes host ports. Host ports: 8123 (clickhouse), 9000 (clickhouse), 5432 (postgres), 14317 (uptrace), 14318 (uptrace), 4317 (otelcol), 4318 (otelcol), 1025 (mailpit) and 2 more. A port without a host address listens on all host network interfaces. (github.com/uptrace/uptrace/blob/1e622ff/example/docker/docker-compose.yml, checked 2026-10-22)
- The compose file mounts host folders. Host paths mounted into containers: ./uptrace.yml at /etc/uptrace/config.yml (uptrace), ./certs/server.crt at /etc/uptrace/server.crt (uptrace), ./certs/server.key at /etc/uptrace/server.key (uptrace), ./otel-collector.yaml at /etc/otelcol-contrib/config.yaml (otelcol), ./vector.toml at /etc/vector/vector.toml (vector), ./grafana/datasource.yml at /etc/grafana/provisioning/datasources/datasource.yml (grafana), ./grafana/custom.ini at /etc/grafana/grafana.ini (grafana), ./prometheus.yml at /etc/prometheus/prometheus.yml (prometheus) and 1 more. (github.com/uptrace/uptrace/blob/1e622ff/example/docker/docker-compose.yml, checked 2026-10-22)
- Some services get elevated host access. node_exporter uses the host network, node_exporter shares the host process list. (github.com/uptrace/uptrace/blob/1e622ff/example/docker/docker-compose.yml, checked 2026-10-22)
Signals
- Open issues and pull requests: 53
- Last push: 2026-10-22 (0 days before this page was built)
- Latest release: v2.1.0-rc.2 on 2026-10-22 (0 days before this page was built)