Microsoft Fabric, Databricks, Power BI, Real Time Intelligence

Tag: Data Agent

Measured, not estimated: what Real-Time Intelligence in Microsoft Fabric really costs

1. Introduction

When you start with Real-Time Intelligence in Microsoft Fabric, the question of cost comes up sooner or later. Microsoft documents the billing meters, but it’s hard to tell what a complete solution with Eventstream, Eventhouse, a Real-Time Dashboard and Activator will cost in the end.

I also get asked one question a lot: does every transformation in an Eventstream use extra capacity?

I didn’t want to guess, so I measured it. My example is the power grid project from my last article. It uses all the typical parts of an RTI solution. Over several days, I tracked it in the Fabric Capacity Metrics app and checked how much each part uses.

What surprised me most was that the amount of data hardly matters. The architecture does. How many processing steps the Eventstream has and where it sends the data makes a much bigger difference than a few megabytes more or less per day.

In this article, I’ll show how Real-Time Intelligence is billed, how to read the numbers in the Capacity Metrics app, and what I would keep in mind for future projects.

2. The setup

My example is the power grid project. You’ll find the details in my last article, so here I’ll focus on the parts that matter for the cost.

Architecture diagram of a Real-Time Intelligence solution in Microsoft Fabric. Azure Functions outside Fabric send events to an Eventstream, which writes to an Eventhouse over two routes. A Real-Time Dashboard, Activator and a data agent read from the Eventhouse. Each component is labeled with its billing meters from the Fabric Capacity Metrics app: Eventstream Per Hour, Data Traffic and Processor per route, EventHouse UpTime, Activator Rule Uptime, Event Ingestion and Event Computations, and AI Query for the data agent. Dashboard and agent queries are billed on the Eventhouse. OneLake storage is billed separately.
Where each billing meter applies in a Real-Time Intelligence solution.

Four Azure Functions query the Energy-Charts API and send the data to a custom endpoint in the Eventstream over the Event Hubs protocol. Grid frequency arrives every minute with one value per second, power generation and prices every 5 and 15 minutes.

In the Eventstream, I split the data into two paths: grid frequency goes into its own table, everything else into a second one. On both paths, “Manage fields” converts timestamps and values to the right data types. Both paths end in the same Eventhouse. There, the raw data sits in two tables, and materialized views keep the latest version of each value.

Three things read from the Eventhouse: a Real-Time Dashboard with three pages, Activator with seven rules that run a KQL query at a fixed interval, and a data agent.

How I measured

All numbers in chapter 5 come from one day: October 22. The solution ran for 24 hours on a Fabric trial capacity, which is the same size as an F64, without pausing and without any changes. The Event throughput setting in the Eventstream was “Low”, and I had the dashboard open for about three and a half hours, like on a normal working day.

Before that, I ran the solution on an F2 for two days. What happened there gets its own chapter. I tested the data agent separately, more on that in chapter 7.

The Azure Functions are not included. They run in Azure and don’t show up on the Fabric capacity.

3. How Real-Time Intelligence is billed

Every part of Fabric uses Capacity Units (CU) from the same capacity. In the Capacity Metrics app, this shows up as operations for each item. For Real-Time Intelligence, these are the ones that matter. For each part, I’ve linked the Microsoft documentation the numbers come from, so you can check the details and the current rates yourself.

Eventstream

The Eventstream has the most billing meters (Microsoft Learn):

OperationWhat it billsRate
Eventstream Per Hourflat charge while data is flowing0.222 CU hours per hour
Eventstream Data Traffic Per GBdata in and out, per stream0.342 CU hours per GB
Eventstream Processor Per Hourprocessing, per routefrom 0.778 CU hours per hour
Eventstream Connector Per vCore-hourconnector sources like Azure SQL CDC0.611 CU hours per vCore

The processor is the one to watch. It’s billed per processing route, meaning each path from the source through the processing steps to a destination. The number of operators on a route doesn’t matter, but the number of routes does. 0.778 CU hours is the minimum with the throughput setting “Low”. Under more load, the processor scales up on its own.

