Search code examples
pythonpowerbidatabricksazure-databricks

"Exception: Power BI report is not embedded" inside Azure Databricks


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.

  • Azure Databricks cluster: Personal Compute, runtime 15.3
  • Packages of interest:
    • powerbiclient==3.1.1

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?


Solution

  • Posting an answer for community reference:

    Initially I got the same error:

    For report.get_pages() got Power BI report is not embedded:

    enter image description here

    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)
    

    enter image description here

    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.

    enter image description here

    Reference:

    "Exception: Power BI report is not embedded" inside Azure Databricks · Issue #54 · microsoft/powerbi-jupyter · GitHub by orshemesh16