NativeLink is a Nix-powered, open source, high-performance build cache and remote execution server, compatible with Bazel, Soong, Pants, Buck2, Reclient,...
docker pull otel/opentelemetry-collector-contrib
docker run -d --name nativelink -p 4317:4317 --restart always otel/opentelemetry-collector-contrib:0.98.0
podman run -d --name nativelink -p 4317:4317 --restart always otel/opentelemetry-collector-contrib:0.98.0
skopeo inspect docker://docker.io/otel/opentelemetry-collector-contrib:0.98.0
oras pull otel/opentelemetry-collector-contrib:0.98.0
docker compose up -d
version: '3.8'
services:
# OpenTelemetry Collector
otel-collector:
image: otel/opentelemetry-collector-contrib:0.98.0
container_name: otel-collector
restart: unless-stopped
command: ["--config=/etc/otel-collector/config.yaml"]
volumes:
- ./otel-collector-config.yaml:/etc/otel-collector/config.yaml:ro
ports:
- "4317:4317" # OTLP gRPC receiver
- "4318:4318" # OTLP HTTP receiver
- "9090:9090" # Prometheus metrics exporter
- "8888:8888" # Collector metrics
- "13133:13133" # Health check
environment:
- OTLP_BACKEND_ENDPOINT=${OTLP_BACKEND_ENDPOINT:-otlp-backend:4317}
- OTLP_BACKEND_TOKEN=${OTLP_BACKEND_TOKEN:-}
networks:
- metrics
# Prometheus with OTLP support
prometheus:
image: prom/prometheus:v3.0.0
container_name: prometheus
restart: unless-stopped
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--web.enable-lifecycle'
- '--web.enable-otlp-receiver' # Enable OTLP receiver
- '--storage.tsdb.retention.time=30d'
volumes:
- ./prometheus-config.yaml:/etc/prometheus/prometheus.yml:ro
- ./prometheus-recording-rules.yml:/etc/prometheus/rules/nativelink.yml:ro
- prometheus_data:/prometheus
ports:
- "9091:9090" # Prometheus web UI (different port to avoid conflict with collector)
networks:
- metrics
depends_on:
- otel-collector
# Grafana for visualization
grafana:
image: grafana/grafana:12.4.0
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_INSTALL_PLUGINS=grafana-piechart-panel
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning:ro
- ./grafana/dashboards:/var/lib/grafana/dashboards:ro
networks:
- metrics
depends_on:
- prometheus
# Optional: AlertManager for alerts
alertmanager:
image: prom/alertmanager:v0.27.0
container_name: alertmanager
restart: unless-stopped
volumes:
- ./alertmanager-config.yml:/etc/alertmanager/config.yml:ro
- alertmanager_data:/alertmanager
ports:
- "9093:9093"
command:
- '--config.file=/etc/alertmanager/config.yml'
- '--storage.path=/alertmanager'
networks:
- metrics
# Optional: Node exporter for host metrics
node-exporter:
image: prom/node-exporter:v1.7.0
container_name: node-exporter
restart: unless-stopped
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
ports:
- "9100:9100"
networks:
- metrics
# Optional: Jaeger for trace visualization (if traces are enabled)
jaeger:
image: jaegertracing/all-in-one:1.53
container_name: jaeger
restart: unless-stopped
environment:
- COLLECTOR_OTLP_ENABLED=true
ports:
- "16686:16686" # Jaeger UI
- "14268:14268" # Jaeger collector HTTP
networks:
- metrics
volumes:
prometheus_data:
grafana_data:
alertmanager_data:
networks:
metrics:
driver: bridge
# Usage Instructions:
# 1. Start the stack: docker-compose up -d
# 2. Configure NativeLink with these environment variables:
# export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
# export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
# export OTEL_SERVICE_NAME=nativelink
# export OTEL_RESOURCE_ATTRIBUTES="deployment.environment=dev"
# 3. Access services:
# - Prometheus: http://localhost:9091
# - Grafana: http://localhost:3000 (admin/admin)
# - Jaeger: http://localhost:16686
# - AlertManager: http://localhost:9093
# - OTEL Collector metrics: http://localhost:8888/metrics