The destination matters too. Lakehouse, Activator and an Eventhouse with transformations are push destinations: the Eventstream does the processing itself and pays for it with processor time. An Eventhouse with direct ingestion and a custom endpoint pull the data themselves. For those, the Eventstream has no processor cost.

If no data flows for more than two hours, the flat charge, traffic and processor all stop.

Eventhouse

The Eventhouse basically has one meter: EventHouse UpTime. It’s the time the Eventhouse is active, multiplied by the vCores it uses. Without load, the Eventhouse suspends. But when new data arrives every minute, like in my project, it never gets the chance.

All queries run on the Eventhouse too: the ones from the dashboard, from Activator and from the data agent. They don’t show up as separate operations. They only add to the uptime when the Eventhouse needs more compute for them.

Activator

Activator has three meters: Rule Uptime Per Hour as a base charge for every active rule, Event Ingestion for incoming events and Event Computations for evaluating the rules. One thing to keep in mind: an active rule costs something even when no data comes in. It’s worth stopping old test rules.

Real-Time Dashboard

The dashboard doesn’t have a meter of its own. Its tile queries run on the Eventhouse and are part of the uptime there. Only Copilot in the dashboard shows up separately, as “Copilot In Fabric” on the dashboard item.

Data agent

The data agent shows up as the item kind “LlmPlugin” with the operation “AI Query”. It’s billed by tokens: 100 CU seconds per 1,000 input tokens and 400 CU seconds per 1,000 output tokens. Input isn’t just the question. The agent instructions, example queries and chat history count too. The KQL queries the agent runs are executed on the Eventhouse and billed there.

Storage

Storage isn’t part of the capacity. Data in the Eventhouse and Eventstream retention beyond 24 hours are billed separately as OneLake storage.

Rates as of October 2026. Microsoft can change them at any time, so check the linked pages for the current values.

4. How to measure it

All numbers in this article come from the Fabric Capacity Metrics app. I used the new preview version. Here’s how I read it, and a few things I ran into along the way.

Smoothed or unsmoothed

The Compute page has three views: “Smoothed: Last 24 hours”, “Smoothed: Last 14 days” and “Unsmoothed: Last 14 days”. Fabric spreads background operations over 24 hours. That’s called smoothing, and it decides when your capacity throttles. If you look at a smoothed view right after starting a capacity, the usage looks like it’s slowly climbing. It isn’t. Fabric just hasn’t spread enough operations yet.

For totals, use the unsmoothed view. It shows the real CU seconds per item and day. Filter on your workspace, pick a date range, and expand each item under “CU (s) by Itemkind” to see its operations.

Fabric Capacity Metrics app, unsmoothed view, CU (s) by Itemkind. The Eventstream item is expanded and shows its operations: Eventstream Processor Per Hour with 136,247 CU seconds, Eventstream Per Hour with 19,447, Eventstream Data Traffic Per GB with 964, and Eventstream Connector Per vCore-hour with 0.
The unsmoothed view with an expanded item shows the CU seconds per operation.

One catch: the app doesn’t update in real time. New numbers can take a while to show up, so don’t panic if today looks empty.

From CU seconds to something useful

The app shows CU seconds. Divided by 3,600, you get CU hours. Divided by the hours your capacity was running, you get the average CU per hour. That’s the number you can compare with a capacity: an F2 gives you 2 CU, which is 48 CU hours per day.

To find out how long the capacity was actually running, I use a small trick. The Eventstream flat charge is 0.222 CU hours for every hour data is flowing. So “Eventstream Per Hour” divided by 799.2 (0.222 × 3,600) gives you the number of active hours. The same works for the processor: divide it by 2,800.8 (0.778 × 3,600) and by the active hours, and you get the number of routes you’re billed for.

Things I ran into

  • Numbers stay with the capacity. The app shows usage per capacity. If you move a workspace to a different capacity, the new numbers show up there, and the old ones stay where they were.
  • You only see what you’re admin of. The app only lists capacities where you’re a capacity admin. With a trial capacity, that’s the person who started it.
  • Pausing isn’t free. If your capacity is already over its limit, pausing clears the throttling right away. But Fabric bills everything it has carried forward at that moment. And while the capacity is paused, nothing gets ingested. Your Eventstream may have to be started again afterwards.
  • Consumption doesn’t depend on the size of the capacity. An item uses the same number of CUs on an F2 as on an F64. The size only decides how much fits before Fabric starts throttling. That’s why I can compare the F2 days in chapter 6 with the reference day.

5. The results

On October 22, the solution ran for 24 hours on the F64 trial capacity. All numbers come from the unsmoothed view, filtered on the project’s workspace.

Items table of the Fabric Capacity Metrics app for October 22 in the unsmoothed view: PowerMix Stream (Eventstream) 156,658 CU seconds, eh_1 (Eventhouse) 107,625, Power Mix Activator 13,563, KQL database 46, data agent 1, dashboard 0.
All items of the solution on October 22.

The base load

ComponentCU (s)CU per hourCU hours per dayShare
Eventstream156,6581.7942.956%
Eventhouse107,6251.2329.539%
Activator13,5630.153.75%
KQL database460.000.00%
Total277,8923.1776.1 

The whole solution uses 3.17 CU per hour, or 76 CU hours per day. On the F64 trial, that’s only about 5% of the capacity.

Eventstream: theory vs. measurement

OperationCU (s)per hourdocumented rate
Processor Per Hour136,2471.562 × 0.778 = 1.556
Per Hour19,4470.220.222
Data Traffic Per GB9640.010.342 per GB

With the clock trick from chapter 4: 19,447 divided by 799.2 gives 24.3 active hours. The processor divided by 2,800.8 and by those hours gives exactly 2.00. So I’m billed for the two paths with “Manage fields”, each at the minimum rate.

That answers the question from the introduction. Not every transformation costs extra, but every route does. And these two routes make up almost half of the whole base load: 49%. The amount of data hardly matters. About 0.8 GB per day costs around 140 times less than the processing.

Eventhouse

CU (s) by Itemkind with the Eventhouse expanded. EventHouse UpTime accounts for all 107,625 CU seconds, the OneLake operations are 0.
The Eventhouse is billed almost entirely by uptime.

All 107,625 CU seconds of the Eventhouse are “EventHouse UpTime”. It ran the whole day because new data arrived every minute.

Activator

CU (s) by Itemkind with Activator expanded: Rule Uptime Per Hour 13,520 CU seconds, Event Ingestion 35, Event Computations 9.
Activator pays for running rules, not for events.

13,520 of the 13,563 CU seconds are “Rule Uptime Per Hour”. Ingestion and evaluation together cost 44. With seven rules, that’s about 0.02 CU per rule and hour. What counts is the number of active rules, not the number of events.

Dashboard

I had the dashboard open for about three and a half hours that day. The dashboard item shows 0 CU seconds. The queries run on an Eventhouse that’s active anyway, so I couldn’t see any additional consumption.

CU (s) by Itemkind for October 22 with KustoDashboard expanded. Both dashboard operations, OneLake Read via Proxy and OneLake Other Operations, show 0 CU seconds.
Three and a half hours of dashboard use: 0 CU seconds on the dashboard item.

6. Special: what happens on an F2

The F2 is the smallest Fabric capacity, and it’s where many people start. I did too. Before the measurement on the trial, the solution ran on an F2 for two days.

The F2 gives you 2 CU, which is 48 CU hours per day. My solution needs 76. On paper, that’s about 160%. And that’s exactly what happened.

The consumption was the same

First, the good news for the measurement: on the F2, the solution used 3.22 CU per hour. On the F64 trial, it was 3.17. The items use the same, no matter the size of the capacity. The small difference comes from October 19, when I was still testing the agent and the dashboard, which also adds to the Eventhouse.

But the F2 couldn’t keep up

Fabric doesn’t stop right away when a capacity is over its limit. It pushes the extra usage into the future and catches up later. That works for a while. Late in the evening of October 20, it didn’t anymore: the capacity turned “At Risk”, and an hour later it started rejecting interactive queries.

Capacity heat map of the Fabric Capacity Metrics app for the F2 capacity. On October 19, it runs for a few hours and stays healthy. On October 20, it runs from the morning, turns yellow (At Risk) late in the evening and orange (Interactive Rejection) an hour later.
The F2 tipped over on the evening of the second day.

