From 5abbb9a14a91c4d54f674692aff8255963a5976a Mon Sep 17 00:00:00 2001 From: Paolo Salvatori Date: Tue, 11 Aug 2026 11:36:38 +0200 Subject: [PATCH] Add mermaid architecture diagrams to samples missing an architecture image eventhubs and eventhubs-eventgrid had ASCII-art diagrams and servicebus/java had none. Each now has a mermaid diagram under ## Architecture (a new section for eventhubs-eventgrid, aligning it with the repo convention). The diagrams follow the url-shortener style: subgraphs as containers, numbered flow steps, dotted secondary edges. Visio-made architecture images will follow in a separate PR. Co-Authored-By: Claude Fable 5 --- samples/eventhubs-eventgrid/python/README.md | 53 ++++++++++------ samples/eventhubs/python/README.md | 66 +++++++++++++------- samples/servicebus/java/README.md | 17 +++++ 3 files changed, 96 insertions(+), 40 deletions(-) diff --git a/samples/eventhubs-eventgrid/python/README.md b/samples/eventhubs-eventgrid/python/README.md index ed27aba..2e39b26 100644 --- a/samples/eventhubs-eventgrid/python/README.md +++ b/samples/eventhubs-eventgrid/python/README.md @@ -9,24 +9,41 @@ Blob Storage as Avro. The moment an archive lands, Event Hubs raises notification **into a second event hub**, and a Function App triggered on that hub downloads the archive, aggregates it per device, and writes summaries to a curated hub. -``` - devices ──▶ telemetry hub ──── Capture (60s window) ────▶ Avro archive in Blob Storage - │ │ - │ Microsoft.EventHub.CaptureFileCreated - │ ▼ - │ Event Grid system topic - │ │ - │ subscription, EventHub destination - │ ▼ - │ capture-notifications hub - │ │ - │ Event Hubs trigger - │ ▼ - └───────────── archive read back ──────────── Function App - │ - Event Hubs output binding - ▼ - curated hub +## Architecture + +The following diagram illustrates the architecture of the solution: + +```mermaid +flowchart LR + devices["Devices
telemetry_producer.py"] + + subgraph ehns["Event Hubs namespace"] + telemetry[["telemetry hub
4 partitions, Capture enabled"]] + notifications[["capture-notifications hub
2 partitions"]] + curated[["curated hub
2 partitions"]] + end + + subgraph storage["Storage Account"] + archive[("telemetry-archive container
Avro archives")] + end + + subgraph eventgrid["Event Grid"] + topic["System topic
(over the namespace)"] + subscription["capture-to-eventhub subscription
(Event Hub destination)"] + end + + subgraph funcapp["Function App"] + processor["CaptureProcessor
(Event Hubs trigger)"] + end + + devices -->|"1: AMQP, partition key = device_id"| telemetry + telemetry -->|"2: Capture (60 s window, Avro)"| archive + telemetry -->|"3: Microsoft.EventHub.CaptureFileCreated"| topic + topic --> subscription + subscription -->|"4: delivered as an event"| notifications + notifications -->|"5: trigger (capture-processor group)"| processor + processor -->|"6: read archive (data.fileUrl)"| archive + processor -->|"7: per-device summaries (output binding)"| curated ``` ## Why this shape diff --git a/samples/eventhubs/python/README.md b/samples/eventhubs/python/README.md index 6d67beb..1eb3835 100644 --- a/samples/eventhubs/python/README.md +++ b/samples/eventhubs/python/README.md @@ -10,28 +10,50 @@ The sample is built around the properties that make Event Hubs different from a ## Architecture -``` - Producers (outside Azure) LocalStack for Azure - ┌───────────────────────┐ ┌──────────────────────────────────────────────┐ - │ POS terminals │ AMQP │ Event Hubs namespace (Standard, Kafka on) │ - │ producer_amqp.py ├───────►│ │ - │ │ │ payments hub ─ 4 partitions ─── Capture ───┼──► Blob Storage - │ Legacy gateway │ Kafka │ consumer groups: │ Avro archives - │ producer_kafka.py ├───────►│ fraud-detector ──┐ analytics audit │ (cold path) - │ │ │ │ │ - │ ATM / IoT devices │ HTTPS │ ▼ │ - │ producer_http.py ├───────►│ Function App (Python) │ - └───────────────────────┘ │ Event Hubs trigger │ - │ fraud rules ──────┐ │ - │ ▼ │ - │ fraud-alerts hub ─ 2 partitions │ - │ ▲ │ - │ Key Vault: connection strings │ │ - │ Schema Registry: Avro contract│ │ - │ App Insights + Log Analytics │ │ - │ │ │ - │ Web App ── operations dashboard │ - └──────────────────────────────────────────────┘ +The following diagram illustrates the architecture of the solution: + +```mermaid +flowchart LR + subgraph producers["External producers"] + pos["POS terminals
producer_amqp.py"] + gateway["Legacy gateway
producer_kafka.py"] + atm["ATM / IoT devices
producer_http.py"] + end + + subgraph ehns["Event Hubs namespace (Standard, Kafka enabled)"] + payments[["payments hub
4 partitions
groups: fraud-detector, analytics, audit"]] + alerts[["fraud-alerts hub
2 partitions"]] + registry["Schema Registry
payments-schemas (Avro)"] + end + + subgraph funcapp["Function App"] + detector["FraudDetector
(Event Hubs trigger, batched)"] + end + + subgraph storage["Storage Account"] + archive[("payments-archive container
Avro archives, cold path")] + checkpoints[("checkpoint blobs")] + end + + kv["Key Vault
connection-string secrets
(stored at deploy)"] + dashboard["Web App
operations dashboard"] + monitor["Application Insights +
Log Analytics"] + + pos -->|"1: AMQP"| payments + gateway -->|"1: Kafka"| payments + atm -->|"1: HTTPS"| payments + producers -.->|"register Avro contract"| registry + + payments -->|"2: trigger (fraud-detector group)"| detector + detector -->|"3: alerts (output binding)"| alerts + detector -.->|"checkpoints"| checkpoints + payments -->|"Capture (60 s / 10 MB, Avro)"| archive + + dashboard -.->|"partition state, alerts, schemas"| ehns + dashboard -.->|"checkpoints, archives"| storage + ehns -.-> kv + funcapp -.->|"telemetry"| monitor + dashboard -.->|"telemetry"| monitor ``` **Deployment flow.** The deploy script creates Log Analytics and Application Insights, a diff --git a/samples/servicebus/java/README.md b/samples/servicebus/java/README.md index a4b3fed..d465c98 100644 --- a/samples/servicebus/java/README.md +++ b/samples/servicebus/java/README.md @@ -7,6 +7,23 @@ This sample demonstrates a Java Spring Boot application that sends and receives ## Architecture +The following diagram illustrates the architecture of the solution: + +```mermaid +flowchart LR + subgraph host["Host machine"] + app["Spring Boot app
ServiceBusSenderClient + @ServiceBusListener"] + end + + subgraph sbns["Service Bus namespace (Standard)"] + queue[["myqueue"]] + end + + app -->|"1: send 'Hello, World!'"| queue + queue -->|"2: deliver to @ServiceBusListener"| app + app -.->|"authenticates with AZURE_SERVICEBUS_CONNECTION_STRING"| sbns +``` + The solution is composed of the following Azure resources: 1. [Azure Resource Group](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-cli): A logical container scoping all resources in this sample.