Real-Time Intelligence LIVE

Tool-belt series · Microsoft Fabric · Streaming & KQL

Stop reporting what happened.
Start reacting to what's happening.

Real-Time Intelligence is the half of Fabric that Power BI people skip — which is exactly why it's worth your weekend. It's a different query language, a different storage engine, and a genuinely different way of thinking: instead of a dashboard someone remembers to open, a rule that messages them. KQL is also, unexpectedly, the most enjoyable query language you'll learn this year.

Why this is the differentiation play

Nearly everyone in a finance or analytics group knows SQL and DAX. Almost nobody knows KQL, and almost nobody has built an alert that fires in seconds. That gap is not because it's hard — KQL is easier than SQL — it's because nobody in that world has had a reason to look at it yet.

You don't need IoT sensors to justify it. Failed payment runs, integration errors, approval queues, refresh failures, threshold breaches on a live balance — all of it is event data, and all of it is currently discovered by someone noticing on a Thursday.

01

The shift in one picture

Batch analytics answers "what happened last month". Real-time answers "something is happening now, and here's who needs to know". Different questions, different machinery.

Sources app & system events Event Hubs · Kafka CDC · job status Eventstream no-code ingestion filter · route transform in flight Eventhouse KQL database built for time-series billions of rows, sub-second queries Real-Time Dashboard for when someone IS watching Activator for when nobody is Teams email the whole point: the bottom path needs no human to be looking

Real-Time Hub sits across all of it as the catalogue of what's streaming in your tenant.

02

The four parts, and what each is for

Same trick as the rest of Fabric: a handful of items, each an engine pointed at data. Learn what each one is for and the menu stops being intimidating.

Ingest

Eventstream

A no-code pipeline for events. Connect a source, optionally filter/aggregate/route in flight, and send it to a destination — usually an Eventhouse, but it can also land in a lakehouse.

Think of it as: Data Factory for things that never stop arriving.

Store & query

Eventhouse / KQL database

A columnar store descended from Azure Data Explorer, built for append-heavy, time-stamped data. Automatic indexing on time, retention policies, and it stays fast at volumes that would make a warehouse sweat.

Think of it as: the right home for anything with a timestamp and a lot of rows.

Show

Real-Time Dashboard

Native KQL-backed dashboards that auto-refresh on a live tile cadence, built for operational watching rather than monthly reporting. Point one straight at an Eventhouse table — no extra pipeline needed.

Think of it as: a wall screen, not a board pack.

React

Activator

Rules over streams, KQL results or Power BI visuals. When a condition holds, it fires — Teams message, email, or a Power Automate flow that does something.

Think of it as: the part that makes all the rest worth building.

The one that's newestEventhouse is now the default analytical store for business events in Fabric — create a business event in Real-Time Hub and each one maps to its own KQL table, automatically ingested and retained. That's platform-level activity (items changed, jobs run, workspaces updated) becoming queryable data, which is a governance and monitoring goldmine most people haven't noticed yet.
03

KQL in ten minutes — it's easier than SQL

One idea carries the whole language: start with a table, then pipe it through steps that each change it a bit. Top to bottom, in the order things happen — unlike SQL, where you write SELECT first and it executes almost last.

The shape of every KQL query

FailedPayments
| where Timestamp > ago(1h)              // filter first — always
| where Amount > 10000
| summarize Failures = count() by Vendor  // group
| order by Failures desc
| take 10

Read it as a sentence: take FailedPayments, keep the last hour, keep the big ones, count by vendor, sort, show ten. Each line takes a table in and hands a table out. That's the entire mental model — and it's why KQL is easier to compose than SQL: you build it up one line at a time and can run it after every line to see what you've got.

Filter first, alwayswhere on the timestamp should be your first line in essentially every query. These tables hold billions of rows; the time filter is what keeps it instant — and it's the single biggest driver of both speed and cost.

The eight operators that cover almost everything

OperatorWhat it doesSQL equivalent
whereKeep matching rowsWHERE
projectPick / rename columnsSELECT
extendAdd a calculated columnSELECT ..., x AS y
summarizeAggregate by somethingGROUP BY
order bySortORDER BY
take / topLimit rowsTOP / LIMIT
joinCombine tablesJOIN
renderDraw a chart, instantlyno equivalent — and it's lovely
The time-window trickbin() rounds timestamps into buckets, which is how every time-series chart gets built. summarize count() by bin(Timestamp, 5m) gives you a count per five minutes. Add | render timechart and you have a chart, from a query, in one line. There's genuinely nothing this pleasant in SQL.

