Coroot
Observability and APM tool that combines metrics, logs, traces and profiles.
- Replaces
-
Paid observability services, such as Datadog.
All open-source alternatives to Datadog
- Difficulty
-
Difficulty: Hard
5 services (1 database or broker: clickhouse-server), 9 volume mounts, no env values to set, host access: host_pid, privileged. Heuristic score 7 of 11: hard.
- Stack
Go (language), ClickHouse (database)
- Deployment
docker_compose
- Requirements
Not stated.
- License
-
Apache-2.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/coroot/coroot/blob/15137ef/README.md, read on .
- Repository
GitHub stats
- Stars
- 7,980
- Forks
- 409
- Open issues and pull requests
- 126
- Last push
- 2026-10-21
- Latest release
- v1.28.1
- Released
- 2026-10-21
From the GitHub API on . These numbers are a snapshot, not live. GitHub detected the license as Apache-2.0.
Compose file
name: coroot
services:
coroot:
restart: always
image: ghcr.io/coroot/coroot${LICENSE_KEY:+-ee} # set 'coroot-ee' as the image if LICENSE_KEY is defined
pull_policy: always
user: root
volumes:
- coroot_data:/data
ports:
- 8080:8080
command:
- '--data-dir=/data'
- '--bootstrap-prometheus-url=http://prometheus:9090'
- '--bootstrap-refresh-interval=15s'
- '--bootstrap-clickhouse-address=clickhouse:9000'
environment:
- LICENSE_KEY=${LICENSE_KEY:-}
depends_on:
clickhouse:
condition: service_healthy
prometheus:
condition: service_healthy
node-agent:
restart: always
image: ghcr.io/coroot/coroot-node-agent
pull_policy: always
privileged: true
pid: "host"
volumes:
- /sys/kernel/tracing:/sys/kernel/tracing
- /sys/kernel/debug:/sys/kernel/debug
- /sys/fs/cgroup:/host/sys/fs/cgroup
- node_agent_data:/data
command:
- '--collector-endpoint=http://coroot:8080'
- '--cgroupfs-root=/host/sys/fs/cgroup'
- '--wal-dir=/data'
cluster-agent:
restart: always
image: ghcr.io/coroot/coroot-cluster-agent
pull_policy: always
volumes:
- cluster_agent_data:/data
command:
- '--coroot-url=http://coroot:8080'
- '--metrics-scrape-interval=15s'
- '--metrics-wal-dir=/data'
depends_on:
- coroot
prometheus:
restart: always
image: prom/prometheus:v2.53.5
volumes:
- 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'
- '--web.enable-lifecycle'
- '--web.enable-remote-write-receiver'
ports:
- '127.0.0.1:9090:9090'
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9090/-/healthy"]
interval: 3s
timeout: 5s
retries: 5
start_period: 10s
clickhouse:
restart: always
image: clickhouse/clickhouse-server:24.3
environment:
CLICKHOUSE_SKIP_USER_SETUP: "1"
volumes:
- clickhouse_data:/var/lib/clickhouse
- clickhouse_logs:/var/log/clickhouse-server
ports:
- '127.0.0.1:9000:9000'
ulimits:
nofile:
soft: 262144
hard: 262144
configs:
- source: clickhouse_logging
target: /etc/clickhouse-server/config.d/logging_rules.xml
- source: clickhouse_user_logging
target: /etc/clickhouse-server/config.d/user_logging.xml
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8123/ping"]
interval: 3s
timeout: 5s
retries: 5
start_period: 10s
volumes:
prometheus_data: {}
clickhouse_data: {}
clickhouse_logs: {}
coroot_data: {}
node_agent_data: {}
cluster_agent_data: {}
configs:
clickhouse_logging:
content: |
<clickhouse>
<logger>
<level>warning</level>
<console>true</console>
</logger>
<query_thread_log remove="remove"/>
<query_log remove="remove"/>
<text_log remove="remove"/>
<trace_log remove="remove"/>
<metric_log remove="remove"/>
<asynchronous_metric_log remove="remove"/>
<session_log remove="remove"/>
<part_log remove="remove"/>
<latency_log remove="remove"/>
<processors_profile_log remove="remove"/>
</clickhouse>
clickhouse_user_logging:
content: |
<clickhouse>
<profiles>
<default>
<log_queries>0</log_queries>
<log_query_threads>0</log_query_threads>
<log_processors_profiles>0</log_processors_profiles>
</default>
</profiles>
</clickhouse>
From the app's own repository: github.com/coroot/coroot/blob/15137ef/deploy/docker-compose.yaml.
Compose file from the app repository.
Install
- Docker with the Compose plugin (github.com/coroot/coroot/blob/15137ef/deploy/docker-compose.yaml)
A host with Docker and the Docker Compose plugin. This entry runs from a compose file.
- Save the compose file as docker-compose.yaml (github.com/coroot/coroot/blob/15137ef/deploy/docker-compose.yaml)
Use the compose file shown above.
- Start it (github.com/coroot/coroot/blob/15137ef/deploy/docker-compose.yaml)
docker compose up -d - Open the app (github.com/coroot/coroot/blob/15137ef/deploy/docker-compose.yaml)
Open http://localhost:8080. The compose file publishes host port 8080 for the coroot service.
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: node-agent: ghcr.io/coroot/coroot-node-agent (no tag), cluster-agent: ghcr.io/coroot/coroot-cluster-agent (no tag). A later pull can get a different version. (github.com/coroot/coroot/blob/15137ef/deploy/docker-compose.yaml, checked 2026-10-22)
- The compose file publishes host ports. Host ports: 8080 (coroot), 127.0.0.1:9090 (prometheus), 127.0.0.1:9000 (clickhouse). A port without a host address listens on all host network interfaces. (github.com/coroot/coroot/blob/15137ef/deploy/docker-compose.yaml, checked 2026-10-22)
- The compose file mounts host folders. Host paths mounted into containers: /sys/kernel/tracing at /sys/kernel/tracing (node-agent), /sys/kernel/debug at /sys/kernel/debug (node-agent), /sys/fs/cgroup at /host/sys/fs/cgroup (node-agent). (github.com/coroot/coroot/blob/15137ef/deploy/docker-compose.yaml, checked 2026-10-22)
- Some services get elevated host access. node-agent runs privileged, node-agent shares the host process list. (github.com/coroot/coroot/blob/15137ef/deploy/docker-compose.yaml, checked 2026-10-22)
Signals
- Open issues and pull requests: 126
- Last push: 2026-10-21 (0 days before this page was built)
- Latest release: v1.28.1 on 2026-10-21 (0 days before this page was built)