In PowerBI, real-time streaming can be consumed in three (please visit https://docs.microsoft.com/en-us/power-bi/service-real-time-streaming
) different ways listed below:
- Consuming streaming data from Azure Stream Analytic
- Consuming streaming data from PubNub
- Consuming streaming data vis PushDataset
If you have got
sensors which are emitting data and you want to visualize it in real-time, you
can use PowerBI in conjunction with Azure Stream Analytics to build the
dashboard. But if data is less frequent and you want to have a dashboards that
auto-refreshes then you can use any one of three methods. In this post I will
show how Push Datasets can be used to develop a dashboard.
Below is a simple
architecture for this post:
We need following
components to build a complete end-to-end simple solution shown in above
diagram:
- Data Generator (to simulate data is coming to db at every x interval). This could your source which generates data less frequently.
- Console App (that pushes data to PowerBI PushDataset)
- PowerBI Dashboard
I have created a
sample code that generates some data and inserts into database. Please see
below code snippet:
The console application will be leveraging PowerBI REST API programming
interface for pushing data. For this reason, console app needs to authenticate/authorize
with PowerBI. So you need to register your console app with Azure AD in order
to get OAuth token from Azure Authorization server. Please follow https://docs.microsoft.com/en-us/power-bi/developer/walkthrough-push-data-register-app-with-azure-ad
to register your app.
OAuth provides four
different OAuth flows based how you want to authenticate/authorize your
application with Authorization server. Please visit https://auth0.com/docs/api-auth/which-oauth-flow-to-use
to know which flow is best suited for your scenario.
I will be using Client
Credential Flow (an OAuth flow which can be read at https://oauth.net/2/grant-types/client-credentials/
) as console app will be treated as trusted application and also there would
not be any human interaction if any authorization popup appears it would not be
able to deal with.
Below is the code to
get oauth token using Microsoft.IdentityModel.Clients.ActiveDirectory version
2.29.0 of nuget package:
I treat this scenario
as syncing two systems (from source to target but target is PowerBI). Most of
the syncing solution, we need to maintain what we have synced so far so that
next time system should pick delta of data.
For this purpose, we
are using ROWVERSION datatype which is auto generated by database. Please visit
https://www.mssqltips.com/sqlservertip/4545/synchronizing-sql-server-data-using-rowversion/
for how to use rowversion for syncing scenario.
To maintain what has
been synced, I have created a table to keep track the last row version, console
application has sent to PowerBI, against a table like shown below:
For the first time,
last row version should 0x000.
I also created a
stored procedure that returns delta
with the help of last row version and table name. Below is the stored procedure
code:
Now, we got the data (delta
amount), we need to send it to PushDataset in PowerBI. Every PushDataset has a
unique id, and data needs to be sent to correct id.
I have created a
dataset called “DeviceTelemetry” using REST API. To find the dataset id, you
need to call the Power BI REST API like shown below:
And result is shown
like below:
Now we got the Dataset
Id as GUID, we need to use it to send data to Power BI. We will use PowerBI
REST API to do this. You can do it in your console app to fetch all the
datasets and grab the id for which you want to send to. For demonstration
purpose I have shown you how you achieve it.
Now, the console app
can you use dataset id and keep pushing data to it. Again you can leverage
Power BI REST API to send data into batches or one by one. Below is a snapshot
how I am sending data:
Here is the code that
wraps to add rows to PowerBI PushDatasets leveraging api wrapper:
Here is the code for
PowerBI Rest Api wrapped around a nice method:
Once your console app
start sending data, you can go to PowerBI.com and start creating reports and
dashboard like shown below:
Note that the dataset
is listed as Push dataset.
Click on red boxed
area (create report link) to create report as I created reports and composed
them into one dashboard shown below:
That’s it so far.