Five queries worth stealing

// 1. what's happened in the last hour, by type
Events
| where Timestamp > ago(1h)
| summarize count() by EventType
| order by count_ desc

// 2. a chart of activity per 5 minutes
Events
| where Timestamp > ago(6h)
| summarize count() by bin(Timestamp, 5m)
| render timechart

// 3. is today unusual? compare to the same hour yesterday
Events
| where Timestamp > ago(25h)
| extend Period = iff(Timestamp > ago(1h), "now", "yesterday")
| summarize count() by Period, EventType

// 4. find the spikes — anomaly detection, built in
Events
| where Timestamp > ago(7d)
| summarize Cnt = count() by bin(Timestamp, 1h)
| extend (anomalies, score, baseline) = series_decompose_anomalies(Cnt)

// 5. latest status per entity — the dedup pattern, KQL-style
JobRuns
| summarize arg_max(Timestamp, *) by JobName
arg_max is the one to remember"Give me the whole row where this column is highest, per group." It's pattern 01 from the SQL page — ROW_NUMBER, PARTITION BY, filter to 1 — in a single readable line. Once you've used it you'll resent SQL slightly.
04

Activator — the part that changes your reputation

Everything above is plumbing. This is the bit people actually notice, and it's the smallest amount of work on the page.

The model: object, condition, action

  • What you're watching — a stream, a KQL query result, or a Power BI visual.
  • The condition — crosses a threshold, changes state, stays true for N minutes, or stops arriving entirely.
  • The action — Teams message, email, or a Power Automate flow that opens a ticket, writes a row, or kicks off a process.

Critically, Activator can watch per entity, not just in aggregate — alert on each vendor that breaches, rather than on the total. That distinction is what separates a useful alert from a noisy one.

The rule that decides whether this succeedsAn alert that fires every day gets muted within a fortnight — and a muted alert is worse than no alert, because everyone still believes something is watching. Tune it until it's rare, make the message say what to do, and give every alert a named owner. Alert fatigue kills more monitoring projects than technology ever does.

The "stopped arriving" alert nobody builds

Most people alert on bad values. The more valuable alert is on absence — the feed that went quiet, the nightly job that didn't report, the queue that stopped moving. Silence is the failure mode that reaches a board pack, because nothing looks wrong until someone asks why a number hasn't moved.

It's also a nice piece of KQL: count the events in the recent window and alert when the count is zero, rather than when a value is high.

// no heartbeat in 30 minutes = something is wrong
Heartbeats
| where Timestamp > ago(30m)
| summarize LastSeen = max(Timestamp) by SourceSystem
| where isnull(LastSeen) or LastSeen < ago(30m)
05

What to actually build first

You don't have a factory floor. You do have plenty of event data hiding in plain sight — and the first one should take an afternoon, not a quarter.

  1. Monitor your own pipelines

    The safest possible starting point: nobody else is affected if you get it wrong, and you're the customer. Stream your pipeline run outcomes into an Eventhouse, then alert on failures — and on the sneakier one, a success with suspiciously few rows.

  2. Then a threshold someone currently checks by hand

    A balance, a queue length, an exposure, an exception count. Somebody opens a report each morning to look at it — replace that with a message that only arrives when it matters. Instantly popular.

  3. Then the silence alert

    Pick the feed whose absence would be most expensive and alert on it going quiet. This is the one that eventually saves someone's month-end, and it's the one nobody else thought to build.

  4. Learn KQL against real data while you do it

    Don't study it separately. Every one of the above needs a query; write them, break them, run them line by line. A week of that and you'll be the KQL person — which, in a finance organisation, means the only one.

Practical cautions

  • Set retention deliberately. Eventhouse will happily keep everything forever and bill you for it. Decide how far back you actually need — usually far less than instinct suggests.
  • It shares your capacity. RTI draws on the same CU pool as everything else. A firehose ingestion can affect other workloads, so watch the metrics app after you turn something on.
  • Real-time is an operational commitment. Something that alerts at 2am implies someone responds at 2am. Agree that before you build it, not after the first incident.
  • Not everything belongs here. If daily is genuinely fine, daily is cheaper, simpler and more robust. Use the latency question from the Solution Playbook before committing.
Where this takes youThe combination is rarer than you'd think: someone who models a gold layer properly and can write KQL and ships alerts people rely on. That person stops being asked for reports and starts being asked what should be built — which is the actual goal.
← back to the tool belt