Runbook A: Bicycles 60s
Cíle kapitoly
- Vytvořit Eventstream s ukázkovým zdrojem Bicycles během minuty
- Ukázat live preview eventů a vysvětlit EventEnqueuedUtcTime
- Volitelně napojit KQL DB jako destination a spustit první dotaz
Úvod
Pattern: Sample Data (MS native source) · Auth: žádná· Risk: none Fabric capacity: F2 OK
Cíl
Krátká ukázka „Eventstream existuje, vyrobíme ho za minutu, podívej se co teče". Žádný destination, žádná persistence — jen visual proof, že real-time data jsou tady.
Story (jak to říct nahlas)
„Real-Time Intelligence v Fabricu je sada propojených komponent. Začneme úplně nejjednodušším: Eventstream s ukázkovým zdrojem. Microsoft k tomu má přibalený Bicycles dataset — simulovaná data z bike sharing systému Londýna. Za minutu uvidíme, jak data fyzicky tečou."
Kroky
1. Vytvoř Eventstream
V workspace DP600_Demo_RTI:
- + New item → Eventstream
- Name:
es_a_bicycles - Enable Enhanced capabilities (default in 2026)
- Create
2. Přidej Sample source
V Eventstream editoru:
- Add source → Sample data
- Sample data type:
Bicycles - Source name:
bicycles_sample - Add
Eventstream začne emitovat events v rytmu ~1/s. Schema:
BikepointID: string # "BikePoints_1", "BikePoints_2", ... Street: string Neighbourhood: string Latitude: float Longitude: float No_Bikes: int # bikes available No_Empty_Docks: int EventEnqueuedUtcTime: datetime # auto-added by Eventstream
3. Live preview
Klikni na source node bicycles_sample → Data preview tab dole.
Po ~5 sekundách začnou téct events. Refresh button vlevo dole.
Co ukázat publiku:
- "Events jsou JSON, každý je sám o sobě validní record"
- "EventEnqueuedUtcTime je auto-added — Fabric zná čas příchodu"
- "Tohle je raw stream. Žádné storage. Pokud teď zavřu, data zmizí."
4. (volitelné) Přidej destination = preview only
Aby publikum vědělo, že "skutečný" demo bude mít destination:
- Add destination → Custom endpoint (nebo "Eventhouse" → KQL DB)
- Pokud KQL DB: vyber
eh_rti_demo→kql_rti_demo→ tablea_bicycles_raw(vytvoř ji předtím přes script níže) - Wire source → destination drag&drop
- Publish
5. (volitelné) KQL query
V KQL DB query:
a_bicycles_raw | where EventEnqueuedUtcTime > ago(2m) | summarize total_bikes = sum(No_Bikes), total_docks_empty = sum(No_Empty_Docks) by bin(EventEnqueuedUtcTime, 30s) | order by EventEnqueuedUtcTime desc
Vrátí ti per-30s aggregated state Londýnské bike sítě.
6. Cleanup
Po demu stop ingestion v Eventstreamu (pravý horní roh → Pause). Necháváš Eventstream existovat pro příští demo, jen nestreamuje.
KQL setup (jen pokud chceš destination)
Spusť KQL skript (sekce níže) v kql_rti_demo.
Troubleshooting
| Problém | Řešení |
|---|---|
| "Sample data type Bicycles není v dropdownu" | UI změna — alternativa: Yellow Taxi, Stocks. Story je stejná. |
| "Data preview nic neukazuje" | Klikni Refresh dole. Někdy trvá 10-15s než source startne. |
| "Destination KQL DB chybí v dropdownu" | Eventhouse + KQL DB musí existovat ve workspace. Pokud ne, vytvoř je teď (1 klik). |
Metriky
| Metrika | Hodnota |
|---|---|
| Throughput (Bicycles sample) | ~1 event/s, ~50 KB/min |
| F2 capacity impact | < 0.1 CU/s |
Reuse v jiných kontextech
- Klientský POC opener — "ukážu vám za 60s, jak vypadá Fabric stream"
- Workshop intro — před tím, než se ponoří do composite real datasets
- Blog post intro — "v Fabricu real-time začíná za 60 sekund — tady je důkaz"
KQL setup skript
Kompletní obsah souboru — rozbalte a zkopírujte tlačítkem Kopírovat.
// Runbook A — Bicycles 60s · KQL setup // Idempotentní, lze spustit opakovaně. // Předpoklad: KQL DB `kql_rti_demo` v Eventhouse `eh_rti_demo`. // ────────────────────────────────────────────────────────────────── // 1. Bronze table — destination pro Eventstream `es_a_bicycles` // ────────────────────────────────────────────────────────────────── .create-merge table a_bicycles_raw ( BikepointID: string, Street: string, Neighbourhood: string, Latitude: real, Longitude: real, No_Bikes: int, No_Empty_Docks: int, EventEnqueuedUtcTime: datetime ) // Retention 7 days — data jsou demo only .alter table a_bicycles_raw policy retention @'{"SoftDeletePeriod": "7.00:00:00", "Recoverability": "Disabled"}' // ────────────────────────────────────────────────────────────────── // 2. Sanity queries (run after Eventstream je wired) // ────────────────────────────────────────────────────────────────── // Latest 10 events // a_bicycles_raw | top 10 by EventEnqueuedUtcTime desc // Per-30s aggregates // a_bicycles_raw // | where EventEnqueuedUtcTime > ago(5m) // | summarize total_bikes=sum(No_Bikes), total_empty=sum(No_Empty_Docks) // by bin(EventEnqueuedUtcTime, 30s) // | order by EventEnqueuedUtcTime desc // Top busy bikepoints (most bikes available) // a_bicycles_raw // | summarize arg_max(EventEnqueuedUtcTime, *) by BikepointID // | top 10 by No_Bikes desc // | project BikepointID, Street, Neighbourhood, No_Bikes, No_Empty_Docks