Real-Time Intelligence: demo arc
Cíle kapitoly
- Popsat story arc RTI bloku A → B → F a roli jednotlivých dem z RTI Library
- Nakreslit architekturu ČHMÚ streamu: Eventstream → Eventhouse / KQL DB → dashboard → Power BI
- Znát rizika live dema a připravené fallbacky
- Projít pre-kurz checklist RTI části
Shrnutí rozhodnutí
Strategy shift: Z původního „2 demos pro live kurz" na reusable RTI Library s 6 demos. Demos jsou knihovna použitelná napříč kurzem, klientskými POCs, blog posty a konferenčními talky.
📁 Hlavní artefakt: RTI Library — viz runbooky 15–22 v těchto materiálech.
| Demo | Pattern | Auth | Use cases |
|---|---|---|---|
| A — Bicycles 60s | Sample Data | žádná | RTI opener, zero-setup intro |
| B — ČHMÚ Polling | HTTP poll → Custom Endpoint | žádná | Hlavní hands-on, navazuje na Days 1-2 |
| C — NDIC Traffic | HTTP poll s API key | API key | Auth pattern, real CZ infrastructure |
| D — Camera ALPR | Synthetic events → Custom Endpoint | žádná | IoT/camera pattern, nejvíc reusable |
| E — PID GTFS-RT | Protobuf adapter Notebook | API key | Adapter pattern, flagship blog material |
| F — Activator Alerts | bolt-on k B/D | M365 | Detect → decide → act loop |
Pro Day 4 RTI blok: doporučená sekvence A → B → F, C/D/E zmínit jako „v knihovně máte i tohle".
Day 4 — RTI blok story arc
Pozice v Day 4 dle Trainer Prep Guide: Get started with Real-Time Intelligence (deck 4 + lab consolidation). Blok má dvě části — teorie a architektura, pak demo story arc níže.
Demo story arc
| Krok | Co se ukáže | Datový zdroj | Cíl pedagogicky |
|---|---|---|---|
| Opener: 60s Eventstream | New Eventstream → Sample data: Bicycles → preview events → No destination yet → Stop | Sample (Bicycles) | „Stream vznikne za minutu, pojď se podívat co v něm teče" |
| Eventhouse + KQL DB | Vytvoříme Eventhouse rti_demo, KQL DB chmi_stream, prázdná tabulka air_raw |
— | Ukázat koncept Eventhouse jako container pro KQL DBs |
| CZ stream: ČHMÚ HTTP poll | New Eventstream → Custom endpoint (HTTP) → ČHMÚ recent CSV → Manage fields (parse CSV) → Destination = KQL DB | ČHMÚ recent/data/ |
Stejná data jako Days 1-2, ale v eventovém modelu — proč/kdy |
| KQL queries (live) | air_raw | take 10, summarize bin(startTime, 1h), make-series přes 24h |
KQL DB | KQL ↔ DAX/SQL analogie pro PBI publikum |
| Real-Time Dashboard | Pre-built dashboard: line chart per polutant, table top 10 stanic, time slicer | KQL DB | Sub-sekundový refresh, žádný PBI |
| PBI DirectQuery teaser | Otevřít pre-built .pbix, ukázat DirectQuery na KQL, refresh button |
PBI + KQL | „Když DirectQuery na KQL vs Direct Lake na Lakehouse — kdy co" |
Climax pedagogiky
Stejná data, dva enginy, jeden den. Days 1-2 zpracovaly batch ČHMÚ snapshot přes Lakehouse + Warehouse (medallion). Day 4 ukáže stream ČHMÚ recent přes Eventstream + Eventhouse. Audience tak uvidí stejný dataset ze dvou úhlů → pochopí, kdy je RTI overkill a kdy nutnost.
Architektura
┌──────────────────────┐
│ Sample: Bicycles │ (opener, MS native source)
└──────────┬───────────┘
│
│ (separate Eventstream, jen jako opener)
▼
[preview pane]
┌──────────────────────────────────┐
│ ČHMÚ recent CSV │ https://opendata.chmi.cz/air_quality/recent/data/
│ (poll 1× za 5 min přes HTTP) │ airquality_1h_avg_CZ.csv
└──────────┬───────────────────────┘
│
▼
┌──────────────────────────────────┐
│ Eventstream (Custom HTTP source) │
│ - parse CSV → JSON events │
│ - Manage fields (rename cols) │
└──────────┬───────────────────────┘
│
▼
┌──────────────────────────────────┐
│ Eventhouse: rti_demo │
│ └── KQL DB: chmi_stream │
│ ├── air_raw (ingest) │
│ ├── air_clean (update │
│ │ policy: dedup + │
│ │ join s dim_*) │
│ └── MV: last_per_station │
└──────────┬───────────────────────┘
│
├──► Real-Time Dashboard (mapa, line chart, top 10)
│
└──► Power BI (DirectQuery, composite model nad
gold layer z Days 1-2 + KQL current state)Risk register & fallbacks
| Risk | Pravděpodobnost | Mitigation | Fallback |
|---|---|---|---|
| ČHMÚ endpoint nedostupný během demu | Low | Pre-cache 24h history do KQL den předem | Pre-built KQL DB s 24h daty + Sample Bicycles na live část |
| Eventstream HTTP source nezvládá CSV | Medium | Otestovat 1 týden před kurzem; alternativa = Notebook poller → EventHub | Notebook v F2 capacity poslal sám CSV poll → Eventstream Custom App input |
| F2 capacity Spark cold start kolize s Eventstream | Low | Eventstream běží na shared backend, ne CU | — |
| KQL DB cold (< 1 měsíc starý) má lag | Low | Den předem warmup query | Force refresh přes UI |
| Real-Time Dashboard nerenderuje mapu | Medium | Pre-built dashboard checked-in jako template | Statický PBI map visual jako záskok |
| F2 → 90s lag při ingest | Medium | Akceptovat, vysvětlit jako story | F64 trial workspace pro plynulejší demo (přepnout workspace) |
Pre-kurz checklist (RTI specific)
A. Workspace
- ☐ V
DP600_Demo_CHMIworkspace přidatRealTimefolder - ☐ Vytvořit Eventhouse
rti_demo - ☐ Vytvořit KQL DB
chmi_streamuvnitř Eventhouse - ☐ Pre-create tabulky:
air_raw,air_clean, MVlast_per_station(skripty viz runbook B, sekce KQL setup)
B. Eventstreams
- ☐ Eventstream
es_bicycles_demo(Sample → preview only, žádný sink) - ☐ Eventstream
es_chmi_recent(HTTP source → KQL DB destination, parse CSV) - ☐ Test pre-run: 1 hod běhu, ověřit že events tečou do
air_raw
C. Pre-cached data (failsafe)
- ☐ Den před kurzem: spustit poller na 24h, naplnit
air_rawcca 11k events (467 stanic × 24h) - ☐ Verify:
air_raw | count>= 10000
D. Real-Time Dashboard
- ☐ Pre-built dashboard
chmi_lives 4 tiles:- Line chart:
summarize avg(value) by bin(startTime, 1h), idValueType(zoom 24h) - Top stations:
summarize last_value=arg_max(startTime, value) by idRegistration | top 10 - Total events:
count - Map: pivot stanic přes lookup z
dim_station(lat/lon)
- Line chart:
E. Power BI
- ☐ Pre-built
.pbixs DirectQuery connection na KQL DB - ☐ Composite model: KQL DB (current) + Lakehouse Direct Lake (historical gold)
- ☐ Performance Analyzer screenshot pro srovnání DirectQuery/Direct Lake
F. Lectorské
- ☐ KQL cheat sheet vytištěný / sdílený (handout)
Reusable po kurzu
- Reusable workspace —
DP600_Demo_RTIzůstává jako showcase pro klienty - Konferenční talk — material navazuje na Days 1-2 story (batch vs stream nad stejnými daty)
Appendix A — Proč PID GTFS-RT není v hlavním arcu
Hidden costs, které dělají PID GTFS-RT špatným fitem pro live demo:
- Format = Protobuf. Eventstream HTTP source pošle bytes do KQL jako blob, KQL nemá nativní Protobuf decoder. Řešení = Notebook adapter (poll → decode přes
gtfs-realtime-bindings→ publish JSON do EventHub → Eventstream → KQL). To přidá netriviální setup a druhou službu. - Auth = Golemio API klíč (operator ICT). Free tier 60 req/min, vyžaduje registraci a NDA-style ToS. Live demo s neověřeným klíčem = riziko 401/429.
- F2 capacity stress. GTFS-RT snapshot = ~3000 vehicles × 100 bytes = 300KB každých 20s. Notebook adapter na F2 (spark cold start 1-2 min) je per definice nestabilní.
Přesto stojí za ukázku (viz runbook E):
- Architektura: Notebook (Pure Python, polars + gtfs-realtime-bindings) → REST API loop → JSON events → Eventstream Custom App input → KQL DB → Real-Time Dashboard s mapou.
- Story arc: „Co Microsoft Fabric out-of-the-box neumí (Protobuf), ale 50 řádků Pythonu vyřeší."
- Audience: praktici, kteří chtějí vidět real-real-time CZ data.
Reference
- ČHMÚ recent: https://opendata.chmi.cz/air_quality/recent/data/
- Fabric RTI: https://learn.microsoft.com/fabric/real-time-intelligence/overview
- Eventstream HTTP source: https://learn.microsoft.com/fabric/real-time-intelligence/event-streams/add-source-custom-app
- KQL DB: https://learn.microsoft.com/fabric/real-time-intelligence/create-database
- Update policies: https://learn.microsoft.com/kusto/management/update-policy
- Real-Time Dashboard: https://learn.microsoft.com/fabric/real-time-intelligence/dashboard-real-time-create
- (parked) PID Golemio: https://api.golemio.cz/v2/pid/docs/openapi/
- (parked) GTFS-RT: https://gtfs.org/realtime/