diff --git a/.env b/.env index 9fdfb849..184f581d 100644 --- a/.env +++ b/.env @@ -103,9 +103,9 @@ EVAL_CANARY_LOOKBACK_MINUTES=15 # OpenTelemetry Demo Configuration # ****************** # Demo App version -IMAGE_VERSION=2.2.0 +IMAGE_VERSION=3.0.0 IMAGE_NAME=ghcr.io/open-telemetry/demo -DEMO_VERSION=2.2.0 +DEMO_VERSION=3.0.0 # Build Args TRACETEST_IMAGE_VERSION=v1.7.1 @@ -114,13 +114,13 @@ OPENTELEMETRY_CPP_VERSION=1.24.0 # Dependent images COLLECTOR_CONTRIB_IMAGE=ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.142.0 -FLAGD_IMAGE=ghcr.io/open-feature/flagd:v0.12.9 +FLAGD_IMAGE=ghcr.io/open-feature/flagd:v0.16.0 GRAFANA_IMAGE=grafana/grafana:12.3.1 JAEGERTRACING_IMAGE=jaegertracing/jaeger:2.12.0 OPENSEARCH_IMAGE=opensearchproject/opensearch:3.4.0 OPENSEARCH_DOCKERFILE=./src/opensearch/Dockerfile -POSTGRES_IMAGE=postgres:17.6 -VALKEY_IMAGE=valkey/valkey:9.0.1-alpine3.23 +POSTGRES_IMAGE=postgres:18.4 +VALKEY_IMAGE=ghcr.io/valkey-io/valkey:9.0.4-alpine3.23 TRACETEST_IMAGE=kubeshop/tracetest:${TRACETEST_IMAGE_VERSION} # Demo Platform @@ -130,7 +130,8 @@ ENV_PLATFORM=local IPV6_ENABLED=false # OpenTelemetry Resource Definitions -OTEL_RESOURCE_ATTRIBUTES=service.namespace=opentelemetry-demo,service.version=${IMAGE_VERSION} +OTEL_SERVICE_NAMESPACE=opentelemetry-demo +OTEL_RESOURCE_ATTRIBUTES=service.namespace=${OTEL_SERVICE_NAMESPACE},service.version=${IMAGE_VERSION} # Metrics Temporality OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=cumulative @@ -154,6 +155,7 @@ PUBLIC_OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://localhost:8080/otlp-http/v1/tra # Ad Service AD_PORT=9555 AD_ADDR=ad:${AD_PORT} +AD_PROMETHEUS_PORT=9465 # Cart Service CART_PORT=7070 @@ -180,18 +182,19 @@ ENVOY_ADDR=0.0.0.0 ENVOY_PORT=8080 ENVOY_ADMIN_PORT=10000 FRONTEND_HOST=frontend +FRONTEND_PROXY_ADDR=frontend-proxy:${ENVOY_PORT} # Image Provider IMAGE_PROVIDER_HOST=image-provider IMAGE_PROVIDER_PORT=8081 +# Telemetry Documentation +TELEMETRY_DOCS_HOST=telemetry-docs +TELEMETRY_DOCS_PORT=8000 + # Load Generator -LOCUST_WEB_PORT=8089 -LOCUST_USERS=5 -LOCUST_HOST=http://frontend-proxy:${ENVOY_PORT} -LOCUST_WEB_HOST=load-generator -LOCUST_AUTOSTART=true -LOCUST_HEADLESS=false +LOAD_GENERATOR_VUS=5 +K6_TARGET_URL=http://${FRONTEND_PROXY_ADDR} # Payment Service PAYMENT_PORT=50051 @@ -201,10 +204,6 @@ PAYMENT_ADDR=payment:${PAYMENT_PORT} PRODUCT_CATALOG_PORT=3550 PRODUCT_CATALOG_ADDR=product-catalog:${PRODUCT_CATALOG_PORT} -# Product Reviews Service -PRODUCT_REVIEWS_PORT=3551 -PRODUCT_REVIEWS_ADDR=product-reviews:${PRODUCT_REVIEWS_PORT} - # Quote Service QUOTE_PORT=8090 QUOTE_ADDR=http://quote:${QUOTE_PORT} @@ -229,28 +228,16 @@ FLAGD_OFREP_PORT=8016 FLAGD_UI_HOST=flagd-ui FLAGD_UI_PORT=4000 -# Kafka -KAFKA_PORT=9092 -KAFKA_HOST=kafka -KAFKA_ADDR=${KAFKA_HOST}:${KAFKA_PORT} - -# LLM service -LLM_HOST=llm -LLM_PORT=8000 -LLM_BASE_URL=http://${LLM_HOST}:${LLM_PORT}/v1 -LLM_MODEL=astronomy-llm -OPENAI_API_KEY=dummy - # Valkey VALKEY_PORT=6379 VALKEY_ADDR=valkey-cart:${VALKEY_PORT} # Postgres -POSTGRES_HOST=postgresql +POSTGRES_HOST=astronomy-db POSTGRES_PORT=5432 -POSTGRES_DB=otel -POSTGRES_PASSWORD=otel -POSTGRES_USER= +POSTGRES_PASSWORD=changeit +POSTGRES_ASTRONOMY_PASSWORD=astronomy_password # defined in docker-compose/opentelemetry-demo/src/postgresql/init.sql +POSTGRES_MONITORING_PASSWORD=monitoring_password # defined in docker-compose/opentelemetry-demo/src/postgresql/init.sql # ******************** # Telemetry Components @@ -264,5 +251,18 @@ JAEGER_HOST=jaeger JAEGER_UI_PORT=16686 JAEGER_GRPC_PORT=4317 +# Frontend-proxy envoy clusters for demo 3.0.0 backends not run by this stack +# (chatbot, firepit/profiles, opamp-server). The 3.0.0 frontend-proxy image's +# baked-in envoy bootstrap defines STRICT_DNS clusters for these; an empty +# address fails proto validation and the proxy crash-loops. Values mirror the +# upstream 3.0.0 defaults; the hosts do not resolve here, so the clusters stay +# unhealthy at runtime without blocking startup (same pattern as grafana/jaeger). +CHATBOT_HOST=chatbot +CHATBOT_PORT=7860 +FIREPIT_HOST=firepit +FIREPIT_PORT=8080 +OPAMP_SERVER_HOST=opamp-server +OPAMP_SERVER_UI_PORT=4321 + # Java Options (workaround for OSX JDK bug) _JAVA_OPTIONS= diff --git a/docker-compose.otel-demo.yml b/docker-compose.otel-demo.yml index 2f889d0e..a0f498bf 100644 --- a/docker-compose.otel-demo.yml +++ b/docker-compose.otel-demo.yml @@ -4,13 +4,18 @@ # Observability Stack OpenTelemetry Demo Services # Runs the OpenTelemetry Demo application and sends telemetry to the Observability Stack OTLP endpoint. # -# ⚠️ This is NOT a standalone Docker Compose file! -# This file is included by docker-compose.yml via the 'include:' directive. -# It depends on networks and services defined in the main docker-compose.yml. +# This is NOT a standalone Docker Compose file. +# It is included by docker-compose.yml via the 'include:' directive and +# depends on networks and services (otel-collector, prometheus, opensearch) +# defined in the main docker-compose.yml. # -# To use: Set INCLUDE_COMPOSE_FILES=docker-compose.otel-demo.yml in .env +# To use: Set INCLUDE_COMPOSE_OTEL_DEMO=docker-compose.otel-demo.yml in .env # Then run: docker compose up -d # +# Service set tracks the OpenTelemetry Demo 3.0.0 core (compose.yaml). +# accounting, fraud-detection, kafka, llm, and product-reviews are not part of +# the core set and are omitted. Telemetry from every service targets the stack +# collector (OTEL_COLLECTOR_HOST) rather than the demo's bundled collector. x-default-logging: &logging driver: "json-file" @@ -27,33 +32,6 @@ services: # ****************** # Core Demo Services # ****************** - # Accounting service - accounting: - image: ${IMAGE_NAME}:${DEMO_VERSION}-accounting - container_name: accounting - deploy: - resources: - limits: - memory: 160M - restart: unless-stopped - environment: - - KAFKA_ADDR - - OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} - - OTEL_METRICS_EXPORTER - - OTEL_LOGS_EXPORTER - - 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 - <<: *network - logging: *logging - # AdService ad: image: ${IMAGE_NAME}:${DEMO_VERSION}-ad @@ -65,19 +43,27 @@ services: restart: unless-stopped ports: - "${AD_PORT}" + - "${AD_PROMETHEUS_PORT}" environment: - AD_PORT + - AD_PROMETHEUS_PORT - FLAGD_HOST - FLAGD_PORT - OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_RESOURCE_ATTRIBUTES - - OTEL_LOGS_EXPORTER=otlp + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=medium - OTEL_SERVICE_NAME=ad + - OTEL_EXPERIMENTAL_SDK_TELEMETRY_VERSION=latest # Workaround on OSX for https://bugs.openjdk.org/browse/JDK-8345296 - _JAVA_OPTIONS + healthcheck: + test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/${AD_PORT}'"] + start_period: 20s + interval: 5s + timeout: 5s + retries: 20 depends_on: otel-collector: condition: service_started @@ -106,12 +92,12 @@ services: - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=high - OTEL_SERVICE_NAME=cart - ASPNETCORE_URLS=http://*:${CART_PORT} depends_on: valkey-cart: - condition: service_started + condition: service_healthy otel-collector: condition: service_started flagd: @@ -140,33 +126,40 @@ services: - PAYMENT_ADDR - PRODUCT_CATALOG_ADDR - SHIPPING_ADDR - - KAFKA_ADDR - GOMEMLIMIT=16MiB - - OTEL_EXPORTER_OTLP_ENDPOINT + - OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} + - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=critical - OTEL_SERVICE_NAME=checkout + healthcheck: + test: ["CMD", "/bin/grpc_health_probe", "-addr=:${CHECKOUT_PORT}"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 depends_on: cart: condition: service_started currency: - condition: service_started + condition: service_healthy email: - condition: service_started + condition: service_healthy payment: - condition: service_started + condition: service_healthy product-catalog: condition: service_started shipping: condition: service_started otel-collector: condition: service_started - kafka: - condition: service_healthy flagd: condition: service_started + read_only: true + tmpfs: + - /tmp <<: *network logging: *logging @@ -189,8 +182,14 @@ services: - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=high - OTEL_SERVICE_NAME=currency + healthcheck: + test: ["CMD-SHELL", "nc -z localhost ${CURRENCY_PORT}"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 depends_on: otel-collector: condition: service_started @@ -217,43 +216,20 @@ services: - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=medium - OTEL_SERVICE_NAME=email + healthcheck: + test: ["CMD", "ruby", "-e", "require 'socket'; TCPSocket.new('localhost', ${EMAIL_PORT}).close"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 depends_on: otel-collector: condition: service_started <<: *network logging: *logging - # Fraud Detection service - fraud-detection: - image: ${IMAGE_NAME}:${DEMO_VERSION}-fraud-detection - container_name: fraud-detection - deploy: - resources: - limits: - memory: 300M - restart: unless-stopped - environment: - - FLAGD_HOST - - FLAGD_PORT - - KAFKA_ADDR - - OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} - - OTEL_METRICS_EXPORTER - - OTEL_LOGS_EXPORTER - - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_INSTRUMENTATION_KAFKA_EXPERIMENTAL_SPAN_ATTRIBUTES=true - - OTEL_INSTRUMENTATION_MESSAGING_EXPERIMENTAL_RECEIVE_TELEMETRY_ENABLED=true - - OTEL_RESOURCE_ATTRIBUTES - - OTEL_SERVICE_NAME=fraud-detection - depends_on: - otel-collector: - condition: service_started - kafka: - condition: service_healthy - <<: *network - logging: *logging - # Frontend frontend: image: ${IMAGE_NAME}:${DEMO_VERSION}-frontend @@ -273,13 +249,12 @@ services: - CHECKOUT_ADDR - CURRENCY_ADDR - PRODUCT_CATALOG_ADDR - - PRODUCT_REVIEWS_ADDR - RECOMMENDATION_ADDR - SHIPPING_ADDR - OTEL_EXPORTER_OTLP_ENDPOINT - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=critical - ENV_PLATFORM - OTEL_SERVICE_NAME=frontend - PUBLIC_OTEL_EXPORTER_OTLP_TRACES_ENDPOINT @@ -288,27 +263,33 @@ services: - OTEL_COLLECTOR_HOST - FLAGD_HOST - FLAGD_PORT + healthcheck: + test: ["CMD", "/nodejs/bin/node", "-e", "require('net').connect(${FRONTEND_PORT},require('os').hostname(),function(){process.exit(0)}).on('error',function(){process.exit(1)})"] + start_period: 60s + interval: 10s + timeout: 10s + retries: 5 depends_on: ad: - condition: service_started + condition: service_healthy cart: condition: service_started checkout: condition: service_started currency: - condition: service_started + condition: service_healthy product-catalog: condition: service_started quote: - condition: service_started + condition: service_healthy recommendation: - condition: service_started + condition: service_healthy shipping: condition: service_started otel-collector: condition: service_started image-provider: - condition: service_started + condition: service_healthy flagd: condition: service_started <<: *network @@ -321,7 +302,7 @@ services: deploy: resources: limits: - memory: 65M + memory: 90M restart: unless-stopped ports: - "${ENVOY_PORT}:${ENVOY_PORT}" @@ -329,19 +310,24 @@ services: environment: - FRONTEND_PORT - FRONTEND_HOST - - LOCUST_WEB_HOST - - LOCUST_WEB_PORT - GRAFANA_PORT - GRAFANA_HOST - JAEGER_UI_PORT - JAEGER_HOST + - CHATBOT_HOST + - CHATBOT_PORT + - FIREPIT_HOST + - FIREPIT_PORT + - OPAMP_SERVER_HOST + - OPAMP_SERVER_UI_PORT - OTEL_COLLECTOR_HOST - IMAGE_PROVIDER_HOST - IMAGE_PROVIDER_PORT - OTEL_COLLECTOR_PORT_GRPC - OTEL_COLLECTOR_PORT_HTTP - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=critical - OTEL_SERVICE_NAME=frontend-proxy + - OTEL_SERVICE_NAMESPACE - ENVOY_PORT - ENVOY_ADDR - ENVOY_ADMIN_PORT @@ -349,13 +335,21 @@ services: - FLAGD_PORT - FLAGD_UI_HOST - FLAGD_UI_PORT + - TELEMETRY_DOCS_HOST + - TELEMETRY_DOCS_PORT + healthcheck: + test: ["CMD", "bash", "-c", "echo > /dev/tcp/localhost/${ENVOY_PORT}"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 depends_on: frontend: - condition: service_started - load-generator: - condition: service_started + condition: service_healthy flagd-ui: - condition: service_started + condition: service_healthy + telemetry-docs: + condition: service_healthy <<: *network dns_search: "" @@ -374,46 +368,58 @@ services: - IMAGE_PROVIDER_PORT - OTEL_COLLECTOR_HOST - OTEL_COLLECTOR_PORT_GRPC - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=low - OTEL_SERVICE_NAME=image-provider + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:${IMAGE_PROVIDER_PORT}/status"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 depends_on: otel-collector: condition: service_started <<: *network logging: *logging - # Load Generator + # Load Generator (k6) load-generator: image: ${IMAGE_NAME}:${DEMO_VERSION}-load-generator container_name: load-generator deploy: resources: limits: - memory: 1500M + memory: 512M restart: unless-stopped - ports: - - "${LOCUST_WEB_PORT}" environment: - - LOCUST_WEB_PORT - - LOCUST_USERS - - LOCUST_HOST - - LOCUST_HEADLESS - - LOCUST_AUTOSTART - - LOCUST_BROWSER_TRAFFIC_ENABLED=false - - OTEL_EXPORTER_OTLP_ENDPOINT + - LOAD_GENERATOR_VUS + - K6_TARGET_URL + - OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} + - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=low - OTEL_SERVICE_NAME=load-generator - - PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python - - LOCUST_WEB_HOST=0.0.0.0 - FLAGD_HOST - FLAGD_PORT - FLAGD_OFREP_PORT + - K6_OTEL_EXPORTER_PROTOCOL=http/protobuf + - K6_OTEL_HTTP_EXPORTER_ENDPOINT=${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} + - K6_OTEL_HTTP_EXPORTER_INSECURE=true + - K6_BROWSER_ENABLED=true + - K6_BROWSER_ARGS=no-sandbox,disable-dev-shm-usage + - K6_OTEL_METRIC_PREFIX=k6. + healthcheck: + test: ["CMD-SHELL", "pgrep k6"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 5 depends_on: frontend: - condition: service_started + condition: service_healthy + frontend-proxy: + condition: service_healthy flagd: condition: service_started <<: *network @@ -435,12 +441,29 @@ services: - PAYMENT_PORT - FLAGD_HOST - FLAGD_PORT + - NODE_OPTIONS=--require @opentelemetry/auto-instrumentations-node/register - OTEL_EXPORTER_OTLP_ENDPOINT - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_EXPORTER_OTLP_PROTOCOL=grpc + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=critical - OTEL_SERVICE_NAME=payment + healthcheck: + test: + - "CMD" + - "/nodejs/bin/node" + - "-e" + - >- + const net=require('net');const c=new net.Socket(); + c.setTimeout(2000); + c.connect(${PAYMENT_PORT},'127.0.0.1',()=>{c.destroy();process.exit(0)}); + c.on('error',()=>process.exit(1)); + c.on('timeout',()=>process.exit(1)) + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 depends_on: otel-collector: condition: service_started @@ -469,60 +492,29 @@ services: - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=high - OTEL_SERVICE_NAME=product-catalog + - OTEL_CONFIG_FILE=/otel-config.yml - OTEL_SEMCONV_STABILITY_OPT_IN=database - - DB_CONNECTION_STRING=postgres://otelu:otelp@${POSTGRES_HOST}/${POSTGRES_DB}?sslmode=disable + - DB_CONNECTION_STRING=postgres://astronomy_user:${POSTGRES_ASTRONOMY_PASSWORD}@${POSTGRES_HOST}/astronomy_db?sslmode=disable + healthcheck: + test: ["CMD", "/bin/grpc_health_probe", "-addr=:${PRODUCT_CATALOG_PORT}"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 depends_on: otel-collector: condition: service_started flagd: condition: service_started - postgresql: - condition: service_started - <<: *network - logging: *logging - - # Product reviews service - product-reviews: - image: ${IMAGE_NAME}:${DEMO_VERSION}-product-reviews - container_name: product-reviews - deploy: - resources: - limits: - memory: 100M - restart: unless-stopped - ports: - - "${PRODUCT_REVIEWS_PORT}" - environment: - - PRODUCT_REVIEWS_PORT - - OTEL_PYTHON_LOG_CORRELATION=true - - OTEL_EXPORTER_OTLP_ENDPOINT - - OTEL_METRICS_EXPORTER - - OTEL_LOGS_EXPORTER - - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_RESOURCE_ATTRIBUTES - - OTEL_SERVICE_NAME=product-reviews - - OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true - - PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python - - DB_CONNECTION_STRING=host=${POSTGRES_HOST} user=otelu password=otelp dbname=${POSTGRES_DB} - - LLM_BASE_URL - - OPENAI_API_KEY - - LLM_MODEL - - PRODUCT_CATALOG_ADDR - - FLAGD_HOST - - FLAGD_PORT - - LLM_HOST - - LLM_PORT - depends_on: - product-catalog: - condition: service_started - llm: - condition: service_started - postgresql: - condition: service_started - otel-collector: - condition: service_started + astronomy-db: + condition: service_healthy + volumes: + - ./docker-compose/opentelemetry-demo/src/product-catalog/otel-config.yml:/otel-config.yml + read_only: true + tmpfs: + - /tmp <<: *network logging: *logging @@ -546,8 +538,14 @@ services: - OTEL_PHP_AUTOLOAD_ENABLED=true - QUOTE_PORT - OTEL_PHP_INTERNAL_METRICS_ENABLED=true - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=low - OTEL_SERVICE_NAME=quote + healthcheck: + test: ["CMD", "php", "-r", "fsockopen('localhost', ${QUOTE_PORT}) or die('fail');"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 depends_on: otel-collector: condition: service_started @@ -575,9 +573,15 @@ services: - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=medium - OTEL_SERVICE_NAME=recommendation - PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python + healthcheck: + test: ["CMD-SHELL", "nc -z localhost ${RECOMMENDATION_PORT}"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 depends_on: product-catalog: condition: service_started @@ -603,15 +607,54 @@ services: - IPV6_ENABLED - SHIPPING_PORT - QUOTE_ADDR - - OTEL_EXPORTER_OTLP_ENDPOINT + - FLAGD_HOST + - FLAGD_PORT + - OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} + - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=high - OTEL_SERVICE_NAME=shipping - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + healthcheck: + test: ["CMD", "/app/healthcheck"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 depends_on: otel-collector: condition: service_started + flagd: + condition: service_started + read_only: true + tmpfs: + - /tmp + <<: *network + logging: *logging + + # Telemetry Documentation service + telemetry-docs: + image: ${IMAGE_NAME}:${DEMO_VERSION}-telemetry-docs + container_name: telemetry-docs + deploy: + resources: + limits: + memory: 100M + restart: unless-stopped + ports: + - "${TELEMETRY_DOCS_PORT}" + environment: + - TELEMETRY_DOCS_PORT + - OTEL_COLLECTOR_HOST + - OTEL_COLLECTOR_PORT_GRPC + - OTEL_SERVICE_NAME=telemetry-docs + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:${TELEMETRY_DOCS_PORT}/"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 <<: *network logging: *logging @@ -628,10 +671,10 @@ services: memory: 75M restart: unless-stopped environment: - - FLAGD_OTEL_COLLECTOR_URI=${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_GRPC} - - FLAGD_METRICS_EXPORTER=otel + - OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP} + - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - GOMEMLIMIT=60MiB - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=low - OTEL_SERVICE_NAME=flagd command: [ "start", @@ -644,8 +687,7 @@ services: volumes: - ./docker-compose/opentelemetry-demo/src/flagd:/etc/flagd <<: *network - logging: - *logging + logging: *logging # Flagd UI for configuring the feature flag service flagd-ui: @@ -662,12 +704,18 @@ services: - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - - OTEL_RESOURCE_ATTRIBUTES + - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.criticality=low - OTEL_SERVICE_NAME=flagd-ui - SECRET_KEY_BASE=yYrECL4qbNwleYInGJYvVnSkwJuSQJ4ijPTx5tirGUXrbznFIBFVJdPl5t6O9ASw - PHX_HOST=localhost ports: - "${FLAGD_UI_PORT}" + healthcheck: + test: ["CMD", "bash", "-c", "echo > /dev/tcp/localhost/${FLAGD_UI_PORT}"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 20 depends_on: otel-collector: condition: service_started @@ -677,61 +725,10 @@ services: - ./docker-compose/opentelemetry-demo/src/flagd:/app/data <<: *network - # Kafka used by Checkout, Accounting, and Fraud Detection services - kafka: - image: ${IMAGE_NAME}:${DEMO_VERSION}-kafka - container_name: kafka - 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_METRICS_EXPORTER - - OTEL_LOGS_EXPORTER - - 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 - <<: *network - logging: *logging - - # LLM used by Product Review service - llm: - image: ${IMAGE_NAME}:${DEMO_VERSION}-llm - container_name: llm - deploy: - resources: - limits: - memory: 50M - restart: unless-stopped - environment: - - FLAGD_HOST - - FLAGD_PORT - ports: - - "${LLM_PORT}" - depends_on: - flagd: - condition: service_started - <<: *network - logging: *logging - - # Postgresql used by Accounting service - postgresql: + # PostgreSQL database for the astronomy demo + astronomy-db: image: ${POSTGRES_IMAGE} - container_name: postgresql + container_name: astronomy-db deploy: resources: limits: @@ -739,10 +736,15 @@ services: restart: unless-stopped ports: - ${POSTGRES_PORT} + command: postgres -c shared_preload_libraries=pg_stat_statements environment: - - POSTGRES_USER=root - POSTGRES_PASSWORD - - POSTGRES_DB + healthcheck: + test: ["CMD-SHELL", "pg_isready"] + start_period: 10s + interval: 5s + timeout: 5s + retries: 10 volumes: - ./docker-compose/opentelemetry-demo/src/postgresql/init.sql:/docker-entrypoint-initdb.d/init.sql <<: *network @@ -760,6 +762,12 @@ services: restart: unless-stopped ports: - "${VALKEY_PORT}" + healthcheck: + test: ["CMD-SHELL", "valkey-cli ping"] + start_period: 5s + interval: 5s + timeout: 3s + retries: 10 <<: *network logging: *logging @@ -806,4 +814,3 @@ services: <<: *network restart: "no" logging: *logging - diff --git a/docker-compose/opensearch-dashboards/init/dashboard-astronomy-service-telemetry.ndjson b/docker-compose/opensearch-dashboards/init/dashboard-astronomy-service-telemetry.ndjson index a73bf226..fed64302 100644 --- a/docker-compose/opensearch-dashboards/init/dashboard-astronomy-service-telemetry.ndjson +++ b/docker-compose/opensearch-dashboards/init/dashboard-astronomy-service-telemetry.ndjson @@ -10,4 +10,4 @@ {"attributes": {"columns": [], "description": "", "hits": 0, "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"query\":{\"query\":\"| where serviceName IN $serviceName and resource.attributes.telemetry.sdk.language IN $env and durationInNanos > 100000000\\n| fields traceId, serviceName, name, durationInNanos\\n| sort - durationInNanos\\n| head 10\",\"language\":\"PPL\",\"dataset\":{\"id\":\"54f4c1f0-2938-11f1-84ad-e734b5ac5a91\",\"title\":\"otel-v1-apm-span*\",\"type\":\"INDEX_PATTERN\",\"timeFieldName\":\"endTime\",\"signalType\":\"traces\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"}, "sort": [], "title": "Slow spans (>100ms)", "uiState": "", "version": 1, "visualization": "{\"title\":\"\",\"chartType\":\"table\",\"params\":{\"pageSize\":50,\"globalAlignment\":\"left\",\"showColumnFilter\":false,\"showFooter\":false,\"footerCalculations\":[],\"cellTypes\":[],\"thresholds\":[],\"baseColor\":\"#000000\",\"dataLinks\":[{\"id\":\"e92c5dcd-e613-4d07-95ba-ed58ac9f098d\",\"title\":\"traceId-datalink\",\"url\":\"https://observability.playground.opensearch.org/w/8xYRJ9/app/explore/traces/traceDetails#/?_a=(dataset:(id:'54f4c1f0-2938-11f1-84ad-e734b5ac5a91',title:'otel-v1-apm-span*',type:'INDEX_PATTERN',timeFieldName:'endTime'),traceId:'${__value.text}')\",\"openInNewTab\":true,\"fields\":[\"field-0\"]}],\"visibleColumns\":[],\"hiddenColumns\":[]}}"}, "id": "68350460-5547-11f1-af90-3fdb95669bd2", "references": [{"id": "54f4c1f0-2938-11f1-84ad-e734b5ac5a91", "name": "kibanaSavedObjectMeta.searchSourceJSON.index", "type": "index-pattern"}, {"id": "54f4c1f0-2938-11f1-84ad-e734b5ac5a91", "name": "kibanaSavedObjectMeta.searchSourceJSON.index", "type": "index-pattern"}], "type": "explore", "updated_at": "2026-08-06T03:40:01.425Z", "version": "WzI5NiwxXQ==", "workspaces": ["JvWKe1"]} {"attributes": {"columns": [], "description": "", "hits": 0, "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"query\":{\"query\":\"\\n round(\\n histogram_quantile(0.95, sum by (le, service_name) (rate(http_server_request_duration_seconds_bucket{service_name=~\\\"$serviceName\\\", telemetry_sdk_language=~\\\"$env\\\"}[5m]))) *\\n 1000\\n or histogram_quantile(0.95, sum by (le, service_name) (rate(rpc_server_duration_milliseconds_bucket{service_name=~\\\"$serviceName\\\", telemetry_sdk_language=~\\\"$env\\\"}[5m])))\\n , 0.01)\\n\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"ObservabilityStack_Prometheus\",\"title\":\"ObservabilityStack_Prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"}, "sort": [], "title": "P95 Queries", "uiState": "", "version": 1, "visualization": "{\"title\":\"\",\"chartType\":\"metric\",\"params\":{\"showTitle\":true,\"title\":\"\",\"showPercentage\":true,\"percentageColor\":\"inverted\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#0852c1\",\"thresholds\":[]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_gradient\"},\"axesMapping\":{\"value\":[\"Value\"],\"time\":[\"Time\"]},\"splitField\":\"Series\",\"splitLayout\":\"horizontal\",\"showSplitLabel\":true}"}, "id": "bcdc8190-5548-11f1-996b-17cae04f3529", "references": [{"id": "ObservabilityStack_Prometheus", "name": "kibanaSavedObjectMeta.searchSourceJSON.index", "type": "index-pattern"}, {"id": "ObservabilityStack_Prometheus", "name": "kibanaSavedObjectMeta.searchSourceJSON.index", "type": "index-pattern"}], "type": "explore", "updated_at": "2026-08-06T03:40:01.425Z", "version": "WzI5NywxXQ==", "workspaces": ["JvWKe1"]} {"attributes": {"columns": [], "description": "", "hits": 0, "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"query\":{\"query\":\"| where resource.attributes.service.name IN $serviceName and resource.attributes.telemetry.sdk.language IN $env\\n| sort - time\\n| head 10\\n| fields resource.attributes.service.name, severityText, body\",\"language\":\"PPL\",\"dataset\":{\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\",\"timeFieldName\":\"time\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"}, "sort": [], "title": "recent service logs", "uiState": "", "version": 1, "visualization": "{\"title\":\"\",\"chartType\":\"table\",\"params\":{\"pageSize\":50,\"globalAlignment\":\"left\",\"showColumnFilter\":false,\"showFooter\":false,\"footerCalculations\":[],\"cellTypes\":[],\"thresholds\":[],\"baseColor\":\"#000000\",\"dataLinks\":[],\"visibleColumns\":[],\"hiddenColumns\":[]}}"}, "id": "a6f24840-5540-11f1-996b-17cae04f3529", "references": [{"id": "545c7990-2938-11f1-84ad-e734b5ac5a91", "name": "kibanaSavedObjectMeta.searchSourceJSON.index", "type": "index-pattern"}, {"id": "545c7990-2938-11f1-84ad-e734b5ac5a91", "name": "kibanaSavedObjectMeta.searchSourceJSON.index", "type": "index-pattern"}], "type": "explore", "updated_at": "2026-08-06T03:40:01.425Z", "version": "WzI5OCwxXQ==", "workspaces": ["JvWKe1"]} -{"attributes": {"description": "", "hits": 0, "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"query\":{\"dataset\":{\"displayName\":\"Log Dataset - Local Cluster\",\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"isRemoteDataset\":false,\"timeFieldName\":\"time\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\"},\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"}, "optionsJSON": "{\"hidePanelTitles\":false,\"useMargins\":true}", "panelsJSON": "[{\"embeddableConfig\":{},\"gridData\":{\"h\":12,\"i\":\"5d3f7040-77f6-4a17-9591-c5a56b4c5ed6\",\"w\":20,\"x\":0,\"y\":0},\"panelIndex\":\"5d3f7040-77f6-4a17-9591-c5a56b4c5ed6\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_0\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":12,\"i\":\"39cedd50-8f50-4ebc-a9e5-552323d17379\",\"w\":8,\"x\":20,\"y\":0},\"panelIndex\":\"39cedd50-8f50-4ebc-a9e5-552323d17379\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_1\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":12,\"i\":\"e28e7125-23d4-42eb-88b4-6ad36a990c50\",\"w\":20,\"x\":28,\"y\":0},\"panelIndex\":\"e28e7125-23d4-42eb-88b4-6ad36a990c50\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_2\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":12,\"i\":\"6c877d2b-5aeb-4e62-adfe-abd1ba507df9\",\"w\":9,\"x\":0,\"y\":12},\"panelIndex\":\"6c877d2b-5aeb-4e62-adfe-abd1ba507df9\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_3\"},{\"embeddableConfig\":{\"hidePanelTitles\":false},\"gridData\":{\"h\":12,\"i\":\"fdf63c66-7601-4354-82c5-486fdc59223d\",\"w\":39,\"x\":9,\"y\":12},\"panelIndex\":\"fdf63c66-7601-4354-82c5-486fdc59223d\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_4\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":10,\"i\":\"ecbb5341-fa4c-4ce7-aa39-49feb6d5617b\",\"w\":23,\"x\":0,\"y\":24},\"panelIndex\":\"ecbb5341-fa4c-4ce7-aa39-49feb6d5617b\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_5\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":10,\"i\":\"a1a02e14-7bf5-4f37-965e-8aaa817861a2\",\"w\":13,\"x\":23,\"y\":24},\"panelIndex\":\"a1a02e14-7bf5-4f37-965e-8aaa817861a2\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_6\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":10,\"i\":\"4d2ac69e-400a-4f61-a1a6-3e9a842ad6f6\",\"w\":12,\"x\":36,\"y\":24},\"panelIndex\":\"4d2ac69e-400a-4f61-a1a6-3e9a842ad6f6\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_7\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":10,\"i\":\"8ad849c2-7b3c-4717-a9f2-1aaf236cc0ce\",\"w\":17,\"x\":0,\"y\":34},\"panelIndex\":\"8ad849c2-7b3c-4717-a9f2-1aaf236cc0ce\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_8\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":10,\"i\":\"934d6236-2f0f-4f7f-814d-81eca859820f\",\"w\":31,\"x\":17,\"y\":34},\"panelIndex\":\"934d6236-2f0f-4f7f-814d-81eca859820f\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_9\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":12,\"i\":\"ad1c7656-f44e-476a-9ae1-def6eb0c7402\",\"w\":48,\"x\":0,\"y\":44},\"panelIndex\":\"ad1c7656-f44e-476a-9ae1-def6eb0c7402\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_10\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":9,\"i\":\"a28c1fe1-5b35-4a91-a33f-db46aa73918e\",\"w\":48,\"x\":0,\"y\":56},\"panelIndex\":\"a28c1fe1-5b35-4a91-a33f-db46aa73918e\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_11\"}]", "refreshInterval": {"pause": true, "value": 0}, "timeFrom": "now-5h", "timeRestore": true, "timeTo": "now", "title": "Astronomy shop - service telemetry", "variablesJSON": "{\"variables\":[{\"current\":[\"ad\",\"cart\",\"checkout\",\"currency\",\"email\",\"events-agent\",\"flagd\",\"fraud-detection\",\"frontend\",\"frontend-proxy\",\"load-generator\",\"mcp-server\",\"payment\",\"product-catalog\",\"product-reviews\",\"quote\",\"recommendation\",\"shipping\"],\"dataset\":{\"id\":\"55f4c1f0-2938-11f1-84ad-e734b5ac5a91\",\"timeFieldName\":\"timestamp\",\"title\":\"otel-v2-apm-service-map*\",\"type\":\"INDEX_PATTERN\"},\"id\":\"327d8298-32a2-4efb-9449-6762188a40b2\",\"includeAll\":true,\"label\":\"Service name\",\"language\":\"PPL\",\"multi\":true,\"name\":\"serviceName\",\"query\":\"| fields `sourceNode.keyAttributes.name`\",\"sort\":\"alphabetical-asc\",\"type\":\"query\",\"useTimeFilter\":true},{\"current\":[\"go\",\"python\",\"dotnet\",\"java\",\"php\",\"ruby\"],\"dataset\":{\"displayName\":\"Log Dataset - Local Cluster\",\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"schemaMappings\":{\"otelLogs\":{\"serviceName\":\"resource.attributes.service.name\",\"spanId\":\"spanId\",\"timestamp\":\"time\",\"traceId\":\"traceId\"}},\"signalType\":\"logs\",\"timeFieldName\":\"time\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\"},\"id\":\"38fedafd-7384-4519-a91d-145408f320fe\",\"includeAll\":true,\"label\":\"SDK Language\",\"language\":\"PPL\",\"multi\":true,\"name\":\"env\",\"query\":\"| fields resource.attributes.telemetry.sdk.language\",\"sort\":\"disabled\",\"type\":\"query\",\"useTimeFilter\":true}]}", "version": 1}, "id": "315a6cb0-54a6-11f1-bef9-a3498e74ec27", "migrationVersion": {"dashboard": "7.9.3"}, "references": [{"id": "b8c5dd50-5547-11f1-996b-17cae04f3529", "name": "panel_0", "type": "explore"}, {"id": "77d89b10-5543-11f1-af90-3fdb95669bd2", "name": "panel_1", "type": "explore"}, {"id": "62fc0030-5546-11f1-996b-17cae04f3529", "name": "panel_2", "type": "explore"}, {"id": "32faabc0-5541-11f1-996b-17cae04f3529", "name": "panel_3", "type": "explore"}, {"id": "63f64d70-5540-11f1-996b-17cae04f3529", "name": "panel_4", "type": "explore"}, {"id": "81d15090-554c-11f1-996b-17cae04f3529", "name": "panel_5", "type": "explore"}, {"id": "053de060-554d-11f1-af90-3fdb95669bd2", "name": "panel_6", "type": "explore"}, {"id": "6d9a5670-554d-11f1-996b-17cae04f3529", "name": "panel_7", "type": "explore"}, {"id": "2a016710-5547-11f1-996b-17cae04f3529", "name": "panel_8", "type": "explore"}, {"id": "68350460-5547-11f1-af90-3fdb95669bd2", "name": "panel_9", "type": "explore"}, {"id": "bcdc8190-5548-11f1-996b-17cae04f3529", "name": "panel_10", "type": "explore"}, {"id": "a6f24840-5540-11f1-996b-17cae04f3529", "name": "panel_11", "type": "explore"}], "type": "dashboard", "updated_at": "2026-08-06T03:40:01.425Z", "version": "WzI5OSwxXQ==", "workspaces": ["JvWKe1"]} +{"attributes": {"description": "", "hits": 0, "kibanaSavedObjectMeta": {"searchSourceJSON": "{\"query\":{\"dataset\":{\"displayName\":\"Log Dataset - Local Cluster\",\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"isRemoteDataset\":false,\"timeFieldName\":\"time\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\"},\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"}, "optionsJSON": "{\"hidePanelTitles\":false,\"useMargins\":true}", "panelsJSON": "[{\"embeddableConfig\":{},\"gridData\":{\"h\":12,\"i\":\"5d3f7040-77f6-4a17-9591-c5a56b4c5ed6\",\"w\":20,\"x\":0,\"y\":0},\"panelIndex\":\"5d3f7040-77f6-4a17-9591-c5a56b4c5ed6\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_0\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":12,\"i\":\"39cedd50-8f50-4ebc-a9e5-552323d17379\",\"w\":8,\"x\":20,\"y\":0},\"panelIndex\":\"39cedd50-8f50-4ebc-a9e5-552323d17379\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_1\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":12,\"i\":\"e28e7125-23d4-42eb-88b4-6ad36a990c50\",\"w\":20,\"x\":28,\"y\":0},\"panelIndex\":\"e28e7125-23d4-42eb-88b4-6ad36a990c50\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_2\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":12,\"i\":\"6c877d2b-5aeb-4e62-adfe-abd1ba507df9\",\"w\":9,\"x\":0,\"y\":12},\"panelIndex\":\"6c877d2b-5aeb-4e62-adfe-abd1ba507df9\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_3\"},{\"embeddableConfig\":{\"hidePanelTitles\":false},\"gridData\":{\"h\":12,\"i\":\"fdf63c66-7601-4354-82c5-486fdc59223d\",\"w\":39,\"x\":9,\"y\":12},\"panelIndex\":\"fdf63c66-7601-4354-82c5-486fdc59223d\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_4\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":10,\"i\":\"ecbb5341-fa4c-4ce7-aa39-49feb6d5617b\",\"w\":23,\"x\":0,\"y\":24},\"panelIndex\":\"ecbb5341-fa4c-4ce7-aa39-49feb6d5617b\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_5\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":10,\"i\":\"a1a02e14-7bf5-4f37-965e-8aaa817861a2\",\"w\":13,\"x\":23,\"y\":24},\"panelIndex\":\"a1a02e14-7bf5-4f37-965e-8aaa817861a2\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_6\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":10,\"i\":\"4d2ac69e-400a-4f61-a1a6-3e9a842ad6f6\",\"w\":12,\"x\":36,\"y\":24},\"panelIndex\":\"4d2ac69e-400a-4f61-a1a6-3e9a842ad6f6\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_7\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":10,\"i\":\"8ad849c2-7b3c-4717-a9f2-1aaf236cc0ce\",\"w\":17,\"x\":0,\"y\":34},\"panelIndex\":\"8ad849c2-7b3c-4717-a9f2-1aaf236cc0ce\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_8\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":10,\"i\":\"934d6236-2f0f-4f7f-814d-81eca859820f\",\"w\":31,\"x\":17,\"y\":34},\"panelIndex\":\"934d6236-2f0f-4f7f-814d-81eca859820f\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_9\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":12,\"i\":\"ad1c7656-f44e-476a-9ae1-def6eb0c7402\",\"w\":48,\"x\":0,\"y\":44},\"panelIndex\":\"ad1c7656-f44e-476a-9ae1-def6eb0c7402\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_10\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":9,\"i\":\"a28c1fe1-5b35-4a91-a33f-db46aa73918e\",\"w\":48,\"x\":0,\"y\":56},\"panelIndex\":\"a28c1fe1-5b35-4a91-a33f-db46aa73918e\",\"version\":\"3.7.0\",\"panelRefName\":\"panel_11\"}]", "refreshInterval": {"pause": true, "value": 0}, "timeFrom": "now-5h", "timeRestore": true, "timeTo": "now", "title": "Astronomy shop - service telemetry", "variablesJSON": "{\"variables\":[{\"current\":[\"ad\",\"cart\",\"checkout\",\"currency\",\"email\",\"events-agent\",\"flagd\",\"frontend\",\"frontend-proxy\",\"load-generator\",\"mcp-server\",\"payment\",\"product-catalog\",\"quote\",\"recommendation\",\"shipping\"],\"dataset\":{\"id\":\"55f4c1f0-2938-11f1-84ad-e734b5ac5a91\",\"timeFieldName\":\"timestamp\",\"title\":\"otel-v2-apm-service-map*\",\"type\":\"INDEX_PATTERN\"},\"id\":\"327d8298-32a2-4efb-9449-6762188a40b2\",\"includeAll\":true,\"label\":\"Service name\",\"language\":\"PPL\",\"multi\":true,\"name\":\"serviceName\",\"query\":\"| fields `sourceNode.keyAttributes.name`\",\"sort\":\"alphabetical-asc\",\"type\":\"query\",\"useTimeFilter\":true},{\"current\":[\"go\",\"python\",\"dotnet\",\"java\",\"php\",\"ruby\"],\"dataset\":{\"displayName\":\"Log Dataset - Local Cluster\",\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"schemaMappings\":{\"otelLogs\":{\"serviceName\":\"resource.attributes.service.name\",\"spanId\":\"spanId\",\"timestamp\":\"time\",\"traceId\":\"traceId\"}},\"signalType\":\"logs\",\"timeFieldName\":\"time\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\"},\"id\":\"38fedafd-7384-4519-a91d-145408f320fe\",\"includeAll\":true,\"label\":\"SDK Language\",\"language\":\"PPL\",\"multi\":true,\"name\":\"env\",\"query\":\"| fields resource.attributes.telemetry.sdk.language\",\"sort\":\"disabled\",\"type\":\"query\",\"useTimeFilter\":true}]}", "version": 1}, "id": "315a6cb0-54a6-11f1-bef9-a3498e74ec27", "migrationVersion": {"dashboard": "7.9.3"}, "references": [{"id": "b8c5dd50-5547-11f1-996b-17cae04f3529", "name": "panel_0", "type": "explore"}, {"id": "77d89b10-5543-11f1-af90-3fdb95669bd2", "name": "panel_1", "type": "explore"}, {"id": "62fc0030-5546-11f1-996b-17cae04f3529", "name": "panel_2", "type": "explore"}, {"id": "32faabc0-5541-11f1-996b-17cae04f3529", "name": "panel_3", "type": "explore"}, {"id": "63f64d70-5540-11f1-996b-17cae04f3529", "name": "panel_4", "type": "explore"}, {"id": "81d15090-554c-11f1-996b-17cae04f3529", "name": "panel_5", "type": "explore"}, {"id": "053de060-554d-11f1-af90-3fdb95669bd2", "name": "panel_6", "type": "explore"}, {"id": "6d9a5670-554d-11f1-996b-17cae04f3529", "name": "panel_7", "type": "explore"}, {"id": "2a016710-5547-11f1-996b-17cae04f3529", "name": "panel_8", "type": "explore"}, {"id": "68350460-5547-11f1-af90-3fdb95669bd2", "name": "panel_9", "type": "explore"}, {"id": "bcdc8190-5548-11f1-996b-17cae04f3529", "name": "panel_10", "type": "explore"}, {"id": "a6f24840-5540-11f1-996b-17cae04f3529", "name": "panel_11", "type": "explore"}], "type": "dashboard", "updated_at": "2026-08-06T03:40:01.425Z", "version": "WzI5OSwxXQ==", "workspaces": ["JvWKe1"]} diff --git a/docker-compose/opensearch-dashboards/init/dashboard-astronomy-shop.ndjson b/docker-compose/opensearch-dashboards/init/dashboard-astronomy-shop.ndjson index 321a6882..4a139480 100644 --- a/docker-compose/opensearch-dashboards/init/dashboard-astronomy-shop.ndjson +++ b/docker-compose/opensearch-dashboards/init/dashboard-astronomy-shop.ndjson @@ -2,17 +2,15 @@ {"attributes":{"displayName":"Log Dataset - Local Cluster","fields":"[{\"count\":0,\"name\":\"@timestamp\",\"type\":\"date\",\"esTypes\":[\"date_nanos\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"body\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"droppedAttributesCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"flags\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.droppedAttributesCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.schemaUrl\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.version\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"resource.droppedAttributesCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"resource.schemaUrl\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"severity.number\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"severity.text\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"spanId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"time\",\"type\":\"date\",\"esTypes\":[\"date_nanos\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"traceId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","schemaMappings":"{\"otelLogs\":{\"timestamp\":\"time\",\"traceId\":\"traceId\",\"spanId\":\"spanId\",\"serviceName\":\"resource.attributes.service.name\"}}","signalType":"logs","timeFieldName":"time","title":"logs-otel-v1*"},"id":"545c7990-2938-11f1-84ad-e734b5ac5a91","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2026-03-31T21:55:52.259Z","version":"WzE0NCwyXQ==","workspaces":["HHg9QO"]} {"attributes":{"columns":["body","severityText","resource.attributes.service.name"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"source = `logs-otel-v1*` Charge request received | where `resource.attributes.service.name` = 'payment' | stats avg(attributes.request.amount.units.low) as `Avg amount charged` by span(time , 5m)\",\"language\":\"PPL\",\"dataset\":{\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\",\"timeFieldName\":\"time\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Avg amount charged ","type":"logs","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"metric\",\"params\":{\"showTitle\":true,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"mean\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value_and_name\",\"colorMode\":\"background_solid\"},\"axesMapping\":{\"value\":\"Avg amount charged\",\"time\":\"span(time,5m)\"}}"},"id":"2264dcb0-33a2-11f1-9d6d-13a798173373","references":[{"id":"545c7990-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-08T23:24:47.995Z","version":"WzI3Nyw2XQ==","workspaces":["HHg9QO"]} {"attributes":{"columns":["body","severityText","resource.attributes.service.name"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"source = `logs-otel-v1*` AddItemAsync | where `resource.attributes.service.name` = 'cart' | stats count() as `Items added to cart` by span(time, 5m) \",\"language\":\"PPL\",\"dataset\":{\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\",\"timeFieldName\":\"time\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Items added to cart ","type":"logs","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"metric\",\"params\":{\"showTitle\":true,\"title\":\"\",\"showPercentage\":true,\"percentageColor\":\"standard\",\"valueCalculation\":\"total\",\"thresholdOptions\":{\"baseColor\":\"#06c06f\",\"thresholds\":[]},\"useThresholdColor\":true,\"textMode\":\"value_and_name\",\"colorMode\":\"background_solid\"},\"axesMapping\":{\"value\":\"Items added to cart\",\"time\":\"span(time,5m)\"}}"},"id":"8ab3b3a0-33a1-11f1-9d6d-13a798173373","references":[{"id":"545c7990-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"545c7990-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-08T23:32:35.793Z","version":"WzI4Miw2XQ==","workspaces":["HHg9QO"]} -{"attributes":{"columns":["body","severityText","resource.attributes.service.name"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"source = `logs-otel-v1*` username | WHERE `resource.attributes.service.name` = 'product-reviews' | stats count() as `Product reviews` by span(time, 5m)\",\"language\":\"PPL\",\"dataset\":{\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\",\"timeFieldName\":\"time\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Product reviews over time ","type":"logs","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"metric\",\"params\":{\"showTitle\":true,\"title\":\"\",\"showPercentage\":true,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#c67804\",\"thresholds\":[]},\"useThresholdColor\":true,\"textMode\":\"value_and_name\",\"colorMode\":\"background_solid\"},\"axesMapping\":{\"value\":\"Product reviews\",\"time\":\"span(time,5m)\"}}"},"id":"e685d330-33a0-11f1-9d6d-13a798173373","references":[{"id":"545c7990-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"545c7990-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-08T23:34:19.389Z","version":"WzI4NCw2XQ==","workspaces":["HHg9QO"]} -{"attributes":{"columns":["body","severityText","resource.attributes.service.name"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"source = `logs-otel-v1*` username | WHERE `resource.attributes.service.name` = 'product-reviews' | sort -time | head 10 | rename body as reviews| fields reviews\",\"language\":\"PPL\",\"dataset\":{\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\",\"timeFieldName\":\"time\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Lastest product reviews","type":"logs","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"table\",\"params\":{\"baseColor\":\"#000000\",\"cellTypes\":[],\"dataLinks\":[],\"footerCalculations\":[],\"globalAlignment\":\"left\",\"hiddenColumns\":[],\"pageSize\":50,\"showColumnFilter\":false,\"showFooter\":false,\"thresholds\":[],\"visibleColumns\":[]}}"},"id":"4690c500-33a1-11f1-9d6d-13a798173373","references":[{"id":"545c7990-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"545c7990-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-09T00:12:48.528Z","version":"WzMxMCw2XQ==","workspaces":["HHg9QO"]} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"dataset\":{\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"isRemoteDataset\":false,\"timeFieldName\":\"time\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\"},\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"title":"Infrastructure Metrics md","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Infrastructure Metrics md\",\"type\":\"markdown\",\"aggs\":[],\"params\":{\"fontSize\":9,\"openLinksInNewTab\":false,\"markdown\":\"#### Application & Infrastructure telemetry\"}}"},"id":"646f9250-33a5-11f1-9d6d-13a798173373","migrationVersion":{"visualization":"7.10.0"},"references":[],"type":"visualization","updated_at":"2026-04-09T00:11:16.595Z","version":"WzMwNiw2XQ==","workspaces":["HHg9QO"]} {"attributes":{"columns":["_source"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"label_replace( (1 - ( sum(fault{environment=\\\"generic:default\\\",service=\\\"frontend\\\",remoteService=\\\"\\\",namespace=\\\"span_derived\\\"}) / clamp_min(sum(request{environment=\\\"generic:default\\\",service=\\\"frontend\\\",remoteService=\\\"\\\",namespace=\\\"span_derived\\\"}), 1) )) * 100, \\\"operation\\\", \\\"overall\\\", \\\"\\\", \\\"\\\")\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"ObservabilityStack_Prometheus\",\"title\":\"ObservabilityStack_Prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"App Availability","type":"metrics","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"gauge\",\"params\":{\"showTitle\":false,\"thresholdOptions\":{\"thresholds\":[],\"baseColor\":\"#F90\"},\"title\":\"App Availability\",\"useThresholdColor\":false,\"valueCalculation\":\"mean\"},\"axesMapping\":{\"value\":\"Value\"}}"},"id":"3d952400-3423-11f1-9d6d-13a798173373","references":[{"id":"ObservabilityStack_Prometheus","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-09T17:57:28.375Z","version":"WzMyNyw2XQ==","workspaces":["HHg9QO"]} {"attributes":{"displayName":"Trace Dataset - Local Cluster","fields":"[{\"count\":0,\"name\":\"@timestamp\",\"type\":\"date\",\"esTypes\":[\"date_nanos\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"droppedAttributesCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"droppedEventsCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"droppedLinksCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"durationInNanos\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"endTime\",\"type\":\"date\",\"esTypes\":[\"date_nanos\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"events.droppedAttributesCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"nested\":{\"path\":\"events\"}}},{\"count\":0,\"name\":\"events.name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"nested\":{\"path\":\"events\"}}},{\"count\":0,\"name\":\"events.time\",\"type\":\"date\",\"esTypes\":[\"date_nanos\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"nested\":{\"path\":\"events\"}}},{\"count\":0,\"name\":\"instrumentationScope.droppedAttributesCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.schemaUrl\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.version\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"kind\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"links.droppedAttributesCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"nested\":{\"path\":\"links\"}}},{\"count\":0,\"name\":\"links.spanId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"nested\":{\"path\":\"links\"}}},{\"count\":0,\"name\":\"links.traceId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"nested\":{\"path\":\"links\"}}},{\"count\":0,\"name\":\"links.traceState\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"nested\":{\"path\":\"links\"}}},{\"count\":0,\"name\":\"name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"parentSpanId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"resource.droppedAttributesCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"resource.schemaUrl\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"serviceName\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"spanId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"startTime\",\"type\":\"date\",\"esTypes\":[\"date_nanos\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"status.code\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"status.message\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"time\",\"type\":\"date\",\"esTypes\":[\"date_nanos\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"traceGroup\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"traceGroupFields.durationInNanos\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"traceGroupFields.endTime\",\"type\":\"date\",\"esTypes\":[\"date_nanos\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"traceGroupFields.statusCode\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"traceId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"traceState\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","signalType":"traces","timeFieldName":"endTime","title":"otel-v1-apm-span*"},"id":"54f4c1f0-2938-11f1-84ad-e734b5ac5a91","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2026-03-31T21:55:54.367Z","version":"WzE0NiwyXQ==","workspaces":["HHg9QO"]} {"attributes":{"columns":["spanId","status.code","attributes.http.status_code","resource.attributes.service.name","kind","name","durationNano","durationInNanos"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"source = `otel-v1-apm-span*` | stats avg(durationInNanos/ 1000000000.0) as duration by serviceName | sort - duration | head 5\",\"language\":\"PPL\",\"dataset\":{\"id\":\"54f4c1f0-2938-11f1-84ad-e734b5ac5a91\",\"title\":\"otel-v1-apm-span*\",\"type\":\"INDEX_PATTERN\",\"timeFieldName\":\"endTime\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Slowest service API calls","type":"traces","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"bar\",\"params\":{\"addLegend\":true,\"barBorderColor\":\"#000000\",\"barBorderWidth\":1,\"barPadding\":0.1,\"barSizeMode\":\"auto\",\"barWidth\":0.7,\"bucket\":{\"aggregationType\":\"sum\",\"bucketTimeUnit\":\"auto\"},\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"showBarBorder\":false,\"showFullTimeRange\":false,\"stackMode\":\"none\",\"standardAxes\":[{\"axisRole\":\"x\",\"grid\":{\"showLines\":false},\"labels\":{\"filter\":true,\"rotate\":0,\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"show\":true,\"title\":{\"text\":\"\"}}],\"switchAxes\":true,\"thresholdOptions\":{\"baseColor\":\"#F90\",\"thresholds\":[],\"thresholdStyle\":\"off\"},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"useThresholdColor\":true},\"axesMapping\":{\"x\":\"serviceName\",\"y\":\"duration\"}}"},"id":"a191ee10-33a2-11f1-9d6d-13a798173373","references":[{"id":"54f4c1f0-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"54f4c1f0-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-08T23:46:43.855Z","version":"WzI5NCw2XQ==","workspaces":["HHg9QO"]} {"attributes":{"columns":["spanId","status.code","attributes.http.status_code","resource.attributes.service.name","kind","name","durationNano","durationInNanos"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"source = `otel-v1-apm-span*` | WHERE `status.code` = 2 | sort -startTime | head 20 | fields serviceName, name, kind \",\"language\":\"PPL\",\"dataset\":{\"id\":\"54f4c1f0-2938-11f1-84ad-e734b5ac5a91\",\"title\":\"otel-v1-apm-span*\",\"type\":\"INDEX_PATTERN\",\"timeFieldName\":\"endTime\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Live Application API calls","type":"traces","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"table\",\"params\":{\"baseColor\":\"#000000\",\"cellTypes\":[],\"dataLinks\":[],\"footerCalculations\":[],\"globalAlignment\":\"left\",\"hiddenColumns\":[],\"pageSize\":50,\"showColumnFilter\":false,\"showFooter\":false,\"thresholds\":[],\"visibleColumns\":[]}}"},"id":"de9faef0-3424-11f1-9d6d-13a798173373","references":[{"id":"54f4c1f0-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-09T15:00:38.366Z","version":"WzMyMiw2XQ==","workspaces":["HHg9QO"]} -{"attributes":{"columns":["_source"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\" label_replace(\\n (\\n sum(rate(db_client_operation_npgsql_bytes_read_total[5m]))\\n /\\n clamp_min(\\n sum(rate(db_client_operation_npgsql_bytes_written_total[5m])),\\n 1\\n )\\n ),\\n \\\"metric\\\", \\\"read_write_ratio\\\", \\\"\\\", \\\"\\\"\\n )\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"ObservabilityStack_Prometheus\",\"title\":\"ObservabilityStack_Prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Product catalog throughput","type":"metrics","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"legendTitle\":\"\",\"legendPosition\":\"bottom\",\"addTimeMarker\":false,\"lineStyle\":\"line\",\"lineMode\":\"stepped\",\"lineWidth\":2,\"tooltipOptions\":{\"mode\":\"all\"},\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[],\"thresholdStyle\":\"off\"},\"standardAxes\":[{\"position\":\"bottom\",\"show\":true,\"labels\":{\"show\":true,\"filter\":true,\"rotate\":0,\"truncate\":100},\"title\":{\"text\":\"\"},\"grid\":{\"showLines\":false},\"axisRole\":\"x\"},{\"position\":\"left\",\"show\":true,\"labels\":{\"show\":true,\"filter\":true,\"rotate\":0,\"truncate\":100},\"title\":{\"text\":\"\"},\"grid\":{\"showLines\":false},\"axisRole\":\"y\"}],\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"showFullTimeRange\":false},\"axesMapping\":{\"x\":\"Time\",\"y\":\"Value\",\"color\":\"Series\"}}"},"id":"545a8e70-33a4-11f1-9d6d-13a798173373","references":[{"id":"ObservabilityStack_Prometheus","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-08T23:40:30.807Z","version":"WzI4OSw2XQ==","workspaces":["HHg9QO"]} +{"attributes":{"columns":["_source"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\" label_replace(\\n sum(rate(db_client_operation_duration_seconds_count[5m])),\\n \\\"metric\\\", \\\"operations_per_second\\\", \\\"\\\", \\\"\\\"\\n )\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"ObservabilityStack_Prometheus\",\"title\":\"ObservabilityStack_Prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Product catalog throughput","type":"metrics","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"legendTitle\":\"\",\"legendPosition\":\"bottom\",\"addTimeMarker\":false,\"lineStyle\":\"line\",\"lineMode\":\"stepped\",\"lineWidth\":2,\"tooltipOptions\":{\"mode\":\"all\"},\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[],\"thresholdStyle\":\"off\"},\"standardAxes\":[{\"position\":\"bottom\",\"show\":true,\"labels\":{\"show\":true,\"filter\":true,\"rotate\":0,\"truncate\":100},\"title\":{\"text\":\"\"},\"grid\":{\"showLines\":false},\"axisRole\":\"x\"},{\"position\":\"left\",\"show\":true,\"labels\":{\"show\":true,\"filter\":true,\"rotate\":0,\"truncate\":100},\"title\":{\"text\":\"\"},\"grid\":{\"showLines\":false},\"axisRole\":\"y\"}],\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"showFullTimeRange\":false},\"axesMapping\":{\"x\":\"Time\",\"y\":\"Value\",\"color\":\"Series\"}}"},"id":"545a8e70-33a4-11f1-9d6d-13a798173373","references":[{"id":"ObservabilityStack_Prometheus","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-08T23:40:30.807Z","version":"WzI4OSw2XQ==","workspaces":["HHg9QO"]} {"attributes":{"columns":["spanId","status.code","attributes.http.status_code","resource.attributes.service.name","kind","name","durationNano","durationInNanos"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"source = `otel-v1-apm-span*` | WHERE ISNOTNULL(`attributes.http.status_code`) | where `resource.attributes.service.name` = 'frontend' | stats count() by attributes.http.status_code, kind\",\"language\":\"PPL\",\"dataset\":{\"id\":\"54f4c1f0-2938-11f1-84ad-e734b5ac5a91\",\"title\":\"otel-v1-apm-span*\",\"type\":\"INDEX_PATTERN\",\"timeFieldName\":\"endTime\"},\"format\":\"jdbc\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Frontend requests count by status code","type":"traces","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"pie\",\"params\":{\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"tooltipOptions\":{\"mode\":\"all\"},\"exclusive\":{\"donut\":true,\"showValues\":false,\"showLabels\":false,\"truncate\":100},\"titleOptions\":{\"show\":false,\"titleName\":\"\"}},\"axesMapping\":{\"size\":\"count()\",\"color\":\"attributes.http.status_code\"}}"},"id":"435afee0-3424-11f1-9d6d-13a798173373","references":[{"id":"54f4c1f0-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-09T14:56:17.870Z","version":"WzMxOSw2XQ==","workspaces":["HHg9QO"]} {"attributes":{"columns":["_source"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"topk(3, sum by (service) (fault{remoteService=\\\"\\\",namespace=\\\"span_derived\\\"}) / clamp_min(sum by (service) (request{remoteService=\\\"\\\",namespace=\\\"span_derived\\\"}), 1) * 100) \",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"ObservabilityStack_Prometheus\",\"title\":\"ObservabilityStack_Prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Services with high fault rate (5xx)","type":"metrics","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"area\",\"params\":{\"addLegend\":true,\"legendTitle\":\"\",\"legendPosition\":\"bottom\",\"addTimeMarker\":false,\"tooltipOptions\":{\"mode\":\"all\"},\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[],\"thresholdStyle\":\"off\"},\"standardAxes\":[{\"position\":\"bottom\",\"show\":true,\"labels\":{\"show\":true,\"filter\":true,\"rotate\":0,\"truncate\":100},\"title\":{\"text\":\"\"},\"grid\":{\"showLines\":false},\"axisRole\":\"x\"},{\"position\":\"left\",\"show\":true,\"labels\":{\"show\":true,\"filter\":true,\"rotate\":0,\"truncate\":100},\"title\":{\"text\":\"\"},\"grid\":{\"showLines\":false},\"axisRole\":\"y\"}],\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"showFullTimeRange\":false},\"axesMapping\":{\"x\":\"Time\",\"y\":\"Value\",\"color\":\"Series\"}}"},"id":"d5fd52f0-3421-11f1-9d6d-13a798173373","references":[{"id":"ObservabilityStack_Prometheus","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-09T14:38:55.391Z","version":"WzMxMiw2XQ==","workspaces":["HHg9QO"]} {"attributes":{"columns":["body","severityText","resource.attributes.service.name"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"source = `logs-otel-v1*` | where resource.attributes.service.name = \\\"frontend-proxy\\\"\\n| where body != ''\\n| rex field=body 'HTTP/1.1\\\" (?\\\\d{3})'\\n| eval status_class = case( httpstatus >= '200' and httpstatus < '300', 'HTTP 2xx', httpstatus >= '300' and httpstatus < '400', 'HTTP 3xx', httpstatus >= '400' and httpstatus < '500', 'HTTP 4xx', httpstatus >= '500' and httpstatus < '600', 'HTTP 5xx', httpstatus >= '600', 'Other', true, 'Unknown' )\\n| stats count() as `Request Count` by `attributes.url.path`, status_class\",\"language\":\"PPL\",\"dataset\":{\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\",\"timeFieldName\":\"time\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Frontend proxy request distribution","type":"logs","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"bar\",\"params\":{\"switchAxes\":false,\"addLegend\":true,\"legendTitle\":\"\",\"legendPosition\":\"bottom\",\"tooltipOptions\":{\"mode\":\"all\"},\"barSizeMode\":\"auto\",\"barWidth\":0.7,\"barPadding\":0.1,\"showBarBorder\":false,\"barBorderWidth\":1,\"barBorderColor\":\"#000000\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[],\"thresholdStyle\":\"off\"},\"useThresholdColor\":false,\"standardAxes\":[{\"position\":\"bottom\",\"show\":true,\"labels\":{\"show\":true,\"filter\":true,\"rotate\":0,\"truncate\":100},\"title\":{\"text\":\"\"},\"grid\":{\"showLines\":false},\"axisRole\":\"x\"}],\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"bucket\":{\"aggregationType\":\"sum\",\"bucketTimeUnit\":\"auto\"},\"showFullTimeRange\":false,\"stackMode\":\"total\"},\"axesMapping\":{\"x\":\"status_class\",\"y\":\"Request Count\",\"color\":\"attributes.url.path\"}}"},"id":"73417650-343f-11f1-9d6d-13a798173373","references":[{"id":"545c7990-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-09T18:10:54.645Z","version":"WzMzMiw2XQ==","workspaces":["HHg9QO"]} {"attributes":{"columns":["body","severityText","resource.attributes.service.name"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"source = `logs-otel-v1*` ERROR | sort -time | head 20 | fields time, resource.attributes.service.name, body, `severityText`\",\"language\":\"PPL\",\"dataset\":{\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\",\"timeFieldName\":\"time\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Application error logs across services","type":"logs","uiState":"{\"activeTab\":\"explore_visualization_tab\"}","version":1,"visualization":"{\"title\":\"\",\"chartType\":\"table\",\"params\":{\"baseColor\":\"#000000\",\"cellTypes\":[],\"dataLinks\":[],\"footerCalculations\":[],\"globalAlignment\":\"left\",\"hiddenColumns\":[],\"pageSize\":50,\"showColumnFilter\":false,\"showFooter\":false,\"thresholds\":[],\"visibleColumns\":[]}}"},"id":"1274b090-343e-11f1-9d6d-13a798173373","references":[{"id":"545c7990-2938-11f1-84ad-e734b5ac5a91","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"explore","updated_at":"2026-04-09T18:01:02.745Z","version":"WzMyOCw2XQ==","workspaces":["HHg9QO"]} -{"attributes":{"description":"The dashboard was created from explore","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"dataset\":{\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"isRemoteDataset\":false,\"timeFieldName\":\"time\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\"},\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":0,\"w\":48,\"h\":2,\"i\":\"80040f1f-0358-4e1b-ba6d-be3f1dd87720\"},\"panelIndex\":\"80040f1f-0358-4e1b-ba6d-be3f1dd87720\",\"embeddableConfig\":{\"hidePanelTitles\":true},\"panelRefName\":\"panel_0\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":2,\"w\":10,\"h\":10,\"i\":\"a99164a5-d4c3-450f-a293-c347a68713b8\"},\"panelIndex\":\"a99164a5-d4c3-450f-a293-c347a68713b8\",\"embeddableConfig\":{},\"panelRefName\":\"panel_1\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":10,\"y\":2,\"w\":11,\"h\":10,\"i\":\"24785066-74ff-4919-b51b-f594aa93dba4\"},\"panelIndex\":\"24785066-74ff-4919-b51b-f594aa93dba4\",\"embeddableConfig\":{},\"panelRefName\":\"panel_2\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":21,\"y\":2,\"w\":11,\"h\":10,\"i\":\"d81ac2fd-57b4-4405-871f-aff42bf3561c\"},\"panelIndex\":\"d81ac2fd-57b4-4405-871f-aff42bf3561c\",\"embeddableConfig\":{},\"panelRefName\":\"panel_3\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":32,\"y\":2,\"w\":16,\"h\":10,\"i\":\"ae46d146-5ec1-479e-a120-840cad06dd1d\"},\"panelIndex\":\"ae46d146-5ec1-479e-a120-840cad06dd1d\",\"embeddableConfig\":{},\"panelRefName\":\"panel_4\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":12,\"w\":48,\"h\":2,\"i\":\"01870991-0209-4a2f-8756-fc32bb3bc3fc\"},\"panelIndex\":\"01870991-0209-4a2f-8756-fc32bb3bc3fc\",\"embeddableConfig\":{\"hidePanelTitles\":true},\"panelRefName\":\"panel_5\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":14,\"w\":11,\"h\":9,\"i\":\"1f6b0f21-40e3-42e8-8e97-b34b63fadfce\"},\"panelIndex\":\"1f6b0f21-40e3-42e8-8e97-b34b63fadfce\",\"embeddableConfig\":{},\"panelRefName\":\"panel_6\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":11,\"y\":14,\"w\":15,\"h\":9,\"i\":\"149c220c-2b91-4d99-b6bd-de9620fe11c2\"},\"panelIndex\":\"149c220c-2b91-4d99-b6bd-de9620fe11c2\",\"embeddableConfig\":{},\"panelRefName\":\"panel_7\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":26,\"y\":14,\"w\":22,\"h\":9,\"i\":\"19785ef3-8f5f-47b3-a3ad-f1bd4b2393c0\"},\"panelIndex\":\"19785ef3-8f5f-47b3-a3ad-f1bd4b2393c0\",\"embeddableConfig\":{\"hidePanelTitles\":false},\"panelRefName\":\"panel_8\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":23,\"w\":11,\"h\":9,\"i\":\"e25c7cd7-80a0-40dd-80ab-b802051e2bd1\"},\"panelIndex\":\"e25c7cd7-80a0-40dd-80ab-b802051e2bd1\",\"embeddableConfig\":{},\"panelRefName\":\"panel_9\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":11,\"y\":23,\"w\":12,\"h\":9,\"i\":\"4e24bea0-b420-4443-9f26-c913d7208c72\"},\"panelIndex\":\"4e24bea0-b420-4443-9f26-c913d7208c72\",\"embeddableConfig\":{},\"panelRefName\":\"panel_10\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":23,\"y\":23,\"w\":25,\"h\":9,\"i\":\"38c044e2-aeb0-4556-a616-3e12cbcb283c\"},\"panelIndex\":\"38c044e2-aeb0-4556-a616-3e12cbcb283c\",\"embeddableConfig\":{},\"panelRefName\":\"panel_11\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":32,\"w\":24,\"h\":11,\"i\":\"afabea76-2b89-4201-9561-f496ed81b9d1\"},\"panelIndex\":\"afabea76-2b89-4201-9561-f496ed81b9d1\",\"embeddableConfig\":{},\"panelRefName\":\"panel_12\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":24,\"y\":32,\"w\":24,\"h\":11,\"i\":\"23f6bea7-42ea-4f94-97cb-164b94631a23\"},\"panelIndex\":\"23f6bea7-42ea-4f94-97cb-164b94631a23\",\"embeddableConfig\":{},\"panelRefName\":\"panel_13\"}]","refreshInterval":{"pause":true,"value":0},"timeFrom":"now-24h","timeRestore":true,"timeTo":"now","title":"Astronomy Shop","version":1},"id":"e6e04f40-33a0-11f1-9d6d-13a798173373","migrationVersion":{"dashboard":"7.9.3"},"references":[{"id":"b0a4c430-33a3-11f1-9d6d-13a798173373","name":"panel_0","type":"visualization"},{"id":"2264dcb0-33a2-11f1-9d6d-13a798173373","name":"panel_1","type":"explore"},{"id":"8ab3b3a0-33a1-11f1-9d6d-13a798173373","name":"panel_2","type":"explore"},{"id":"e685d330-33a0-11f1-9d6d-13a798173373","name":"panel_3","type":"explore"},{"id":"4690c500-33a1-11f1-9d6d-13a798173373","name":"panel_4","type":"explore"},{"id":"646f9250-33a5-11f1-9d6d-13a798173373","name":"panel_5","type":"visualization"},{"id":"3d952400-3423-11f1-9d6d-13a798173373","name":"panel_6","type":"explore"},{"id":"a191ee10-33a2-11f1-9d6d-13a798173373","name":"panel_7","type":"explore"},{"id":"de9faef0-3424-11f1-9d6d-13a798173373","name":"panel_8","type":"explore"},{"id":"545a8e70-33a4-11f1-9d6d-13a798173373","name":"panel_9","type":"explore"},{"id":"435afee0-3424-11f1-9d6d-13a798173373","name":"panel_10","type":"explore"},{"id":"d5fd52f0-3421-11f1-9d6d-13a798173373","name":"panel_11","type":"explore"},{"id":"73417650-343f-11f1-9d6d-13a798173373","name":"panel_12","type":"explore"},{"id":"1274b090-343e-11f1-9d6d-13a798173373","name":"panel_13","type":"explore"}],"type":"dashboard","updated_at":"2026-04-09T18:12:30.095Z","version":"WzMzNCw2XQ==","workspaces":["HHg9QO"]} -{"exportedCount":17,"missingRefCount":1,"missingReferences":[{"id":"ObservabilityStack_Prometheus","type":"index-pattern"}]} \ No newline at end of file +{"attributes":{"description":"The dashboard was created from explore","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"dataset\":{\"id\":\"545c7990-2938-11f1-84ad-e734b5ac5a91\",\"isRemoteDataset\":false,\"timeFieldName\":\"time\",\"title\":\"logs-otel-v1*\",\"type\":\"INDEX_PATTERN\"},\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":0,\"w\":48,\"h\":2,\"i\":\"80040f1f-0358-4e1b-ba6d-be3f1dd87720\"},\"panelIndex\":\"80040f1f-0358-4e1b-ba6d-be3f1dd87720\",\"embeddableConfig\":{\"hidePanelTitles\":true},\"panelRefName\":\"panel_0\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":2,\"w\":10,\"h\":10,\"i\":\"a99164a5-d4c3-450f-a293-c347a68713b8\"},\"panelIndex\":\"a99164a5-d4c3-450f-a293-c347a68713b8\",\"embeddableConfig\":{},\"panelRefName\":\"panel_1\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":10,\"y\":2,\"w\":11,\"h\":10,\"i\":\"24785066-74ff-4919-b51b-f594aa93dba4\"},\"panelIndex\":\"24785066-74ff-4919-b51b-f594aa93dba4\",\"embeddableConfig\":{},\"panelRefName\":\"panel_2\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":12,\"w\":48,\"h\":2,\"i\":\"01870991-0209-4a2f-8756-fc32bb3bc3fc\"},\"panelIndex\":\"01870991-0209-4a2f-8756-fc32bb3bc3fc\",\"embeddableConfig\":{\"hidePanelTitles\":true},\"panelRefName\":\"panel_5\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":14,\"w\":11,\"h\":9,\"i\":\"1f6b0f21-40e3-42e8-8e97-b34b63fadfce\"},\"panelIndex\":\"1f6b0f21-40e3-42e8-8e97-b34b63fadfce\",\"embeddableConfig\":{},\"panelRefName\":\"panel_6\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":11,\"y\":14,\"w\":15,\"h\":9,\"i\":\"149c220c-2b91-4d99-b6bd-de9620fe11c2\"},\"panelIndex\":\"149c220c-2b91-4d99-b6bd-de9620fe11c2\",\"embeddableConfig\":{},\"panelRefName\":\"panel_7\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":26,\"y\":14,\"w\":22,\"h\":9,\"i\":\"19785ef3-8f5f-47b3-a3ad-f1bd4b2393c0\"},\"panelIndex\":\"19785ef3-8f5f-47b3-a3ad-f1bd4b2393c0\",\"embeddableConfig\":{\"hidePanelTitles\":false},\"panelRefName\":\"panel_8\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":23,\"w\":11,\"h\":9,\"i\":\"e25c7cd7-80a0-40dd-80ab-b802051e2bd1\"},\"panelIndex\":\"e25c7cd7-80a0-40dd-80ab-b802051e2bd1\",\"embeddableConfig\":{},\"panelRefName\":\"panel_9\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":11,\"y\":23,\"w\":12,\"h\":9,\"i\":\"4e24bea0-b420-4443-9f26-c913d7208c72\"},\"panelIndex\":\"4e24bea0-b420-4443-9f26-c913d7208c72\",\"embeddableConfig\":{},\"panelRefName\":\"panel_10\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":23,\"y\":23,\"w\":25,\"h\":9,\"i\":\"38c044e2-aeb0-4556-a616-3e12cbcb283c\"},\"panelIndex\":\"38c044e2-aeb0-4556-a616-3e12cbcb283c\",\"embeddableConfig\":{},\"panelRefName\":\"panel_11\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":32,\"w\":24,\"h\":11,\"i\":\"afabea76-2b89-4201-9561-f496ed81b9d1\"},\"panelIndex\":\"afabea76-2b89-4201-9561-f496ed81b9d1\",\"embeddableConfig\":{},\"panelRefName\":\"panel_12\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":24,\"y\":32,\"w\":24,\"h\":11,\"i\":\"23f6bea7-42ea-4f94-97cb-164b94631a23\"},\"panelIndex\":\"23f6bea7-42ea-4f94-97cb-164b94631a23\",\"embeddableConfig\":{},\"panelRefName\":\"panel_13\"}]","refreshInterval":{"pause":true,"value":0},"timeFrom":"now-24h","timeRestore":true,"timeTo":"now","title":"Astronomy Shop","version":1},"id":"e6e04f40-33a0-11f1-9d6d-13a798173373","migrationVersion":{"dashboard":"7.9.3"},"references":[{"id":"b0a4c430-33a3-11f1-9d6d-13a798173373","name":"panel_0","type":"visualization"},{"id":"2264dcb0-33a2-11f1-9d6d-13a798173373","name":"panel_1","type":"explore"},{"id":"8ab3b3a0-33a1-11f1-9d6d-13a798173373","name":"panel_2","type":"explore"},{"id":"646f9250-33a5-11f1-9d6d-13a798173373","name":"panel_5","type":"visualization"},{"id":"3d952400-3423-11f1-9d6d-13a798173373","name":"panel_6","type":"explore"},{"id":"a191ee10-33a2-11f1-9d6d-13a798173373","name":"panel_7","type":"explore"},{"id":"de9faef0-3424-11f1-9d6d-13a798173373","name":"panel_8","type":"explore"},{"id":"545a8e70-33a4-11f1-9d6d-13a798173373","name":"panel_9","type":"explore"},{"id":"435afee0-3424-11f1-9d6d-13a798173373","name":"panel_10","type":"explore"},{"id":"d5fd52f0-3421-11f1-9d6d-13a798173373","name":"panel_11","type":"explore"},{"id":"73417650-343f-11f1-9d6d-13a798173373","name":"panel_12","type":"explore"},{"id":"1274b090-343e-11f1-9d6d-13a798173373","name":"panel_13","type":"explore"}],"type":"dashboard","updated_at":"2026-04-09T18:12:30.095Z","version":"WzMzNCw2XQ==","workspaces":["HHg9QO"]} +{"exportedCount":15,"missingRefCount":1,"missingReferences":[{"id":"ObservabilityStack_Prometheus","type":"index-pattern"}]} diff --git a/docker-compose/opentelemetry-demo/src/flagd/demo.flagd.json b/docker-compose/opentelemetry-demo/src/flagd/demo.flagd.json index 44864130..80a4fbc1 100644 --- a/docker-compose/opentelemetry-demo/src/flagd/demo.flagd.json +++ b/docker-compose/opentelemetry-demo/src/flagd/demo.flagd.json @@ -1,151 +1,172 @@ { "$schema": "https://flagd.dev/schema/v0/flags.json", "flags": { - "llmInaccurateResponse": { + "adFailure": { "defaultVariant": "off", - "description": "LLM returns an inaccurate product summary for product ID L9ECAV7KIM", + "description": "Fail ad service", "state": "ENABLED", "variants": { "off": false, "on": true } }, - "llmRateLimitError": { + "adHighCpu": { "defaultVariant": "off", - "description": "LLM intermittently returns a rate limit error", + "description": "Triggers high cpu load in the ad service", "state": "ENABLED", "variants": { "off": false, "on": true } }, - "productCatalogFailure": { - "description": "Fail product catalog service on a specific product", + "adManualGc": { + "defaultVariant": "off", + "description": "Triggers full manual garbage collections in the ad service", "state": "ENABLED", "variants": { - "on": true, - "off": false - }, - "defaultVariant": "off" + "off": false, + "on": true + } }, - "recommendationCacheFailure": { - "description": "Fail recommendation service cache", + "cartFailure": { + "defaultVariant": "off", + "description": "Fail cart service n% of the time", "state": "ENABLED", "variants": { - "on": true, - "off": false - }, - "defaultVariant": "off" + "10%": 0.1, + "100%": 1, + "25%": 0.25, + "50%": 0.5, + "75%": 0.75, + "90%": 0.9, + "off": 0 + } }, - "adManualGc": { - "description": "Triggers full manual garbage collections in the ad service", + "emailMemoryLeak": { + "defaultVariant": "off", + "description": "Memory leak in the email service.", "state": "ENABLED", "variants": { - "on": true, - "off": false - }, - "defaultVariant": "off" + "10000x": 10000, + "1000x": 1000, + "100x": 100, + "10x": 10, + "1x": 1, + "off": 0 + } }, - "adHighCpu": { - "description": "Triggers high cpu load in the ad service", + "failedReadinessProbe": { + "defaultVariant": "off", + "description": "readiness probe failure for cart service", "state": "ENABLED", "variants": { - "on": true, - "off": false - }, - "defaultVariant": "off" + "off": false, + "on": true + } }, - "adFailure": { - "description": "Fail ad service", + "imageSlowLoad": { + "defaultVariant": "off", + "description": "slow loading images in the frontend", "state": "ENABLED", "variants": { - "on": true, - "off": false - }, - "defaultVariant": "off" + "10sec": 10000, + "5sec": 5000, + "off": 0 + } + }, + "intlShippingSlowdown": { + "defaultVariant": "off", + "description": "Delays international shipping responses to simulate overseas shipping delay", + "state": "ENABLED", + "variants": { + "10sec": 10, + "5sec": 5, + "off": 0 + } }, "kafkaQueueProblems": { + "defaultVariant": "off", "description": "Overloads Kafka queue while simultaneously introducing a consumer side delay leading to a lag spike", "state": "ENABLED", "variants": { - "on": 100, - "off": 0 - }, - "defaultVariant": "off" + "off": 0, + "on": 100 + } }, - "cartFailure": { - "description": "Fail cart service", + "loadGeneratorTraffic": { + "defaultVariant": "on", + "description": "Enable synthetic traffic from the load generator. Turn off to pause all load-generator scenarios.", "state": "ENABLED", "variants": { - "on": true, - "off": false - }, - "defaultVariant": "off" + "off": 0, + "on": 1 + } + }, + "loadGeneratorVUs": { + "defaultVariant": "5", + "description": "Number of concurrent virtual users the load generator's HTTP scenario runs. Changes take effect on the wrapper's next poll, restarting k6.", + "state": "ENABLED", + "variants": { + "10": 10, + "25": 25, + "5": 5, + "50": 50 + } }, "paymentFailure": { + "defaultVariant": "off", "description": "Fail payment service charge requests n%", "state": "ENABLED", "variants": { + "10%": 0.1, "100%": 1, - "90%": 0.95, - "75%": 0.75, - "50%": 0.5, "25%": 0.25, - "10%": 0.1, + "50%": 0.5, + "75%": 0.75, + "90%": 0.95, "off": 0 - }, - "defaultVariant": "off" + } }, "paymentUnreachable": { + "defaultVariant": "off", "description": "Payment service is unavailable", "state": "ENABLED", "variants": { - "on": true, - "off": false - }, - "defaultVariant": "off" - }, - "loadGeneratorFloodHomepage": { - "description": "Flood the frontend with a large amount of requests.", - "state": "ENABLED", - "variants": { - "on": 100, - "off": 0 - }, - "defaultVariant": "off" + "off": false, + "on": true + } }, - "imageSlowLoad": { - "description": "slow loading images in the frontend", + "productCatalogFailure": { + "defaultVariant": "off", + "description": "Fail product catalog service on a specific product", "state": "ENABLED", - "variants": { - "10sec": 10000, - "5sec": 5000, - "off": 0 + "targeting": { + "if": [ + { + "==": [ + { + "var": "product_id" + }, + "OLJCESPC7Z" + ] + }, + "off", + "off" + ] }, - "defaultVariant": "off" - }, - "failedReadinessProbe": { - "description": "readiness probe failure for cart service", - "state": "ENABLED", "variants": { - "on": true, - "off": false - }, - "defaultVariant": "off" - + "off": false, + "on": true + } }, - "emailMemoryLeak": { - "description": "Memory leak in the email service.", + "recommendationCacheFailure": { + "defaultVariant": "off", + "description": "Fail recommendation service cache", "state": "ENABLED", "variants": { - "off": 0, - "1x": 1, - "10x": 10, - "100x": 100, - "1000x": 1000, - "10000x": 10000 - }, - "defaultVariant": "off" + "off": false, + "on": true + } } } } diff --git a/docker-compose/opentelemetry-demo/src/postgresql/init.sql b/docker-compose/opentelemetry-demo/src/postgresql/init.sql index 3cc51326..acb2b5b9 100644 --- a/docker-compose/opentelemetry-demo/src/postgresql/init.sql +++ b/docker-compose/opentelemetry-demo/src/postgresql/init.sql @@ -1,11 +1,28 @@ -- Copyright The OpenTelemetry Authors -- SPDX-License-Identifier: Apache-2.0 -CREATE USER otelu WITH PASSWORD 'otelp'; +-- Enable pg_stat_statements in the default postgres database +CREATE EXTENSION IF NOT EXISTS pg_stat_statements; + +-- Create application user +CREATE USER astronomy_user WITH PASSWORD 'astronomy_password'; + +-- Create application database +CREATE DATABASE astronomy_db OWNER astronomy_user; + +-- Create monitoring user with pg_monitor role (visibility on all databases and schemas) +CREATE USER monitoring_user WITH PASSWORD 'monitoring_password'; +GRANT pg_monitor TO monitoring_user; + +-- Switch to the application database +\connect astronomy_db + +-- Enable pg_stat_statements in the application database +CREATE EXTENSION IF NOT EXISTS pg_stat_statements; -- Accounting Service: create a schema CREATE SCHEMA accounting; -GRANT USAGE ON SCHEMA accounting TO otelu; +GRANT USAGE ON SCHEMA accounting TO astronomy_user; -- Accounting Service: create tables CREATE TABLE accounting."order" ( @@ -38,93 +55,11 @@ CREATE TABLE accounting.orderitem ( ); -- Accounting Service: grant permission to schema -GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA accounting TO otelu; - --- Product Review Service: create a schema -CREATE SCHEMA reviews; -GRANT USAGE ON SCHEMA reviews TO otelu; - --- Product Review Service: create tables -CREATE TABLE reviews.productreviews ( - id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - product_id VARCHAR(16) NOT NULL, - username VARCHAR(64) NOT NULL, - description VARCHAR(1024), - score NUMERIC(2,1) NOT NULL -); - --- Product Review Service: create index for product_id lookups -CREATE INDEX product_id_index ON reviews.productreviews (product_id); - --- Product Review Service: grant permission to schema -GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA reviews TO otelu; - --- Product Review Service: add product review data -INSERT INTO reviews.productreviews (product_id, username, description, score) -VALUES - ('OLJCESPC7Z', 'stargazer_mike', 'Great entry-level telescope! Easy to set up and provides clear views of the moon and brighter planets. Highly recommend for new astronomers.', '4.5'), - ('OLJCESPC7Z', 'nightskylover', 'For the price, this Explorascope delivers excellent performance. I was able to see Jupiter''s moons clearly. A fantastic purchase for casual viewing.', '4.0'), - ('OLJCESPC7Z', 'beginner_astro', 'A bit tricky to get used to the manual controls, but once you do, it''s very rewarding. Saw the Orion Nebula for the first time! Good value.', '3.5'), - ('OLJCESPC7Z', 'celestial_explorer', 'Perfect for camping trips. It''s lightweight and portable, making it easy to take anywhere. The views are surprisingly good for its size.', '4.0'), - ('OLJCESPC7Z', 'telescope_fan', 'Not the most powerful scope, but it''s great for kids and beginners. My children love looking at the moon with it. A solid choice for family fun.', '3.0'), - - ('66VCHSJNUP', 'tech_astro', 'The StarSense app is revolutionary! It made finding celestial objects incredibly easy. This telescope is a game-changer for beginners.', '5.0'), - ('66VCHSJNUP', 'app_user', 'Amazing technology, the smartphone integration works flawlessly. I''ve never had so much fun exploring the night sky. Worth every penny.', '4.5'), - ('66VCHSJNUP', 'innovator_john', 'Setup was a breeze, and the tutorials in the app are very helpful. The views are crisp and clear. My only minor gripe is battery drain on the phone.', '4.0'), - ('66VCHSJNUP', 'clear_skies', 'Finally, a telescope that takes the guesswork out of stargazing. The real-time positioning is incredibly accurate. Highly recommended for anyone new to astronomy.', '5.0'), - ('66VCHSJNUP', 'gadget_geek', 'Fantastic product, the app truly guides you. It''s like having a personal astronomer with you. The optical quality is also very good.', '4.5'), - - ('1YMWWN1N4O', 'solar_viewer', 'Perfect for solar observations! The Solar Safe filter gives peace of mind. I used it for the last partial eclipse and it was fantastic.', '5.0'), - ('1YMWWN1N4O', 'eclipse_chaser', 'Compact and easy to carry, this telescope is ideal for eclipse events. The included backpack is a nice touch. Views of the sun are incredibly clear and safe.', '4.5'), - ('1YMWWN1N4O', 'travel_astro', 'Excellent travel scope for solar viewing. The magnification is much better than binoculars for the sun. A must-have for any solar enthusiast.', '4.0'), - ('1YMWWN1N4O', 'sun_gazer', 'Very impressed with the safety features and clarity. Sharing the sun with family has never been easier or safer. Great value for a dedicated solar scope.', '5.0'), - ('1YMWWN1N4O', 'safe_viewer', 'The ISO compliant filter is reassuring. It''s a well-designed product for safe solar observation. Highly recommend for educational purposes too.', '4.5'), - - ('L9ECAV7KIM', 'clean_optics', 'This kit is a lifesaver for all my optics. The brush and wipes work perfectly without leaving any residue. My lenses have never been cleaner.', '5.0'), - ('L9ECAV7KIM', 'photog_pro', 'Essential for any photographer or telescope owner. It safely removes dust and fingerprints. A high-quality cleaning solution.', '4.5'), - ('L9ECAV7KIM', 'daily_cleaner', 'I use this on my binoculars, camera lenses, and even my phone screen. It''s very effective and gentle. A versatile cleaning kit.', '4.0'), - ('L9ECAV7KIM', 'tech_maintenance', 'Great value for money. The different cleaning options cover all needs. Keeps my expensive equipment in pristine condition.', '5.0'), - ('L9ECAV7KIM', 'sharp_view', 'Works as advertised, my telescope views are much clearer after using this. The fluid and cloth are excellent. Definitely recommend.', '4.5'), - - ('2ZYFJ3GM2N', 'bird_watcher', 'Incredible clarity and brightness, perfect for bird watching. The ED glass really makes a difference. I can spot the subtlest markings.', '5.0'), - ('2ZYFJ3GM2N', 'nature_lover', 'These binoculars are fantastic for nature observation. The close focus is a huge advantage for viewing nearby wildlife. Very comfortable to hold.', '4.5'), - ('2ZYFJ3GM2N', 'hiker_guy', 'Lightweight and durable, these are my go-to binoculars for hiking. The wide field of view is excellent. Highly recommend for outdoor enthusiasts.', '4.0'), - ('2ZYFJ3GM2N', 'stadium_fan', 'Took these to a game and had an amazing view of the action. They perform great in various lighting conditions. A solid all-around binocular.', '4.0'), - ('2ZYFJ3GM2N', 'outdoor_adventurer', 'Excellent build quality and optical performance. They feel robust and provide sharp images. A great investment for any outdoor activity.', '4.5'), - - ('0PUK6V6EV0', 'astro_photog', 'This imager is a fantastic step up for planetary photography. The color quality is superb. Easy to use with my existing telescope setup.', '5.0'), - ('0PUK6V6EV0', 'planet_shooter', 'Finally capturing stunning images of Saturn and Jupiter! The NexImage 10 makes it so accessible. Great for beginners in astrophotography.', '4.5'), - ('0PUK6V6EV0', 'imager_pro', 'Excellent resolution and color rendition for its price point. It''s a perfect solution for those looking to start imaging planets. Highly satisfied.', '4.0'), - ('0PUK6V6EV0', 'space_artist', 'The detail I can capture with this imager is incredible. It integrates well with various software. A must-have for serious planetary observers.', '5.0'), - ('0PUK6V6EV0', 'digital_sky', 'A solid choice for getting into solar system imaging. The setup was straightforward. Produces beautiful, vibrant planetary images.', '4.5'), - - ('LS4PSXUNUM', 'night_walker', 'The red light is perfect for preserving night vision during astronomy sessions. The hand warmer is an unexpected bonus. Very practical device.', '5.0'), - ('LS4PSXUNUM', 'star_party_goer', 'This flashlight is indispensable for star parties. The red mode is gentle on the eyes, and the power bank feature is super handy. Love it!', '4.5'), - ('LS4PSXUNUM', 'camper_chris', 'Rugged and versatile, this flashlight is great for camping and night walks. The hand warmer function is a game-changer on cold nights. Highly recommend.', '4.5'), - ('LS4PSXUNUM', 'emergency_kit', 'A fantastic multi-tool for my emergency kit. The red light is useful, and the power bank means I can charge my phone. Great design.', '4.0'), - ('LS4PSXUNUM', 'astro_accessory', 'Every astronomer needs one of these. The red light is essential, and the hand warmer and power bank make it incredibly useful. A top-tier accessory.', '5.0'), - - ('9SIQT8TOJO', 'deep_sky_master', 'The RASA V2 is a dream come true for deep-sky imaging. The f/2.2 speed drastically cuts down exposure times. My best astrophotography investment yet.', '5.0'), - ('9SIQT8TOJO', 'pro_astro', 'Unbelievable performance for wide-field astrophotography. The short focal length makes guiding less critical. Produces stunning, detailed images.', '5.0'), - ('9SIQT8TOJO', 'imaging_guru', 'This OTA is a beast! The fast optics mean more data in less time. If you''re serious about deep-sky imaging, this is the one.', '4.5'), - ('9SIQT8TOJO', 'advanced_scope', 'Worth every penny for the quality and speed it offers. My images have never been sharper or more vibrant. A truly professional piece of equipment.', '5.0'), - ('9SIQT8TOJO', 'precision_optics', 'The engineering behind this RASA is exceptional. It''s incredibly efficient for capturing faint objects. A high-end choice for dedicated imagers.', '4.5'), - - ('6E92ZMYYFZ', 'solar_safety', 'Essential for safe solar viewing with my 8-inch telescope. The Velcro straps ensure it stays securely in place. Peace of mind during solar observations.', '5.0'), - ('6E92ZMYYFZ', 'telescope_upgrade', 'This EclipSmart filter is a perfect addition to my setup. The ISO compliance is crucial. Highly recommend for anyone looking to view the sun safely.', '4.5'), - ('6E92ZMYYFZ', 'safe_sun_gazer', 'Easy to attach and provides crystal clear, safe views of the sun. The build quality is excellent. A must-have accessory for solar enthusiasts.', '5.0'), - ('6E92ZMYYFZ', 'filter_fan', 'Works perfectly with my 8-inch scope. No more worries about accidental dislodgement. Great product for protecting your eyes and equipment.', '4.5'), - ('6E92ZMYYFZ', 'eclipse_ready', 'Bought this for the upcoming eclipse, and it fits perfectly. Tested it out, and the views are fantastic and safe. Very happy with this purchase.', '5.0'), - - ('HQTGWGPNH4', 'history_buff', 'A fascinating glimpse into historical astronomical thought. The content is incredibly insightful. A must-read for anyone interested in the history of science.', '5.0'), - ('HQTGWGPNH4', 'bookworm_astro', 'Beautifully presented historical document. It''s amazing to see how comets were understood centuries ago. A valuable addition to any astronomy library.', '4.5'), - ('HQTGWGPNH4', 'ancient_texts', 'Such a unique and intriguing read. The historical context is captivating. It offers a different perspective on celestial events.', '4.0'), - ('HQTGWGPNH4', 'celestial_history', 'I love historical astronomy, and this book delivers. It''s well-researched and provides a window into past beliefs. Highly recommended for scholars.', '5.0'), - ('HQTGWGPNH4', 'rare_find', 'A truly special book for enthusiasts of astronomical history. The details about ancient astrologers are very interesting. Great for a deeper understanding.', '4.5'); +GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA accounting TO astronomy_user; -- Product Catalog Service: create a schema CREATE SCHEMA catalog; -GRANT USAGE ON SCHEMA catalog TO otelu; +GRANT USAGE ON SCHEMA catalog TO astronomy_user; -- Product Catalog Service: create tables CREATE TABLE catalog.products ( @@ -139,7 +74,7 @@ CREATE TABLE catalog.products ( ); -- Product Catalog Service: grant permission to schema -GRANT SELECT ON ALL TABLES IN SCHEMA catalog TO otelu; +GRANT SELECT ON ALL TABLES IN SCHEMA catalog TO astronomy_user; -- Product Catalog Service: add product data INSERT INTO catalog.products (id, name, description, picture, price_currency_code, price_units, price_nanos, categories) @@ -153,4 +88,4 @@ VALUES ('LS4PSXUNUM', 'Red Flashlight', 'This 3-in-1 device features a 3-mode red flashlight, a hand warmer, and a portable power bank for recharging your personal electronics on the go. Whether you use it to light the way at an astronomy star party, a night walk, or wildlife research, ThermoTorch 3 Astro Red''s rugged, IPX4-rated design will withstand your everyday activities.', 'RedFlashlight.jpg', 'USD', 57, 80000000, 'accessories,flashlights'), ('9SIQT8TOJO', 'Optical Tube Assembly', 'Capturing impressive deep-sky astroimages is easier than ever with Rowe-Ackermann Schmidt Astrograph (RASA) V2, the perfect companion to today''s top DSLR or astronomical CCD cameras. This fast, wide-field f/2.2 system allows for shorter exposure times compared to traditional f/10 astroimaging, without sacrificing resolution. Because shorter sub-exposure times are possible, your equatorial mount won''t need to accurately track over extended periods. The short focal length also lessens equatorial tracking demands. In many cases, autoguiding will not be required.', 'OpticalTubeAssembly.jpg', 'USD', 3599, 0, 'accessories,telescopes,assembly'), ('6E92ZMYYFZ', 'Solar Filter', 'Enhance your viewing experience with EclipSmart Solar Filter for 8" telescopes. With two Velcro straps and four self-adhesive Velcro pads for added safety, you can be assured that the solar filter cannot be accidentally knocked off and will provide Solar Safe, ISO compliant viewing.', 'SolarFilter.jpg', 'USD', 69, 950000000, 'accessories,telescopes'), - ('HQTGWGPNH4', 'The Comet Book', 'A 16th-century treatise on comets, created anonymously in Flanders (now northern France) and now held at the Universitätsbibliothek Kassel. Commonly known as The Comet Book (or Kometenbuch in German), its full title translates as "Comets and their General and Particular Meanings, According to Ptolomeé, Albumasar, Haly, Aliquind and other Astrologers". The image is from https://publicdomainreview.org/collection/the-comet-book, made available by the Universitätsbibliothek Kassel under a CC-BY SA 4.0 license (https://creativecommons.org/licenses/by-sa/4.0/)', 'TheCometBook.jpg', 'USD', 0, 990000000, 'books'); + ('HQTGWGPNH4', 'The Comet Book', 'A 16th-century treatise on comets, created anonymously in Flanders (now northern France) and now held at the Universitätsbibliothek Kassel. Commonly known as The Comet Book (or Kometenbuch in German), its full title translates as "Comets and their General and Particular Meanings, According to Ptolomeé, Albumasar, Haly, Aliquind and other Astrologers". The image is from https://publicdomainreview.org/collection/the-comet-book, made available by the Universitätsbibliothek Kassel under a CC-BY SA 4.0 license (https://creativecommons.org/licenses/by-sa/4.0/)', 'TheCometBook.jpg', 'USD', 0, 990000000, 'books'); \ No newline at end of file diff --git a/docker-compose/opentelemetry-demo/src/product-catalog/otel-config.yml b/docker-compose/opentelemetry-demo/src/product-catalog/otel-config.yml new file mode 100644 index 00000000..25265215 --- /dev/null +++ b/docker-compose/opentelemetry-demo/src/product-catalog/otel-config.yml @@ -0,0 +1,37 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +file_format: "1.0" +disabled: false +log_level: info +logger_provider: + processors: + - batch: + exporter: + otlp_grpc: + endpoint: ${OTEL_EXPORTER_OTLP_ENDPOINT} +meter_provider: + readers: + - periodic: + exporter: + otlp_grpc: + endpoint: ${OTEL_EXPORTER_OTLP_ENDPOINT} + temporality_preference: ${OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:-cumulative} +tracer_provider: + processors: + - batch: + exporter: + otlp_grpc: + endpoint: ${OTEL_EXPORTER_OTLP_ENDPOINT} +propagator: + composite: + - tracecontext: + - baggage: +resource: + attributes_list: ${OTEL_RESOURCE_ATTRIBUTES} + detection/development: + detectors: + - container: + - host: + - process: + - service: diff --git a/docker-compose/prometheus/rules-otel-demo/otel-demo-alerts.yml b/docker-compose/prometheus/rules-otel-demo/otel-demo-alerts.yml index 7dc4a2cb..3ef5f37b 100644 --- a/docker-compose/prometheus/rules-otel-demo/otel-demo-alerts.yml +++ b/docker-compose/prometheus/rules-otel-demo/otel-demo-alerts.yml @@ -114,7 +114,7 @@ groups: expr: > sum by (service) (rate(latency_seconds_count{ namespace="span_derived", - service=~"ad|cart|checkout|currency|email|payment|product-catalog|product-reviews|recommendation|shipping|quote" + service=~"ad|cart|checkout|currency|email|payment|product-catalog|recommendation|shipping|quote" }[5m])) > 0 for: 1m labels: @@ -130,7 +130,7 @@ groups: histogram_quantile(0.99, sum by (le, service) (rate(latency_seconds_bucket{ namespace="span_derived", - service=~"ad|cart|checkout|currency|email|payment|product-catalog|product-reviews|recommendation|shipping|quote" + service=~"ad|cart|checkout|currency|email|payment|product-catalog|recommendation|shipping|quote" }[5m])) ) > 0.01 for: 1m @@ -146,11 +146,11 @@ groups: # resource-heavy label sets still land in Cortex (exercises C2b's label cap). - alert: OtelDemoAdServiceHighCpu expr: > - process_memory_usage_bytes{service_name=~"ad|cart|checkout|accounting|recommendation|product-reviews"} / 1024 / 1024 > 20 + process_memory_usage_bytes{service_name=~"ad|cart|checkout|recommendation"} / 1024 / 1024 > 20 for: 1m labels: severity: warning component: otel-demo annotations: summary: "OTel Demo service {{ $labels.service_name }} memory above 20MB" - description: "Service memory usage elevated. The accounting service typically uses ~150MB." + description: "Service memory usage elevated." diff --git a/docs/starlight-docs/astro.config.mjs b/docs/starlight-docs/astro.config.mjs index 770835cc..f2c52ff5 100644 --- a/docs/starlight-docs/astro.config.mjs +++ b/docs/starlight-docs/astro.config.mjs @@ -103,6 +103,7 @@ export default defineConfig({ items: [ { label: 'Ingest Your First Traces', link: '/get-started/quickstart/first-traces/' }, { label: 'Create Your First Dashboard', link: '/get-started/quickstart/first-dashboard/' }, + { label: 'OpenTelemetry Demo Application', link: '/get-started/quickstart/otel-demo/' }, ], }, ], diff --git a/docs/starlight-docs/src/content/docs/get-started/quickstart/images/astronomy-shop-apm-services.png b/docs/starlight-docs/src/content/docs/get-started/quickstart/images/astronomy-shop-apm-services.png new file mode 100644 index 00000000..9eb77a73 Binary files /dev/null and b/docs/starlight-docs/src/content/docs/get-started/quickstart/images/astronomy-shop-apm-services.png differ diff --git a/docs/starlight-docs/src/content/docs/get-started/quickstart/images/astronomy-shop-dashboard.png b/docs/starlight-docs/src/content/docs/get-started/quickstart/images/astronomy-shop-dashboard.png new file mode 100644 index 00000000..db7f7407 Binary files /dev/null and b/docs/starlight-docs/src/content/docs/get-started/quickstart/images/astronomy-shop-dashboard.png differ diff --git a/docs/starlight-docs/src/content/docs/get-started/quickstart/otel-demo.mdx b/docs/starlight-docs/src/content/docs/get-started/quickstart/otel-demo.mdx new file mode 100644 index 00000000..06077135 --- /dev/null +++ b/docs/starlight-docs/src/content/docs/get-started/quickstart/otel-demo.mdx @@ -0,0 +1,70 @@ +--- +title: Sending Data from the OpenTelemetry Demo to the Observability Stack +description: Run the OpenTelemetry Demo (Astronomy Shop) against Observability Stack and explore its logs, traces, and metrics in OpenSearch Dashboards. +--- + +The [OpenTelemetry Demo](https://opentelemetry.io/docs/demo/) is a microservices e-commerce app (the Astronomy Shop) that emits logs, traces, and metrics across services written in Go, Python, Java, .NET, Node.js, Ruby, PHP, and C++. Enable it in Observability Stack to explore the stack with realistic telemetry before you instrument your own services. + +The demo ships as an opt-in Docker Compose include file. The stack runs the OTel Collector, Data Prepper, OpenSearch, Prometheus, and OpenSearch Dashboards; enabling the demo adds the Astronomy Shop services and points their telemetry at that pipeline. + +## Install and enable the demo + +Enabling the demo depends on how you install Observability Stack: + +- **Docker Compose:** follow the [installation guide](/docs/get-started/installation/#opentelemetry-demo) and uncomment `INCLUDE_COMPOSE_OTEL_DEMO` in `.env`. +- **Kubernetes (Helm):** set `opentelemetry-demo.enabled=true` (for example, `--set opentelemetry-demo.enabled=true`). See [Kubernetes (Helm)](/docs/deploy/kubernetes/). + +For Docker Compose, the demo image version is pinned by `DEMO_VERSION` in `.env`. Change that value to run a different release. + +## Generate and view telemetry + +The demo's load generator drives traffic automatically, so telemetry starts flowing without any manual steps. To browse the app yourself, open the web store at [http://localhost:8080/](http://localhost:8080/). Then open OpenSearch Dashboards to explore the data. + +### Service telemetry dashboard + +The **Astronomy shop - service telemetry** dashboard is created for you automatically. Open it from **Dashboards**. It correlates logs and metrics across the demo services: request rate by service, instrumentation SDK breakdown, log volume by severity, log throughput over time, and per-service CPU, memory, and thread counts. Filter by service name or SDK language using the controls at the top. + +![Astronomy Shop service telemetry dashboard in OpenSearch Dashboards, showing request rate, instrumentation SDK breakdown, log volume, log throughput over time, and CPU, memory, and thread panels.](./images/astronomy-shop-dashboard.png) + +### Application performance (APM) + +Open **Services** under Application performance to see the trace-derived service catalog: P50/P90/P99 latency, throughput, and failure rate per service, top services and dependency paths by fault rate, and SLO health. From any row, jump to that service's spans, logs, or service map. +See [Application Performance Monitoring](/docs/apm/) for service maps, SLOs, and the rest of the APM workflow. + +![APM Services view showing top services and dependency paths by fault rate, SLO health summary, and a service catalog with latency, throughput, and failure rate per service.](./images/astronomy-shop-apm-services.png) + +## Access points + +| URL | What it is | +|-----|------------| +| [http://localhost:8080/](http://localhost:8080/) | Web store (frontend) | +| [http://localhost:8080/loadgen/](http://localhost:8080/loadgen/) | Load generator UI | +| [http://localhost:8080/feature](http://localhost:8080/feature) | Feature flag UI | +| [http://localhost:5601](http://localhost:5601) | OpenSearch Dashboards | + +Use the feature flag UI to toggle the demo's built-in failure scenarios (for example, a payment or cart fault) and watch the error rate change in the dashboards and APM views. + +## How the data flows + +```mermaid +flowchart LR + Demo[Astronomy Shop services] --> Collector[OTel Collector] + Collector --> DataPrepper[Data Prepper] + Collector --> Prometheus[Prometheus] + DataPrepper --> OpenSearch[OpenSearch] + OpenSearch --> Dashboards[OpenSearch Dashboards] + Prometheus --> Dashboards +``` + +Services export OTLP to the Collector. The Collector sends logs and traces to Data Prepper, which indexes them into OpenSearch, and sends metrics to Prometheus. OpenSearch Dashboards reads from both. + +## Troubleshooting + +- **Services restart or exit on startup.** Usually the container runtime is short on memory. Raise its limit to at least 8 GB. +- **Dashboards are empty.** Give the load generator a minute to produce data, then widen the dashboard time range. Confirm the demo services are up with `docker compose ps`. + +## Next steps + +- [Ingest Your First Traces](/docs/get-started/quickstart/first-traces/) — instrument your own application +- [Create Your First Dashboard](/docs/get-started/quickstart/first-dashboard/) — build custom visualizations +- [Send Data](/docs/send-data/) — more instrumentation and ingestion options