services: # Infrastructure elasticsearch: image: elasticsearch:9.4.2 container_name: otel-elasticsearch deploy: resources: limits: memory: 3g environment: http.host: 0.0.0.0 transport.host: 127.0.0.1 xpack.security.enabled: false healthcheck: test: [ "CMD-SHELL", "curl -fs http://localhost:9200/_cluster/health || exit 1" ] interval: 5s timeout: 5s retries: 30 ports: - "9200:9200" grafana: image: grafana/grafana:latest container_name: otel-grafana depends_on: - loki - prometheus - tempo environment: - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - GF_AUTH_DISABLE_LOGIN_FORM=true ports: - "3000:3000" volumes: - ./grafana-datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml kibana: image: kibana:9.4.2 container_name: otel-kibana depends_on: - elasticsearch environment: ELASTICSEARCH_URL: http://elasticsearch:9200 ELASTICSEARCH_HOSTS: '["http://elasticsearch:9200"]' ports: - "5601:5601" loki: image: grafana/loki:latest container_name: otel-loki ports: - "3100:3100" mongo: image: mongo container_name: otel-mongo healthcheck: test: [ "CMD", "mongosh", "--quiet", "--eval", "db.adminCommand('ping').ok" ] interval: 5s timeout: 5s retries: 12 ports: - 27017:27017 otel-collector: image: otel/opentelemetry-collector:latest container_name: otel-collector command: [ "--config=/etc/otel-collector-config.yaml" ] depends_on: - loki - prometheus - tempo ports: - "4317:4317" # OTLP gRPC receiver - "8888:8888" # Prometheus metrics exposed by the collector - "8889:8889" # Prometheus exporter metrics volumes: - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml postgres: image: postgres container_name: otel-postgres environment: POSTGRES_PASSWORD: example healthcheck: test: [ "CMD-SHELL", "pg_isready -U postgres" ] interval: 5s timeout: 5s retries: 12 ports: - "5432:5432" prometheus: image: prom/prometheus:latest container_name: otel-prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--web.enable-remote-write-receiver" ports: - "9090:9090" volumes: - ./prometheus.yaml:/etc/prometheus/prometheus.yml rabbitmq: image: rabbitmq:management container_name: otel-rabbitmq healthcheck: test: [ "CMD", "rabbitmq-diagnostics", "-q", "ping" ] interval: 5s timeout: 10s retries: 12 ports: - "5672:5672" - "15672:15672" redis: image: redis container_name: otel-redis healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 5s timeout: 5s retries: 12 ports: - "6379:6379" tempo: image: grafana/tempo:latest container_name: otel-tempo command: [ "-config.file=/etc/tempo.yaml" ] ports: - "3200:3200" volumes: - ./tempo.yaml:/etc/tempo.yaml - tempo-data:/var/tempo # Application alpha: build: context: . dockerfile: ./Alpha/Dockerfile container_name: otel-alpha depends_on: epsilon: condition: service_started loki: condition: service_started mu: condition: service_started otel-collector: condition: service_started rabbitmq: condition: service_healthy image: otel-alpha environment: ASPNETCORE_ENVIRONMENT: Docker ASPNETCORE_URLS: http://*:80 OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc ports: - "5201:80" epsilon: build: context: . dockerfile: ./Epsilon/Dockerfile container_name: otel-epsilon depends_on: elasticsearch: condition: service_healthy loki: condition: service_started otel-collector: condition: service_started image: otel-epsilon environment: ASPNETCORE_ENVIRONMENT: Docker ASPNETCORE_URLS: http://*:80 OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc ports: - "5204:80" mu: build: context: . dockerfile: ./Mu/Dockerfile container_name: otel-mu depends_on: loki: condition: service_started otel-collector: condition: service_started rabbitmq: condition: service_healthy image: otel-mu environment: ASPNETCORE_ENVIRONMENT: Docker ASPNETCORE_URLS: http://*:80 OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc ports: - "5203:80" nu: build: context: . dockerfile: ./Nu/Dockerfile container_name: otel-nu depends_on: loki: condition: service_started mongo: condition: service_healthy otel-collector: condition: service_started image: otel-nu environment: ASPNETCORE_ENVIRONMENT: Docker ASPNETCORE_URLS: http://*:80 OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc ports: - "5205:80" omicron: build: context: . dockerfile: ./Omicron/Dockerfile container_name: otel-omicron # depends_on image: otel-omicron environment: ASPNETCORE_ENVIRONMENT: Docker ASPNETCORE_URLS: http://*:80 OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc ports: - "5200:80" sigma: build: context: . dockerfile: ./Sigma/Dockerfile container_name: otel-sigma depends_on: loki: condition: service_started otel-collector: condition: service_started postgres: condition: service_healthy redis: condition: service_healthy image: otel-sigma environment: ASPNETCORE_ENVIRONMENT: Docker ASPNETCORE_URLS: http://*:80 OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc ports: - "5202:80" volumes: tempo-data: