Files
otel-demo/chart/values.yaml
Scaffolder 92edf90fd9
Some checks failed
CI Pipeline / Build and Test (push) Successful in 4s
Security Scanning / Trivy — Filesystem & Dependency Scan (push) Failing after 7s
Security Scanning / Gitleaks — Secret Scan (push) Failing after 7s
Security Scanning / Security Summary (push) Failing after 3s
Build and Publish TechDocs / build-and-publish (push) Successful in 1m2s
initial commit
Change-Id: I8e318861a258686ddc53dda08858f74c573a6520
2026-04-02 13:07:28 +00:00

1224 lines
34 KiB
YAML

# yaml-language-server: $schema=./values.schema.json
default:
# List of environment variables applied to all components
env:
- name: OTEL_SERVICE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: "metadata.labels['app.kubernetes.io/component']"
- name: OTEL_COLLECTOR_NAME
value: otel-collector
- name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE
value: cumulative
# Allows overriding and additions to .Values.default.env
envOverrides: []
# - name: OTEL_K8S_NODE_NAME
# value: "someConstantValue"
image:
repository: ghcr.io/open-telemetry/demo
# Overrides the image tag whose default is the chart appVersion.
# The service's name will be applied to the end of this value.
tag: ""
pullPolicy: IfNotPresent
pullSecrets: []
# Default # of replicas for all components
replicas: 1
# default revisionHistoryLimit for all components (number of old ReplicaSets to retain)
revisionHistoryLimit: 10
# Default schedulingRules for all components
schedulingRules:
nodeSelector: {}
affinity: {}
tolerations: []
# Default securityContext for all components
securityContext: {}
serviceAccount:
# Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: ""
components:
## Demo Components are named objects (services) with several properties
# demoService:
## Enable the component (service)
# enabled: true
# useDefault:
## Use default environment variables
# env: true
## Override Image repository and Tag. Tag will use appVersion as default.
## Component's name will be applied to end of this value.
# imageOverride: {}
## Optional service definitions to apply
# service:
## Service Type to use for this component. Default is ClusterIP.
# type: ClusterIP
## Service Port to use to expose this component. Default is nil
# port: 8080
## Service Node Port to use to expose this component on a NodePort service. Default is nil
# nodePort: 30080
## Service Annotations to add to this component
# annotations: {}
## Additional service ports to use to expose this component
# ports:
# - name: extraServicePort
# value: 8081
## Environment variables to add to the component's pod
# env:
## Environment variables that upsert (append + merge) into the `env` specification for this component.
## A variable named OTEL_RESOURCE_ATTRIBUTES_EXTRA will have its value appended to the OTEL_RESOURCE_ATTRIBUTES value.
# envOverrides:
## Pod Scheduling rules for nodeSelector, affinity, or tolerations.
# schedulingRules:
# nodeSelector: {}
# affinity: {}
# tolerations: []
## Pod labels to add to this component
# podLabels: {}
## Pod Annotations to add to this component
# podAnnotations: {}
## Resources for this component
# resources: {}
## Container security context for setting user ID (UID), group ID (GID) and other security policies
# securityContext:
## Ingresses rules to add for the to the component
# ingress:
## Enable the creation of Ingress rules. Default is false
# enabled: false
## Annotations to add to the ingress rule
# annotations: {}
## Which Ingress class (controller) to use. Default is unspecified.
# ingressClassName: nginx
## Hosts definitions for the Ingress rule
# hosts:
# - host: demo.example.com
## Each host can have multiple paths/routes
# paths:
# - path: /
# pathType: Prefix
# port: 8080
## Optional TLS specifications for the Ingress rule
# tls:
# - secretName: demo-tls
# hosts:
# - demo.example.com
## Additional ingresses - only created if ingress.enabled is true
## Useful for when differently annotated ingress services are required
## Each additional ingress needs key "name" set to something unique
# additionalIngresses: []
# - name: extra-demo-ingress
# ingressClassName: nginx
# annotations: {}
# hosts:
# - host: demo.example.com
# paths:
# - path: /
# pathType: Prefix
# port: 8080
# tls:
# - secretName: demo-tls
# hosts:
# - demo.example.com
## Command to use in the container spec, in case you don't want to go with the default command from the image.
# command: []
## Configuration to for this component; will create a Volume, and Mount backed by an optionally created ConfigMap.
## The name, mountPath are required, and one of existingConfigMap or data is required.
## If an existing ConfigMap is not provided, the contents under data will be used for the created ConfigMap.
# mountedConfigMaps: []
# - name: my-config
# mountPath: /etc/config
# subPath:
# existingConfigMap: my-configmap
# data:
# my-config.yaml: |
# key: value
## Configuration to create an custom Volume
# additionalVolumes:
# - name: nginx-logs
# hostPath:
# path: /var/log/nginx
# type: ""
## Configuration to mount the custom Volume to the container
# additionalVolumeMounts:
# - name: nginx-logs
# mountPath: /var/log/nginx
# # Kubernetes container health check options
# livenessProbe: {}
# readinessProbe: {}
# # Optional init container to run before the pod starts.
# initContainers:
# - name: <init-container-name>
# image: <init-container-image>
# command: [list of commands for the init container to run]
# # Replicas for the component
# replicas: 1
# # Number of old ReplicaSets to retain
# revisionHistoryLimit: 10
# # Optional pod security context for setting user ID (UID), group ID (GID) and other security policies
# # This will be applied at pod level, can be applied globally for all pods: .Values.default.podSecurityContext
# # Or it can be applied to a specific component: .Values.components.<component-name>.podSecurityContext
# podSecurityContext:
# runAsGroup: 65534
# runAsNonRoot: true
# runAsUser: 65534
accounting:
enabled: true
useDefault:
env: true
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: KAFKA_ADDR
value: kafka:9092
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4318
- name: DB_CONNECTION_STRING
value: Host=postgresql;Username=otelu;Password=otelp;Database=otel
- name: OTEL_DOTNET_AUTO_TRACES_ENTITYFRAMEWORKCORE_INSTRUMENTATION_ENABLED
value: "false"
resources:
limits:
memory: 120Mi
initContainers:
- name: wait-for-kafka
image: busybox:latest
command: ["sh", "-c", "until nc -z -v -w30 kafka 9092; do echo waiting for kafka; sleep 2; done;"]
ad:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: AD_PORT
value: "8080"
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4318
- name: OTEL_LOGS_EXPORTER
value: otlp
resources:
limits:
memory: 300Mi
cart:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: CART_PORT
value: "8080"
- name: ASPNETCORE_URLS
value: http://*:$(CART_PORT)
- name: VALKEY_ADDR
value: valkey-cart:6379
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4317
resources:
limits:
memory: 160Mi
initContainers:
- name: wait-for-valkey-cart
image: busybox:latest
command: ["sh", "-c", "until nc -z -v -w30 valkey-cart 6379; do echo waiting for valkey-cart; sleep 2; done;"]
checkout:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: CHECKOUT_PORT
value: "8080"
- name: CART_ADDR
value: cart:8080
- name: CURRENCY_ADDR
value: currency:8080
- name: EMAIL_ADDR
value: http://email:8080
- name: PAYMENT_ADDR
value: payment:8080
- name: PRODUCT_CATALOG_ADDR
value: product-catalog:8080
- name: SHIPPING_ADDR
value: http://shipping:8080
- name: KAFKA_ADDR
value: kafka:9092
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4317
- name: GOMEMLIMIT
value: 16MiB
resources:
limits:
memory: 20Mi
initContainers:
- name: wait-for-kafka
image: busybox:latest
command: ["sh", "-c", "until nc -z -v -w30 kafka 9092; do echo waiting for kafka; sleep 2; done;"]
currency:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: CURRENCY_PORT
value: "8080"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4317
- name: VERSION
value: "{{ .Chart.AppVersion }}"
- name: IPV6_ENABLED
value: "false"
resources:
limits:
memory: 20Mi
email:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: EMAIL_PORT
value: "8080"
- name: APP_ENV
value: production
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4318
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
resources:
limits:
memory: 100Mi
fraud-detection:
enabled: true
useDefault:
env: true
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: KAFKA_ADDR
value: kafka:9092
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4318
- name: OTEL_INSTRUMENTATION_KAFKA_EXPERIMENTAL_SPAN_ATTRIBUTES
value: "true"
- name: OTEL_INSTRUMENTATION_MESSAGING_EXPERIMENTAL_RECEIVE_TELEMETRY_ENABLED
value: "true"
resources:
limits:
memory: 300Mi
initContainers:
- name: wait-for-kafka
image: busybox:latest
command: ["sh", "-c", "until nc -z -v -w30 kafka 9092; do echo waiting for kafka; sleep 2; done;"]
frontend:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: FRONTEND_PORT
value: "8080"
- name: PORT
value: $(FRONTEND_PORT)
- name: FRONTEND_ADDR
value: :8080
- name: AD_ADDR
value: ad:8080
- name: CART_ADDR
value: cart:8080
- name: CHECKOUT_ADDR
value: checkout:8080
- name: CURRENCY_ADDR
value: currency:8080
- name: PRODUCT_CATALOG_ADDR
value: product-catalog:8080
- name: PRODUCT_REVIEWS_ADDR
value: product-reviews:3551
- name: RECOMMENDATION_ADDR
value: recommendation:8080
- name: SHIPPING_ADDR
value: http://shipping:8080
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
- name: ENV_PLATFORM
value: kubernetes
- name: OTEL_COLLECTOR_HOST
value: $(OTEL_COLLECTOR_NAME)
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4317
- name: WEB_OTEL_SERVICE_NAME
value: frontend-web
- name: PUBLIC_OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
value: http://localhost:8080/otlp-http/v1/traces # This expects users to use `kubectl port-forward ...`
resources:
limits:
memory: 250Mi
securityContext:
runAsUser: 1001 # nextjs
runAsGroup: 1001
runAsNonRoot: true
frontend-proxy:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
io.opentelemetry.discovery.metrics/enabled: 'true'
io.opentelemetry.discovery.metrics/scraper: httpcheck
io.opentelemetry.discovery.metrics/config: |
targets:
- endpoint: "http://`endpoint`"
env:
- name: ENVOY_PORT
value: "8080"
- name: ENVOY_ADDR
value: "0.0.0.0"
- name: ENVOY_ADMIN_PORT
value: "10000"
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
- name: FLAGD_UI_HOST
value: flagd
- name: FLAGD_UI_PORT
value: "4000"
- name: FRONTEND_HOST
value: frontend
- name: FRONTEND_PORT
value: "8080"
- name: GRAFANA_HOST
value: grafana
- name: GRAFANA_PORT
value: "80"
- name: IMAGE_PROVIDER_HOST
value: image-provider
- name: IMAGE_PROVIDER_PORT
value: "8081"
- name: JAEGER_HOST
value: jaeger
- name: JAEGER_UI_PORT
value: "16686"
- name: LOCUST_WEB_HOST
value: load-generator
- name: LOCUST_WEB_PORT
value: "8089"
- name: OTEL_COLLECTOR_HOST
value: $(OTEL_COLLECTOR_NAME)
- name: OTEL_COLLECTOR_PORT_GRPC
value: "4317"
- name: OTEL_COLLECTOR_PORT_HTTP
value: "4318"
resources:
limits:
memory: 65Mi
securityContext:
runAsUser: 101 # envoy
runAsGroup: 101
runAsNonRoot: true
image-provider:
enabled: true
useDefault:
env: true
service:
port: 8081
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
io.opentelemetry.discovery.metrics/enabled: 'true'
io.opentelemetry.discovery.metrics/scraper: nginx
io.opentelemetry.discovery.metrics/config: |
endpoint: "http://`endpoint`/status"
collection_interval: "10s"
timeout: "20s"
env:
- name: IMAGE_PROVIDER_PORT
value: "8081"
- name: OTEL_COLLECTOR_PORT_GRPC
value: "4317"
- name: OTEL_COLLECTOR_HOST
value: $(OTEL_COLLECTOR_NAME)
resources:
limits:
memory: 50Mi
load-generator:
enabled: true
useDefault:
env: true
service:
port: 8089
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: LOCUST_WEB_HOST
value: "0.0.0.0"
- name: LOCUST_WEB_PORT
value: "8089"
- name: LOCUST_USERS
value: "10"
- name: LOCUST_SPAWN_RATE
value: "1"
- name: LOCUST_HOST
value: http://frontend-proxy:8080
- name: LOCUST_HEADLESS
value: "false"
- name: LOCUST_AUTOSTART
value: "true"
- name: LOCUST_BROWSER_TRAFFIC_ENABLED
value: "true"
- name: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION
value: python
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
- name: FLAGD_OFREP_PORT
value: "8016"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4317
resources:
limits:
memory: 1500Mi
payment:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: PAYMENT_PORT
value: "8080"
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4317
- name: IPV6_ENABLED
value: "false"
resources:
limits:
memory: 140Mi
securityContext:
runAsUser: 1000 # node
runAsGroup: 1000
runAsNonRoot: true
product-catalog:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: PRODUCT_CATALOG_PORT
value: "8080"
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
- name: GOMEMLIMIT
value: 16MiB
- name: DB_CONNECTION_STRING
value: postgres://otelu:otelp@postgresql/otel?sslmode=disable
- name: OTEL_SEMCONV_STABILITY_OPT_IN
value: database
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4317
resources:
limits:
memory: 20Mi
product-reviews:
enabled: true
useDefault:
env: true
service:
port: 3551
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: OPENAI_API_KEY
value: dummy
- name: LLM_MODEL
value: astronomy-llm
- name: LLM_HOST
value: llm
- name: LLM_PORT
value: "8000"
- name: LLM_BASE_URL
value: http://$(LLM_HOST):$(LLM_PORT)/v1
- name: PRODUCT_REVIEWS_PORT
value: "3551"
- name: PRODUCT_CATALOG_ADDR
value: product-catalog:8080
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
- name: DB_CONNECTION_STRING
value: host=postgresql user=otelu password=otelp dbname=otel
- name: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION
value: python
- name: OTEL_PYTHON_LOG_CORRELATION
value: "true"
- name: OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT
value: "true"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4317
resources:
limits:
memory: 100Mi
quote:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: QUOTE_PORT
value: "8080"
- name: OTEL_PHP_AUTOLOAD_ENABLED
value: "true"
- name: OTEL_PHP_INTERNAL_METRICS_ENABLED
value: "true"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4318
- name: IPV6_ENABLED
value: "false"
resources:
limits:
memory: 40Mi
securityContext:
runAsUser: 33 # www-data
runAsGroup: 33
runAsNonRoot: true
recommendation:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: RECOMMENDATION_PORT
value: "8080"
- name: PRODUCT_CATALOG_ADDR
value: product-catalog:8080
- name: OTEL_PYTHON_LOG_CORRELATION
value: "true"
- name: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION
value: python
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4317
resources:
limits:
memory: 500Mi # This is high to enable supporting the recommendationCache feature flag use case
shipping:
enabled: true
useDefault:
env: true
service:
port: 8080
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: SHIPPING_PORT
value: "8080"
- name: QUOTE_ADDR
value: http://quote:8080
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4317
- name: IPV6_ENABLED
value: "false"
resources:
limits:
memory: 20Mi
flagd:
enabled: true
imageOverride:
repository: "ghcr.io/open-feature/flagd"
tag: "v0.12.9"
useDefault:
env: true
replicas: 1
ports:
- name: rpc
value: 8013
- name: ofrep
value: 8016
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: FLAGD_METRICS_EXPORTER
value: otel
- name: FLAGD_OTEL_COLLECTOR_URI
value: $(OTEL_COLLECTOR_NAME):4317
- name: GOMEMLIMIT
value: 60MiB
resources:
limits:
memory: 75Mi
command:
- "/flagd-build"
- "start"
- "--port"
- "8013"
- "--ofrep-port"
- "8016"
- "--uri"
- "file:./etc/flagd/demo.flagd.json"
mountedEmptyDirs:
- name: config-rw
mountPath: /etc/flagd
# flagd-ui as a sidecar container in the same pod so the flag json file can be shared
sidecarContainers:
- name: flagd-ui
useDefault:
env: true
service:
port: 4000
env:
- name: FLAGD_METRICS_EXPORTER
value: otel
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4318
- name: FLAGD_UI_PORT
value: "4000"
- name: SECRET_KEY_BASE
value: yYrECL4qbNwleYInGJYvVnSkwJuSQJ4ijPTx5tirGUXrbznFIBFVJdPl5t6O9ASw
- name: PHX_HOST
value: localhost
resources:
limits:
memory: 250Mi
volumeMounts:
- name: config-rw
mountPath: /app/data
initContainers:
- name: init-config
image: busybox
command: ["sh", "-c", "cp /config-ro/demo.flagd.json /config-rw/demo.flagd.json && cat /config-rw/demo.flagd.json"]
volumeMounts:
- mountPath: /config-ro
name: config-ro
- mountPath: /config-rw
name: config-rw
additionalVolumes:
- name: config-ro
configMap:
name: flagd-config
kafka:
enabled: true
useDefault:
env: true
replicas: 1
ports:
- name: plaintext
value: 9092
- name: controller
value: 9093
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: KAFKA_ADVERTISED_LISTENERS
value: PLAINTEXT://kafka:9092
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4318
- name: KAFKA_HEAP_OPTS
value: "-Xmx400M -Xms400M"
- name: KAFKA_LISTENERS
value: PLAINTEXT://:9092,CONTROLLER://:9093
- name: KAFKA_CONTROLLER_LISTENER_NAMES
value: CONTROLLER
- name: KAFKA_CONTROLLER_QUORUM_VOTERS
value: 1@kafka:9093
resources:
limits:
memory: 700Mi
securityContext:
runAsUser: 1000 # appuser
runAsGroup: 1000
runAsNonRoot: true
llm:
enabled: true
useDefault:
env: true
service:
port: 8000
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
env:
- name: FLAGD_HOST
value: flagd
- name: FLAGD_PORT
value: "8013"
postgresql:
enabled: true
useDefault:
env: false
imageOverride:
repository: "postgres"
tag: "17.6"
replicas: 1
service:
port: 5432
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
io.opentelemetry.discovery.metrics/enabled: 'true'
io.opentelemetry.discovery.metrics/scraper: postgresql
io.opentelemetry.discovery.metrics/config: |
username: root
password: otel
metrics:
postgresql.blks_hit:
enabled: true
postgresql.blks_read:
enabled: true
postgresql.tup_fetched:
enabled: true
postgresql.tup_returned:
enabled: true
postgresql.tup_inserted:
enabled: true
postgresql.tup_updated:
enabled: true
postgresql.tup_deleted:
enabled: true
postgresql.deadlocks:
enabled: true
tls:
insecure: true
env:
- name: POSTGRES_USER
value: root
- name: POSTGRES_PASSWORD
value: otel
- name: POSTGRES_DB
value: otel
mountedConfigMaps:
- name: postgresql-init
mountPath: /docker-entrypoint-initdb.d
existingConfigMap: postgresql-init
resources:
limits:
memory: 100Mi
valkey-cart:
enabled: true
useDefault:
env: false
imageOverride:
repository: "valkey/valkey"
tag: "9.0.1-alpine3.23"
replicas: 1
ports:
- name: valkey-cart
value: 6379
podAnnotations:
resource.opentelemetry.io/service.namespace: otel-demo
io.opentelemetry.discovery.metrics/enabled: 'true'
io.opentelemetry.discovery.metrics/scraper: redis
io.opentelemetry.discovery.metrics/config: |
username: valkey
collection_interval: 10s
resources:
limits:
memory: 20Mi
securityContext:
runAsUser: 999 # valkey
runAsGroup: 1000
runAsNonRoot: true
opentelemetry-collector:
enabled: true
image:
repository: "otel/opentelemetry-collector-contrib"
fullnameOverride: otel-collector
mode: daemonset
presets:
hostMetrics:
enabled: true
kubernetesAttributes:
enabled: true
kubeletMetrics:
enabled: true
clusterMetrics:
enabled: true
annotationDiscovery:
metrics:
enabled: true
resources:
limits:
memory: 200Mi
service:
enabled: true
ports:
metrics:
enabled: true
config:
receivers:
otlp:
protocols:
http:
# Since this collector needs to receive data from the web, enable cors for all origins
# `allowed_origins` can be refined for your deployment domain
cors:
allowed_origins:
- "http://*"
- "https://*"
exporters:
otlp/jaeger:
endpoint: jaeger:4317
tls:
insecure: true
sending_queue:
batch:
otlphttp/prometheus:
endpoint: http://prometheus:9090/api/v1/otlp
tls:
insecure: true
sending_queue:
batch:
opensearch:
logs_index: otel-logs
logs_index_time_format: "yyyy-MM-dd"
http:
endpoint: http://opensearch:9200
tls:
insecure: true
processors:
memory_limiter:
check_interval: 5s
limit_percentage: 80
spike_limit_percentage: 25
resourcedetection:
detectors: [env, system]
transform:
error_mode: ignore
trace_statements:
# Sanitize spans to prevent span metrics cardinality explosion
# caused by non-compliant high cardinality span names:
# 1. Define missing http.route on key HTTP operations for meaningful operation names
# 2. Then normalize span names; http server spans lacking http.route default to operations "GET", "POST", etc.
- context: span
# FRONTEND SERVICE
conditions:
- span.kind == SPAN_KIND_SERVER and resource.attributes["service.name"] == "frontend" and span.attributes["http.route"] == nil
statements:
# Workaround for Next.js high cardinality span name issue: https://github.com/vercel/next.js/issues/54694
- set(span.attributes["http.route"], "/api/cart") where IsMatch(span.attributes["http.target"], "\\/api\\/cart") # e.g. # /api/cart
- set(span.attributes["http.route"], "/api/checkout") where IsMatch(span.attributes["http.target"], "\\/api\\/checkout") # e.g. # /api/checkout
- set(span.attributes["http.route"], "/api/products/{productId}") where IsMatch(span.attributes["http.target"], "\\/api\\/products\\/.*") # e.g. /api/products/1YMWWN1N4O
- set(span.attributes["http.route"], "/api/recommendations") where IsMatch(span.attributes["http.target"], "\\/api\\/recommendations") # e.g. # /api/recommendations?productIds=...
- set(span.attributes["http.route"], "/api/data") where IsMatch(span.attributes["http.target"], "\\/api\\/data.*") # e.g. # " /api/data?contextKeys=telescopes" or /api/data/?contextKeys=cameras
- context: span
statements:
# SANITIZE ALL SPAN NAMES TO PREVENT CARDINALITY EXPLOSION
- set_semconv_span_name("1.37.0", "unsanitized_span_name")
resource:
attributes:
- key: service.instance.id
from_attribute: k8s.pod.uid
action: insert
connectors:
spanmetrics: {}
service:
pipelines:
traces:
processors: [memory_limiter, resourcedetection, resource, transform, batch]
exporters: [otlp/jaeger, debug, spanmetrics]
metrics:
receivers: [otlp, spanmetrics]
processors: [memory_limiter, resourcedetection, resource, batch]
exporters: [otlphttp/prometheus, debug]
logs:
processors: [memory_limiter, resourcedetection, resource, batch]
exporters: [opensearch, debug]
telemetry:
metrics:
level: detailed
readers:
- periodic:
interval: 10000
timeout: 5000
exporter:
otlp:
protocol: http/protobuf
endpoint: http://otel-collector:4318
insecure: true
jaeger:
enabled: true
fullnameOverride: jaeger
jaeger:
storage:
type: memory
extraEnv:
- name: MEMORY_MAX_TRACES
value: "25000"
- name: PROMETHEUS_ADDR
value: prometheus:9090
- name: OTEL_COLLECTOR_HOST
value: otel-collector
- name: OTEL_COLLECTOR_PORT_HTTP
value: "4318"
- name: JAEGER_HOST
value: "0.0.0.0"
- name: JAEGER_GRPC_PORT
value: "4317"
resources:
limits:
memory: 600Mi
userconfig: |
service:
extensions: [jaeger_storage, jaeger_query, healthcheckv2]
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [jaeger_storage_exporter]
telemetry:
resource:
service.name: jaeger
metrics:
level: detailed
readers:
- periodic:
interval: 10000
timeout: 5000
exporter:
otlp:
protocol: http/protobuf
endpoint: http://${env:OTEL_COLLECTOR_HOST}:${env:OTEL_COLLECTOR_PORT_HTTP}
insecure: true
logs:
level: info
extensions:
healthcheckv2:
use_v2: true
http:
endpoint: 0.0.0.0:13133
jaeger_query:
storage:
traces: memory_backend
metrics: metrics_backend
base_path: /jaeger/ui
jaeger_storage:
backends:
memory_backend:
memory:
max_traces: ${env:MEMORY_MAX_TRACES}
metric_backends:
metrics_backend:
prometheus:
endpoint: "http://${env:PROMETHEUS_ADDR}"
normalize_calls: true
normalize_duration: true
receivers:
otlp:
protocols:
grpc:
endpoint: ${env:JAEGER_HOST}:${env:JAEGER_GRPC_PORT}
processors:
batch:
exporters:
jaeger_storage_exporter:
trace_storage: memory_backend
prometheus:
enabled: true
alertmanager:
enabled: false
configmapReload:
prometheus:
enabled: false
kube-state-metrics:
enabled: false
prometheus-node-exporter:
enabled: false
prometheus-pushgateway:
enabled: false
server:
fullnameOverride: prometheus
extraFlags:
- "enable-feature=exemplar-storage"
- "web.enable-otlp-receiver"
retention: 7d
tsdb:
out_of_order_time_window: 30m
otlp:
keep_identifying_resource_attributes: true
# Recommended attributes to be promoted to labels.
promote_resource_attributes:
- service.instance.id
- service.name
- service.namespace
- service.version
- cloud.availability_zone
- cloud.region
- deployment.environment.name
# When deploying on Kubernetes, resource attributes used to identify the
# kubernetes resources in dashboards and alerts.
- k8s.cluster.name
- k8s.container.name
- k8s.cronjob.name
- k8s.daemonset.name
- k8s.deployment.name
- k8s.job.name
- k8s.namespace.name
- k8s.node.name
- k8s.pod.name
- k8s.replicaset.name
- k8s.statefulset.name
- container.name
# When deploying on VMs, resource attributes used to identify
# the host in dashboards and alerts.
- host.name
# PostgreSQL resource attributes produced by the OTel Collector PostgreSQL receiver
# and used in dashboards and alerts.
# See https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/postgresqlreceiver/metadata.yaml
- postgresql.database.name
- postgresql.schema.name
- postgresql.table.name
- postgresql.index.name
persistentVolume:
enabled: false
service:
servicePort: 9090
resources:
limits:
memory: 400Mi
grafana:
enabled: true
fullnameOverride: grafana
testFramework:
enabled: false
grafana.ini:
auth:
disable_login_form: true
auth.anonymous:
enabled: true
org_name: Main Org.
org_role: Admin
server:
root_url: "%(protocol)s://%(domain)s:%(http_port)s/grafana"
serve_from_sub_path: true
adminPassword: admin
plugins:
- grafana-opensearch-datasource
sidecar:
alerts:
enabled: true
dashboards:
enabled: true
datasources:
enabled: true
resources:
limits:
cpu: 100m
memory: 100Mi
resources:
limits:
memory: 175Mi
opensearch:
enabled: true
fullnameOverride: opensearch
clusterName: demo-cluster
nodeGroup: otel-demo
singleNode: true
opensearchJavaOpts: "-Xms400m -Xmx400m"
persistence:
enabled: false
extraEnvs:
- name: "bootstrap.memory_lock"
value: "true"
- name: "DISABLE_INSTALL_DEMO_CONFIG"
value: "true"
- name: "DISABLE_SECURITY_PLUGIN"
value: "true"
resources:
limits:
memory: 1100Mi