name: warden services: loki: image: grafana/loki:3.5.3 ports: - "3100:3100" command: -config.file=/etc/loki/local-config.yaml networks: - warden promtail: image: grafana/promtail:3.5.3 volumes: - /var/log:/var/log command: -config.file=/etc/promtail/config.yml networks: - warden grafana: image: grafana/grafana:12.1.0 environment: - GF_PATHS_PROVISIONING=/etc/grafana/provisioning - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - GF_FEATURE_TOGGLES_ENABLE=alertingSimplifiedRouting,alertingQueryAndExpressionsStepMode,traceqlEditor volumes: - ./config/grafana-ds.yaml:/etc/grafana/provisioning/datasources/datasources.yaml ports: - "3000:3000" networks: - warden # Tempo runs as user 10001, and docker compose creates the volume as root. # As such, we need to chown the volume in order for Tempo to start correctly. init: image: &tempoImage grafana/tempo:2.8.2 user: root entrypoint: - "chown" - "10001:10001" - "/var/tempo" volumes: - ./tempo-data:/var/tempo tempo: image: *tempoImage command: [ "-config.file=/etc/tempo.yaml" ] volumes: - ./config/tempo.yaml:/etc/tempo.yaml - ./tempo-data:/var/tempo ports: - "3200:3200" - "4317:4317" depends_on: - init networks: - warden # And put them in an OTEL collector pipeline... otel-collector: image: otel/opentelemetry-collector:0.131.1 command: [ "--config=/etc/otel-collector.yaml" ] volumes: - ./config/otel-collector.yaml:/etc/otel-collector.yaml networks: - warden networks: warden: