diff --git a/docker-compose.lite.yml b/docker-compose.lite.yml new file mode 100644 index 0000000000..9cc9db0660 --- /dev/null +++ b/docker-compose.lite.yml @@ -0,0 +1,510 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +x-default-logging: &logging + driver: "json-file" + options: + max-size: "5m" + max-file: "2" + tag: "{{.Name}}" + +networks: + default: + name: opentelemetry-demo-lite + driver: bridge + +services: + # ****************** + # Core Demo Services + # ****************** + # Accounting service + accounting: + image: ${IMAGE_NAME}:${DEMO_VERSION}-accounting + container_name: accounting + build: + context: ./ + dockerfile: ${ACCOUNTING_DOCKERFILE} + cache_from: + - ${IMAGE_NAME}:${IMAGE_VERSION}-accounting + deploy: + resources: + limits: + memory: 120M + restart: unless-stopped + environment: + - KAFKA_ADDR + - OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} + - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + - OTEL_RESOURCE_ATTRIBUTES + - OTEL_SERVICE_NAME=accounting + - DB_CONNECTION_STRING=Host=${POSTGRES_HOST};Username=otelu;Password=otelp;Database=${POSTGRES_DB} + - OTEL_DOTNET_AUTO_TRACES_ENTITYFRAMEWORKCORE_INSTRUMENTATION_ENABLED=false + depends_on: + otel-collector: + condition: service_started + kafka: + condition: service_healthy + logging: *logging + + # Cart service + cart: + image: ${IMAGE_NAME}:${DEMO_VERSION}-cart + container_name: cart + build: + context: ./ + dockerfile: ${CART_DOCKERFILE} + cache_from: + - ${IMAGE_NAME}:${IMAGE_VERSION}-cart + deploy: + resources: + limits: + memory: 160M + restart: unless-stopped + ports: + - "${CART_PORT}" + environment: + - CART_PORT + - FLAGD_HOST + - FLAGD_PORT + - VALKEY_ADDR + - OTEL_EXPORTER_OTLP_ENDPOINT + - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + - OTEL_RESOURCE_ATTRIBUTES + - OTEL_SERVICE_NAME=cart + - ASPNETCORE_URLS=http://*:${CART_PORT} + depends_on: + valkey-cart: + condition: service_started + otel-collector: + condition: service_started + flagd: + condition: service_started + logging: *logging + + # Frontend + frontend: + image: ${IMAGE_NAME}:${DEMO_VERSION}-frontend + container_name: frontend + build: + context: ./ + dockerfile: ${FRONTEND_DOCKERFILE} + cache_from: + - ${IMAGE_NAME}:${IMAGE_VERSION}-frontend + deploy: + resources: + limits: + memory: 250M + restart: unless-stopped + ports: + - "${FRONTEND_PORT}" + environment: + - PORT=${FRONTEND_PORT} + - FRONTEND_ADDR + - AD_ADDR + - CART_ADDR + - CHECKOUT_ADDR + - CURRENCY_ADDR + - PRODUCT_CATALOG_ADDR + - RECOMMENDATION_ADDR + - SHIPPING_ADDR + - OTEL_EXPORTER_OTLP_ENDPOINT + - OTEL_RESOURCE_ATTRIBUTES + - ENV_PLATFORM + - OTEL_SERVICE_NAME=frontend + - PUBLIC_OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + - WEB_OTEL_SERVICE_NAME=frontend-web + - OTEL_COLLECTOR_HOST + - FLAGD_HOST + - FLAGD_PORT + depends_on: + cart: + condition: service_started + checkout: + condition: service_started + product-catalog: + condition: service_started + quote: + condition: service_started + recommendation: + condition: service_started + shipping: + condition: service_started + otel-collector: + condition: service_started + image-provider: + condition: service_started + flagd: + condition: service_started + logging: *logging + + # Quote service + quote: + image: ${IMAGE_NAME}:${DEMO_VERSION}-quote + container_name: quote + build: + context: ./ + dockerfile: ${QUOTE_DOCKERFILE} + cache_from: + - ${IMAGE_NAME}:${IMAGE_VERSION}-quote + deploy: + resources: + limits: + memory: 40M + restart: unless-stopped + ports: + - "${QUOTE_PORT}" + environment: + - IPV6_ENABLED + - OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} + - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + - OTEL_PHP_AUTOLOAD_ENABLED=true + - QUOTE_PORT + - OTEL_PHP_INTERNAL_METRICS_ENABLED=true + - OTEL_RESOURCE_ATTRIBUTES + - OTEL_SERVICE_NAME=quote + depends_on: + otel-collector: + condition: service_started + logging: *logging + + # Valkey used by Cart service + valkey-cart: + image: ${VALKEY_IMAGE} + container_name: valkey-cart + user: valkey + deploy: + resources: + limits: + memory: 20M + restart: unless-stopped + ports: + - "${VALKEY_PORT}" + logging: *logging + + # OpenTelemetry Collector + otel-collector: + image: ${COLLECTOR_CONTRIB_IMAGE} + container_name: otel-collector + deploy: + resources: + limits: + memory: 200M + restart: unless-stopped + command: [ "--config=/etc/otelcol-config.yml", "--config=/etc/otelcol-config-extras.yml" ] + user: 0:0 + volumes: + - ${HOST_FILESYSTEM}:/hostfs:ro + - ${DOCKER_SOCK}:/var/run/docker.sock:ro + - ${OTEL_COLLECTOR_CONFIG}:/etc/otelcol-config.yml + - ${OTEL_COLLECTOR_CONFIG_EXTRAS}:/etc/otelcol-config-extras.yml + ports: + - "${OTEL_COLLECTOR_PORT_GRPC}" + - "${OTEL_COLLECTOR_PORT_HTTP}" + depends_on: + jaeger: + condition: service_started + opensearch: + condition: service_healthy + logging: *logging + environment: + - FRONTEND_PROXY_ADDR + - IMAGE_PROVIDER_HOST + - IMAGE_PROVIDER_PORT + - HOST_FILESYSTEM + - OTEL_COLLECTOR_HOST + - OTEL_COLLECTOR_PORT_GRPC + - OTEL_COLLECTOR_PORT_HTTP + - POSTGRES_HOST + - POSTGRES_PORT + - POSTGRES_PASSWORD + - GOMEMLIMIT=160MiB + + # Email service + email: + image: ${IMAGE_NAME}:${DEMO_VERSION}-email + container_name: email + build: + context: ./ + dockerfile: ${EMAIL_DOCKERFILE} + cache_from: + - ${IMAGE_NAME}:${IMAGE_VERSION}-email + deploy: + resources: + limits: + memory: 100M + restart: unless-stopped + ports: + - "${EMAIL_PORT}" + environment: + - APP_ENV=production + - EMAIL_PORT + - FLAGD_HOST + - FLAGD_PORT + - OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} + - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + - OTEL_RESOURCE_ATTRIBUTES + - OTEL_SERVICE_NAME=email + depends_on: + otel-collector: + condition: service_started + logging: *logging + + # Product Catalog service + product-catalog: + image: ${IMAGE_NAME}:${DEMO_VERSION}-product-catalog + container_name: product-catalog + build: + context: ./ + dockerfile: ${PRODUCT_CATALOG_DOCKERFILE} + cache_from: + - ${IMAGE_NAME}:${IMAGE_VERSION}-product-catalog + deploy: + resources: + limits: + memory: 20M + restart: unless-stopped + ports: + - "${PRODUCT_CATALOG_PORT}" + environment: + - PRODUCT_CATALOG_PORT + - PRODUCT_CATALOG_RELOAD_INTERVAL + - FLAGD_HOST + - FLAGD_PORT + - GOMEMLIMIT=16MiB + - OTEL_EXPORTER_OTLP_ENDPOINT + - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + - OTEL_RESOURCE_ATTRIBUTES + - OTEL_SERVICE_NAME=product-catalog + volumes: + - ./src/product-catalog/products:/usr/src/app/products + depends_on: + otel-collector: + condition: service_started + flagd: + condition: service_started + logging: *logging + + # Shipping service + shipping: + image: ${IMAGE_NAME}:${DEMO_VERSION}-shipping + container_name: shipping + build: + context: ./ + dockerfile: ${SHIPPING_DOCKERFILE} + cache_from: + - ${IMAGE_NAME}:${IMAGE_VERSION}-shipping + deploy: + resources: + limits: + memory: 20M + restart: unless-stopped + ports: + - "${SHIPPING_PORT}" + environment: + - IPV6_ENABLED + - SHIPPING_PORT + - QUOTE_ADDR + - OTEL_EXPORTER_OTLP_ENDPOINT + - OTEL_RESOURCE_ATTRIBUTES + - OTEL_SERVICE_NAME=shipping + - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + depends_on: + otel-collector: + condition: service_started + logging: *logging + + # image-provider + image-provider: + image: ${IMAGE_NAME}:${DEMO_VERSION}-image-provider + container_name: image-provider + build: + context: ./ + dockerfile: ${IMAGE_PROVIDER_DOCKERFILE} + cache_from: + - ${IMAGE_NAME}:${IMAGE_VERSION}-image-provider + deploy: + resources: + limits: + memory: 120M + restart: unless-stopped + ports: + - "${IMAGE_PROVIDER_PORT}" + environment: + - IMAGE_PROVIDER_PORT + - OTEL_COLLECTOR_HOST + - OTEL_COLLECTOR_PORT_GRPC + - OTEL_RESOURCE_ATTRIBUTES + - OTEL_SERVICE_NAME=image-provider + depends_on: + otel-collector: + condition: service_started + logging: *logging + + + + # ******************** + # Telemetry Components + # ******************** + # Jaeger + jaeger: + image: ${JAEGERTRACING_IMAGE} + container_name: jaeger + command: + - "--config=file:/etc/jaeger/config.yml" + deploy: + resources: + limits: + memory: 1200M + restart: unless-stopped + ports: + - "${JAEGER_UI_PORT}" + - "${JAEGER_GRPC_PORT}" + environment: + - JAEGER_HOST + - JAEGER_GRPC_PORT + - PROMETHEUS_ADDR + - OTEL_COLLECTOR_HOST + - OTEL_COLLECTOR_PORT_HTTP + - MEMORY_MAX_TRACES=25000 + volumes: + - ./src/jaeger/config.yml:/etc/jaeger/config.yml + logging: *logging + + # OpenSearch + opensearch: + container_name: opensearch + build: + context: ./ + dockerfile: ${OPENSEARCH_DOCKERFILE} + cache_from: + - ${IMAGE_NAME}:${IMAGE_VERSION}-opensearch + deploy: + resources: + limits: + memory: 800M + restart: unless-stopped + environment: + - cluster.name=demo-cluster + - node.name=demo-node + - bootstrap.memory_lock=true + - discovery.type=single-node + - OPENSEARCH_JAVA_OPTS=-Xms400m -Xmx400m + - DISABLE_INSTALL_DEMO_CONFIG=true + - DISABLE_SECURITY_PLUGIN=true + # Workaround on OSX for https://bugs.openjdk.org/browse/JDK-8345296 + - _JAVA_OPTIONS + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + ports: + - "9200" + healthcheck: + test: curl -s http://localhost:9200/_cluster/health | grep -E '"status":"(green|yellow)"' + start_period: 10s + interval: 5s + timeout: 10s + retries: 10 + logging: *logging + + # Payment service + payment: + image: ${IMAGE_NAME}:${DEMO_VERSION}-payment + container_name: payment + build: + context: ./ + dockerfile: ${PAYMENT_DOCKERFILE} + cache_from: + - ${IMAGE_NAME}:${IMAGE_VERSION}-payment + deploy: + resources: + limits: + memory: 120M + restart: unless-stopped + ports: + - "${PAYMENT_PORT}" + environment: + - IPV6_ENABLED + - PAYMENT_PORT + - FLAGD_HOST + - FLAGD_PORT + - OTEL_EXPORTER_OTLP_ENDPOINT + - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + - OTEL_RESOURCE_ATTRIBUTES + - OTEL_SERVICE_NAME=payment + depends_on: + otel-collector: + condition: service_started + flagd: + condition: service_started + logging: *logging + + # ****************** + # Dependent Services + # ****************** + # Flagd, feature flagging service + flagd: + image: ${FLAGD_IMAGE} + container_name: flagd + deploy: + resources: + limits: + memory: 75M + restart: unless-stopped + environment: + - FLAGD_OTEL_COLLECTOR_URI=${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_GRPC} + - FLAGD_METRICS_EXPORTER=otel + - GOMEMLIMIT=60MiB + - OTEL_RESOURCE_ATTRIBUTES + - OTEL_SERVICE_NAME=flagd + command: [ + "start", + "--uri", + "file:./etc/flagd/demo.flagd.json" + ] + ports: + - "${FLAGD_PORT}" + - "${FLAGD_OFREP_PORT}" + volumes: + - ./src/flagd:/etc/flagd + logging: + *logging + + # Kafka used by Checkout, Accounting, and Fraud Detection services + kafka: + image: ${IMAGE_NAME}:${DEMO_VERSION}-kafka + container_name: kafka + build: + context: ./ + dockerfile: ${KAFKA_DOCKERFILE} + cache_from: + - ${IMAGE_NAME}:${IMAGE_VERSION}-kafka + args: + OTEL_JAVA_AGENT_VERSION: ${OTEL_JAVA_AGENT_VERSION} + deploy: + resources: + limits: + memory: 620M + restart: unless-stopped + environment: + - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://${KAFKA_HOST}:9092 + - KAFKA_LISTENERS=PLAINTEXT://${KAFKA_HOST}:9092,CONTROLLER://${KAFKA_HOST}:9093 + - KAFKA_CONTROLLER_QUORUM_VOTERS=1@${KAFKA_HOST}:9093 + - OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} + - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + - OTEL_RESOURCE_ATTRIBUTES + - OTEL_SERVICE_NAME=kafka + - KAFKA_HEAP_OPTS=-Xmx400m -Xms400m + # Workaround on OSX for https://bugs.openjdk.org/browse/JDK-8345296 + - _JAVA_OPTIONS + healthcheck: + test: nc -z kafka 9092 + start_period: 10s + interval: 5s + timeout: 10s + retries: 10 + logging: *logging \ No newline at end of file