The Throttling tab shows how close the next stage was. Interactive rejection was at 100%, background rejection had already reached about 70%. At 100%, Fabric would have rejected background operations too, which means ingestion and Activator.

Throttling tab of the Fabric Capacity Metrics app with two charts. On October 20, interactive rejection reaches 100% and background rejection rises to about 70%.
Interactive rejection reached 100% on October 20, background rejection about 70%.

Why you might not notice

Data kept flowing into the Eventhouse the whole time. You’d only notice the problem when someone opens the dashboard or asks the agent a question, because those are exactly the queries that get rejected first.

What size it needs

An F4 gives you 96 CU hours per day. With 76, the solution runs at about 80%, which leaves some room for the dashboard and the agent. So for this solution, an F4 is the smallest capacity that works.

7. The data agent

The data agent is the only part of the solution that’s billed per use. So I tested it separately: on October 23, I asked it six questions in one new chat, on an F2 capacity, with the dashboard closed. Each answer took between 8 and 13 seconds.

  1. What is the renewable share right now?
  2. What is the current renewable share and traffic light?
  3. What is the current power mix?
  4. How much solar power was generated yesterday?
  5. What is the electricity price right now?
  6. When is electricity cheapest today?
Fabric data agent chat. The question “What is the electricity price right now?” is answered with the current day-ahead price of 12.299 ct/kWh for the quarter-hour starting at 12:00 on October 23, 2026, with a note that these are wholesale prices.
One of the six test questions.

About 1,400 CU seconds per question

CU (s) by Itemkind for October 23 with LlmPlugin expanded: AI Query 8,252 CU seconds, OneLake Iterative Read via Proxy 89, OneLake Read via Proxy 7, OneLake Other Operations 0.
Six questions to the data agent: 8,252 CU seconds for AI Query.

The six questions cost 8,252 CU seconds under “AI Query”. That’s about 1,400 CU seconds per question, or 0.38 CU hours. An F2 provides that much in about twelve minutes. Two days earlier, I had asked the same six questions on an F4, and the result was almost the same: 8,529 CU seconds.

With the rates from chapter 3, that’s roughly 10,000 input tokens and 1,000 output tokens per question. Most of it is input. The question itself is short, but the agent sends a lot along with it: the instructions, the example queries, the descriptions of the KQL functions and the chat history. The answers are short.

The KQL queries the agent runs aren’t in this number. They run on the Eventhouse and are billed there.

A cost you’d find somewhere else

One thing surprised me. On both test days, the dashboard item also showed “Copilot In Fabric” operations, run under my account, at exactly the time I asked the agent my questions. Together they came to about 970 CU seconds on each day. On the day I didn’t use the agent, it was 0. I don’t know why Fabric assigns this to the dashboard and not to the agent. But in practice, it’s part of what the agent costs.

Item Detail page of the Fabric Capacity Metrics app for the dashboard on October 23. A Copilot In Fabric background operation with 973 CU seconds and a duration of 180 seconds starts at the same time as the agent questions.
During the agent test, the dashboard item shows a Copilot operation of 973 CU seconds.

Including it, the six questions cost about 9,300 CU seconds, or roughly 1,550 per question.

What that means in practice

Simple questions like these are cheap one at a time. But they add up:

Questions per dayCU hours per day
104
208
5019
10038

With a base load of 76 CU hours, my solution runs at about 80% on an F4. Fifty questions a day would bring it to almost 100%. So if a team uses the agent regularly, it’s worth planning for it when choosing the capacity.

Testing costs too

While I built the agent, I tested a lot: writing instructions, adding example queries, asking the same question again and again. Over those days, the agents in my project workspace used more than 35,000 CU seconds. That’s about as much as an F2 provides in five hours. If you’re building an agent on a small capacity, keep an eye on that.

8. What this means for your own projects

Your solution will look different from mine. But the rules behind the numbers are the same. Here’s what I would keep in mind.

1. Count routes, not transformations

