Bank of Anthos, mapped from the code.
Google's sample bank: a Python Flask front end and account services, Java ledger services and two Postgres databases. Kuuhaku read its source at commit db35fea, with no configuration and no hand-fixing, and found 8 services in Python and Java, and 9 connections: 6 over HTTP and 3 through shared databases. Each one below says how it was found.
Services
Every repo or deployable the scanner found, with how many connections leave it and reach it.
| Service | Stack | Role | Calls | Called by |
|---|---|---|---|---|
frontend | Python · Flask | service | 5 | 0 |
balancereader | Java · Spring Boot | service | 0 | 4 |
ledgerwriter | Java · Spring Boot | service | 2 | 1 |
contacts | Python · Flask | service | 0 | 2 |
transactionhistory | Java · Spring Boot | service | 1 | 1 |
userservice | Python · Flask | service | 1 | 1 |
ledgermonolith | Java · Spring Boot | service | 0 | 0 |
loadgenerator | Python | consumer | 0 | 0 |
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.
| From | To | Type | Evidence | Call sites | How it was found |
|---|---|---|---|---|---|
frontend | balancereader | HTTP | config | 1 | URL worked out at frontend.py:118 |
frontend | contacts | HTTP | config | 2 | URL worked out at frontend.py:130 |
frontend | ledgerwriter | HTTP | config | 1 | URL worked out at frontend.py:334 |
frontend | transactionhistory | HTTP | config | 1 | URL worked out at frontend.py:124 |
frontend | userservice | HTTP | config | 2 | URL worked out at frontend.py:445 |
ledgerwriter | balancereader | HTTP | config | 1 | URL worked out at src/main/java/anthos/samples/bankofanthos/ledgerwriter/LedgerWriterController.java:215 |
ledgerwriter | balancereader | shared database | config | — | SPRING_DATASOURCE_URL in ledgerwriter and SPRING_DATASOURCE_URL in balancereader name the same Postgres ledger-db/postgresdb |
transactionhistory | balancereader | shared database | config | — | SPRING_DATASOURCE_URL in transactionhistory and SPRING_DATASOURCE_URL in balancereader name the same Postgres ledger-db/postgresdb |
userservice | contacts | shared database | config | — | ACCOUNTS_DB_URI in userservice and ACCOUNTS_DB_URI in contacts name the same Postgres accounts-db/accounts-db |
Left for a person
3 items the scanner would not settle on its own and put in the review inbox instead of guessing:
requestsinfrontend: base URL assigned at runtime (frontend.py:541)metadata_urlinfrontend: base URL assigned at runtime (frontend.py:691)clientinloadgenerator: base URL assigned at runtime (locustfile.py:49)
Other systems
- OpenTelemetry Demo: 23 services, 30 connections
- Train Ticket: 48 services, 140 connections
- Online Boutique: 12 services, 16 connections
- eShop: 19 services, 31 connections
- Robot Shop: 9 services, 12 connections
- Sock Shop: 8 services, 7 connections
- Quarkus Super Heroes: 7 services, 6 connections
- Spring PetClinic Microservices: 7 services, 14 connections
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.