Public maps · OpenTelemetry Demo

OpenTelemetry Demo, mapped from the code.

The OpenTelemetry Astronomy Shop: a polyglot shop in Go, C#, C++, Java, Kotlin, TypeScript, Python, Ruby, PHP, Rust and Elixir, on gRPC, HTTP and Kafka behind an Envoy proxy, with an AI agent layer. Kuuhaku read its source at commit 7ea09b8, with no configuration and no hand-fixing, and found 23 services in C#, Java, Python, Go, Ruby, Kotlin, TypeScript, JavaScript, PHP and Rust, and 30 connections: 19 over HTTP, 9 over gRPC and 2 through queues. Each one below says how it was found.

Open the live mapMap your own repos
Kuuhaku's map of OpenTelemetry Demo: 23 services grouped into consumers and services, with 30 connections drawn between them

Services

Every repo or deployable the scanner found, with how many connections leave it and reach it.

ServiceStackRoleCallsCalled by
frontendTypeScript · Next.jsservice73
checkoutGoconsumer81
frontend_proxynot read: Docker onlyservice62
agentPython · FastAPIservice22
product_catalogGoservice03
shippingRust · Actixservice12
cartC# · ASP.NET Coreservice02
chatbotPython · FastAPIconsumer11
currencynot read: Docker onlyservice02
load_generatorPython · Flaskconsumer11
mcpPython · FastAPIconsumer11
recommendationPythonservice11
telemetry_docsPythonservice11
accountingC# · .NETservice01
adJavaservice01
emailRuby · Sinatraservice01
flagd_uiDockerservice01
fraud_detectionKotlinservice01
image_providernot read: Docker onlyservice01
paymentJavaScript · Nodeservice01
quotePHP · Slimservice01
react_native_appTypeScript · Reactconsumer10
kafkanot read: Docker onlyservice00

Connections

config: the address is written in configuration (an env file, a compose file, a proxy route) and the call is matched to it. inferred: the call's path matches a route of the target and nothing contradicts it. Call sites count the places in the code that make the call.

FromToTypeEvidenceCall sitesHow it was found
agentfrontendHTTPconfig10URL worked out at ../shared/tools.py:22
agentmcpHTTPconfig1MCP_ENDPOINT = mcp in compose.agent.yaml
chatbotagentHTTPconfig1URL worked out at src/chat_interface/chat_interface.py:37
checkoutaccountingqueueinferred1topic orders: main.go:671 → accounting Consumer.cs:46; topic orders: main.go:671 → accounting Consumer.cs:31
checkoutcartgRPCconfig2CART_ADDR = cart:7070 in compose.yaml; CartService client in main.go, served in cart/services/CartService.cs
checkoutcurrencyHTTPconfig1CURRENCY_ADDR = currency:7001 in compose.yaml
checkoutemailHTTPinferred1its path matches a route of email, which this repo is wired to
checkoutfraud_detectionqueueinferred1topic orders: main.go:671 → fraud_detection src/main/kotlin/frauddetection/main.kt:26
checkoutpaymentgRPCconfig3PAYMENT_ADDR = payment:50051 in compose.yaml; PaymentService client in main.go, served in payment/index.js
checkoutproduct_cataloggRPCconfig2PRODUCT_CATALOG_ADDR = product-catalog:3550 in compose.yaml; ProductCatalogService client in main.go, served in product_catalog/main.go
checkoutshippingHTTPinferred2its path matches a route of shipping, which this repo is wired to
frontendadgRPCconfig3AD_ADDR = ad:9555 in compose.yaml; AdService client in gateways/rpc/Ad.gateway.ts, served in ad/src/main/java/oteldemo/AdService.java
frontendcartgRPCconfig3CART_ADDR = cart:7070 in compose.yaml; CartService client in gateways/rpc/Cart.gateway.ts, served in cart/services/CartService.cs
frontendcheckoutgRPCconfig3CHECKOUT_ADDR = checkout:5050 in compose.yaml; CheckoutService client in gateways/rpc/Checkout.gateway.ts, served in checkout/main.go
frontendcurrencyHTTPconfig2CURRENCY_ADDR = currency:7001 in compose.yaml
frontendproduct_cataloggRPCconfig3PRODUCT_CATALOG_ADDR = product-catalog:3550 in compose.yaml; ProductCatalogService client in gateways/rpc/ProductCatalog.gateway.ts, served in product_catalog/main.go
frontendrecommendationgRPCconfig3RECOMMENDATION_ADDR = recommendation:9001 in compose.yaml; RecommendationService client in gateways/rpc/Recommendations.gateway.ts, served in recommendation/recommendation_server.py
frontendshippingHTTPconfig2SHIPPING_ADDR = http://shipping:50050 in compose.yaml, read in the same file
frontend_proxychatbotHTTPconfig1CHATBOT_HOST = chatbot in compose.yaml
frontend_proxyflagd_uiHTTPconfig1FLAGD_UI_HOST = flagd-ui in compose.yaml
frontend_proxyfrontendHTTPconfig11URL worked out at envoy.tmpl.yaml, through the / route in envoy.tmpl.yaml
frontend_proxyimage_providerHTTPconfig1IMAGE_PROVIDER_HOST = image-provider in compose.yaml
frontend_proxyload_generatorHTTPconfig1LOCUST_WEB_HOST = load-generator in compose.yaml
frontend_proxytelemetry_docsHTTPconfig1TELEMETRY_DOCS_HOST = telemetry-docs in compose.yaml
load_generatoragentHTTPconfig11AGENT_ENDPOINT = agent in compose.agent.yaml, read in the same file
mcpfrontendHTTPconfig10URL worked out at ../shared/tools.py:22
react_native_appfrontend_proxyHTTPconfig10http://localhost in utils/Settings.ts, 10 call paths match its routes
recommendationproduct_cataloggRPCconfig2PRODUCT_CATALOG_ADDR = product-catalog:3550 in compose.yaml; ProductCatalogService client in recommendation_server.py, served in product_catalog/main.go
shippingquoteHTTPconfig1URL worked out at src/shipping_service/quote.rs:68
telemetry_docsfrontend_proxyHTTPconfig1http://localhost in mkdocs.yml

Left for a person

10 items the scanner would not settle on its own and put in the review inbox instead of guessing, for example:

Other systems

Your own system

Run npx kuuhaku scan . in a folder of repos: it reads the code on your machine and only the graph leaves it. Or connect GitHub or Bitbucket and let the hosted runner scan with a read-only key. The map, a page per repo, a review inbox and a check on every pull request follow. Start free.