--- title: Demo Architecture linkTitle: Architecture aliases: [/docs/demo/current_architecture] body_class: otel-mermaid-max-width --- **OpenTelemetry Demo** is composed of microservices written in different programming languages that talk to each other over gRPC and HTTP; and a load generator which uses [Locust](https://locust.io/) to fake user traffic. ```mermaid graph TD subgraph Service Diagram accountingservice(Accounting Service):::golang adservice(Ad Service):::java cache[(Cache
(redis))] cartservice(Cart Service):::dotnet checkoutservice(Checkout Service):::golang currencyservice(Currency Service):::cpp emailservice(Email Service):::ruby frauddetectionservice(Fraud Detection Service):::kotlin frontend(Frontend):::typescript frontendproxy(Frontend Proxy
(Envoy)):::cpp loadgenerator([Load Generator]):::python paymentservice(Payment Service):::javascript productcatalogservice(Product Catalog Service):::golang quoteservice(Quote Service):::php recommendationservice(Recommendation Service):::python shippingservice(Shipping Service):::rust featureflagservice(Feature Flag Service):::erlang featureflagstore[(Feature Flag Store
(PostgreSQL DB))] queue[(queue
(Kafka))] Internet -->|HTTP| frontendproxy frontendproxy -->|HTTP| frontend frontendproxy -->|HTTP| featureflagservice loadgenerator -->|HTTP| frontend accountingservice -->|TCP| queue checkoutservice --->|gRPC| cartservice --> cache checkoutservice --->|gRPC| productcatalogservice checkoutservice --->|gRPC| currencyservice checkoutservice --->|HTTP| emailservice checkoutservice --->|gRPC| paymentservice checkoutservice -->|gRPC| shippingservice checkoutservice ---->|TCP| queue frontend -->|gRPC| adservice frontend -->|gRPC| cartservice frontend -->|gRPC| productcatalogservice frontend -->|gRPC| checkoutservice frontend -->|gRPC| currencyservice frontend -->|gRPC| recommendationservice -->|gRPC| productcatalogservice frontend -->|gRPC| shippingservice -->|HTTP| quoteservice frauddetectionservice -->|TCP| queue adservice -->|gRPC| featureflagservice productcatalogservice -->|gRPC| featureflagservice recommendationservice -->|gRPC| featureflagservice shippingservice -->|gRPC| featureflagservice featureflagservice --> featureflagstore end classDef dotnet fill:#178600,color:white; classDef cpp fill:#f34b7d,color:white; classDef erlang fill:#b83998,color:white; classDef golang fill:#00add8,color:black; classDef java fill:#b07219,color:white; classDef javascript fill:#f1e05a,color:black; classDef kotlin fill:#560ba1,color:white; classDef php fill:#4f5d95,color:white; classDef python fill:#3572A5,color:white; classDef ruby fill:#701516,color:white; classDef rust fill:#dea584,color:black; classDef typescript fill:#e98516,color:black; ``` ```mermaid graph TD subgraph Service Legend dotnetsvc(.NET):::dotnet cppsvc(C++):::cpp erlangsvc(Erlang/Elixir):::erlang golangsvc(Go):::golang javasvc(Java):::java javascriptsvc(JavaScript):::javascript kotlinsvc(Kotlin):::kotlin phpsvc(PHP):::php pythonsvc(Python):::python rubysvc(Ruby):::ruby rustsvc(Rust):::rust typescriptsvc(TypeScript):::typescript end classDef dotnet fill:#178600,color:white; classDef cpp fill:#f34b7d,color:white; classDef erlang fill:#b83998,color:white; classDef golang fill:#00add8,color:black; classDef java fill:#b07219,color:white; classDef javascript fill:#f1e05a,color:black; classDef kotlin fill:#560ba1,color:white; classDef php fill:#4f5d95,color:white; classDef python fill:#3572A5,color:white; classDef ruby fill:#701516,color:white; classDef rust fill:#dea584,color:black; classDef typescript fill:#e98516,color:black; ``` Follow these links for the current state of [metric](/docs/demo/metric-features/) and [trace](/docs/demo/trace-features/) instrumentation of the demo applications. The collector is configured in [otelcol-config.yml](https://github.com/open-telemetry/opentelemetry-demo/blob/main/src/otelcollector/otelcol-config.yml), alternative exporters can be configured here. ```mermaid graph TB subgraph tdf[Telemetry Data Flow] subgraph subgraph_padding [ ] style subgraph_padding fill:none,stroke:none; %% padding to stop the titles clashing subgraph od[Open Telemetry Demo] ms(Microservice) end ms -.->|"OTLP
gRPC"| oc-grpc ms -.->|"OTLP
HTTP POST"| oc-http subgraph oc[OTel Collector] style oc fill:#97aef3,color:black; oc-grpc[/"OTLP Receiver
listening on
grpc://localhost:4317/"/] oc-http[/"OTLP Receiver
listening on
http://localhost:4318/
https://localhost:4318/"/] oc-proc(Processors) oc-prom[/"Prometheus Exporter
listening on
http://localhost:9464/"/] oc-jag[/"Jaeger Exporter"/] oc-grpc --> oc-proc oc-http --> oc-proc oc-proc --> oc-prom oc-proc --> oc-jag end oc-prom -->|"http://localhost:9464/metrics"| pr-sc oc-jag -->|gRPC| ja-col subgraph pr[Prometheus] style pr fill:#e75128,color:black; pr-sc[/"Prometheus Scraper
polling every 5 seconds"/] pr-tsdb[(Prometheus TSDB)] pr-http[/"Prometheus HTTP
listening on
http://localhost:9090"/] pr-sc --> pr-tsdb pr-tsdb --> pr-http end pr-b{{"Browser
Prometheus UI"}} pr-http ---->|"http://localhost:9090/graph"| pr-b subgraph ja[Jaeger] style ja fill:#60d0e4,color:black; ja-col[/"Jaeger Collector
listening on
grpc://jaeger:4317/"/] ja-db[(Jaeger DB)] ja-http[/"Jaeger HTTP
listening on
http://localhost:16686"/] ja-col --> ja-db ja-db --> ja-http end subgraph gr[Grafana] style gr fill:#f8b91e,color:black; gr-srv["Grafana Server"] gr-http[/"Grafana HTTP
listening on
http://localhost:3000"/] gr-srv --> gr-http end pr-http --> |"http://localhost:9090/api"| gr-srv ja-http --> |"http://localhost:16686/api"| gr-srv ja-b{{"Browser
Jaeger UI"}} ja-http ---->|"http://localhost:16686/search"| ja-b gr-b{{"Browser
Grafana UI"}} gr-http -->|"http://localhost:3000/dashboard"| gr-b end end ``` Find the **Protocol Buffer Definitions** in the `/pb/` directory.