In the Eventstream, every route costs at least 0.778 CU per hour, no matter how much data flows through it. That’s 18.7 CU hours per day, or almost 40% of an F2, for a single route. How many operators sit on that route doesn’t matter. So before you split a stream into several paths, ask yourself if you really need them.

2. Check where the Eventstream sends the data

Push destinations like a Lakehouse, Activator or an Eventhouse with transformations cost processor time. An Eventhouse with direct ingestion pulls the data itself and has no processor cost on the Eventstream side. If you only need to convert data types or split data into tables, you could also do that in the Eventhouse, for example with an update policy. I haven’t measured that yet, but it’s the first thing I would test.

3. An Eventhouse that gets data every minute never sleeps

The Eventhouse is billed by uptime. With continuous ingestion, that means 24 hours a day. In my solution, that’s almost 40% of the base load. Plan for it as a fixed cost.

4. Activator charges per rule

What counts is the number of active rules, not the number of events. In my case, that’s about 0.02 CU per rule and hour. Stop rules you don’t need, especially old test rules.

5. Looking at a dashboard is almost free, Copilot isn’t

Three and a half hours with the dashboard open didn’t add anything I could measure. The queries run on an Eventhouse that’s active anyway. Copilot is a different story: whenever I used the data agent, a Copilot operation of about 970 CU seconds showed up on the dashboard item.

6. The data agent is billed per question

About 1,400 CU seconds per question in my tests. That’s fine for a few questions a day, but with regular use, it adds up quickly. And building the agent costs too, because every test question sends the full instructions along.

7. The smallest capacity is often too small

My solution needs 76 CU hours per day. An F2 gives you 48. So for this project, an F2 isn’t enough. It ran for a while, but after a day and a half, Fabric started rejecting queries. An F4 with 96 CU hours runs at about 80%, which leaves some room for the dashboard and a few agent questions. With heavy agent use, even that gets tight.

And keep in mind: when a capacity is too small, ingestion keeps running for a long time. The first thing that fails are the queries from the dashboard and the agent. So the problem shows up when someone wants to look at the data, not when the data comes in.

8. Measure before you choose a size

Run your solution for 24 hours and look at the unsmoothed view in the Capacity Metrics app. Add up the CU hours per day and compare them with the capacity. Then add what users will do on top: dashboards, agent questions, Copilot. That gives you a much better answer than any estimate.

9. Conclusion

I started with a simple question: does every transformation in an Eventstream use extra capacity? The answer is no, but every route does. In my solution, two routes with “Manage fields” make up almost half of the whole base load. The amount of data hardly matters.

The measurement also showed how the rest adds up. The Eventhouse runs around the clock because data arrives every minute. Activator charges for every active rule. Looking at the dashboard costs practically nothing, while every question to the data agent does. All together, the solution needs 76 CU hours per day. That’s too much for an F2 and fits well on an F4.

What surprised me most was how precisely the numbers in the Capacity Metrics app match the Microsoft documentation. With a bit of math, you can trace almost every CU second back to a part of your architecture. That’s also my main tip: don’t estimate, measure. 24 hours in the unsmoothed view tell you more than any calculator.

There’s one thing I want to try next: what happens if the Eventstream only passes the data through and the Eventhouse does the splitting and type conversion with an update policy? On paper, that should save most of the processor cost. Whether the Eventhouse then needs more instead, I’ll find out in the next measurement.

If you want to try it yourself, you’ll find the project, all KQL queries and the Fabric items in my GitHub repo: real-time-intelligence-project-energy

Microsoft documentation

From API to Data Agent: Germany’s power grid with Real-Time Intelligence in Microsoft Fabric

1. Introduction

In my latest project, I wanted to find out what Real-Time Intelligence in Microsoft Fabric can do in practice. As an example, I picked the German power grid. The data never stands still: sometimes wind and solar cover more than the entire demand, sometimes the electricity price drops below zero, and the grid frequency moves around 50 Hz second by second.

My goal was to load this data into Fabric continuously, make it visible in a Real-Time Dashboard and use Activator to send automatic email alerts when certain things happen, such as negative electricity prices. As a final step, I wanted to put an AI component on top: a data agent you can ask questions about the power grid in plain language.

Continue reading