We are trying to use the powerbiclient
package inside an Azure Databricks notebook to get information on reports but we are getting the error Exception: Power BI report is not embedded
.
The same code works instead if we use it locally on Visual Studio Code.
Here is the code we are using:
!pip install powerbiclient==3.1.1
dbutils.library.restartPython()
from powerbiclient import Report, models
from io import StringIO
from ipywidgets import interact
import requests
import json
We tried both authenticating via Device Code Login and Service Principal, but we need to stick with the second option:
# # option 1
# from powerbiclient.authentication import DeviceCodeLoginAuthentication
# device_auth = DeviceCodeLoginAuthentication()
# option 2
def azuread_auth(tenant_id: str, client_id: str, client_secret: str, resource_url: str):
"""
Authenticates Service Principal to the provided Resource URL, and returns the OAuth Access Token
"""
url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/token"
payload = f'grant_type=client_credentials&client_id={client_id}&client_secret={client_secret}&resource={resource_url}'
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
response = requests.request("POST", url, headers=headers, data=payload)
access_token = json.loads(response.text)['access_token']
return access_token
tenant_id = 'XXX'
client_id = 'YYY
client_secret = 'ZZZ'
scope = 'https://analysis.windows.net/powerbi/api/.default'
resource_url = 'https://analysis.windows.net/powerbi/api'
token = azuread_auth(tenant_id, client_id, client_secret, resource_url)
And then we call the report:
group_id = '123-456'
dataset_id = 'abc-def'
report_id = '7g8-h9i'
report = Report(group_id=group_id, report_id=report_id, auth=token)
But we see that it is not embedded:
print(report._embedded)
# False
If we try to display the report we obtain nothing:
def loaded_callback(event_details):
print('Report is loaded')
report.on('loaded', loaded_callback)
def rendered_callback(event_details):
print('Report is rendered')
report.on('rendered', rendered_callback)
report.set_size(200, 300)
report
And if we try to get the pages we get the aforementioned error:
pages = report.get_pages()
Exception Traceback (most recent call last)
File <command-2809091020085831>, line 3
1 report_dict = {}
2 # Get list of pages
----> 3 pages = report.get_pages()
4 for page in pages:
5 report.set_active_page(page['name'])
File /local_disk0/.ephemeral_nfs/envs/pythonEnv-48b6b502-a176-4d52-a15d-9ed2a921ac04/lib/python3.11/site-packages/powerbiclient/report.py:566, in Report.get_pages(self)
560 """Returns pages list of the embedded Power BI report
561
562 Returns:
563 list: list of pages
564 """
565 if not self._embedded:
--> 566 raise Exception(self.REPORT_NOT_EMBEDDED_MESSAGE)
568 # Start getting pages on client side
569 self._get_pages_request = True
Exception: Power BI report is not embedded
Is there a way to embed PowerBI reports inside Azure Databricks notebooks?
Posting an answer for community reference:
Initially I got the same error:
For report.get_pages()
got Power BI report is not embedded:
And when I tried to print report, it gave me null output:
def azuread_auth(tenant_id: str, client_id: str, client_secret: str, resource_url: str):
"""
Authenticates Service Principal to the provided Resource URL, and returns the OAuth Access Token
"""
url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/token"
payload = f'grant_type=client_credentials&client_id={client_id}&client_secret={client_secret}&resource={resource_url}'
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
response = requests.request("POST", url, headers=headers, data=payload)
access_token = json.loads(response.text)['access_token']
return access_token
tenant_id = 'TenantID'
client_id = 'ClientID'
client_secret = 'ClientSecret'
scope = 'https://analysis.windows.net/powerbi/api/.default'
resource_url = 'https://analysis.windows.net/powerbi/api'
token = azuread_auth(tenant_id, client_id, client_secret, resource_url)
group_id = 'GroupID'
report_id = 'ReportID'
report = Report(group_id=group_id, report_id=report_id, auth=token)
report._embedded=True
print(report._embedded)
Note that: Azure Databricks notebooks does not support displaying the widget and hence it is not currently possible to display the report. Refer this MsDoc
Alternatively, you can make use of Jupyter Notebook, to display the report by modifying the code by including report._embedded=True
if it is suitable for your environment.
Reference:
"Exception: Power BI report is not embedded" inside Azure Databricks · Issue #54 · microsoft/powerbi-jupyter · GitHub by orshemesh16