为 Power BI 配置 Azure Log Analytics

Power BI 即将与 Azure Log Analytics 集成,以支持管理员和高级工作区所有者配置 Log Analytics 与其 Power BI 订阅的连接。 本文介绍了 Log Analytics 和 Power BI 之间集成的工作原理,以及如何针对你的环境进行配置。

可以通过两个元素将 Azure Log Analytics 用于 Power BI:

  • 在 Azure 门户中配置 Azure 订阅。
  • 在 Power BI 管理门户中为 Power BI 启用 Log Analytics。

以下部分将依次引导你逐一完成每个步骤来实现这两个目的。

“设置”窗格中打开的 Azure 连接选项卡的屏幕截图。

先决条件

你需要在 Azure 门户中创建 Log Analytics 工作区,然后才能从 Power BI 配置Log Analytics 集成。 还必须为 Power BI 服务提供 Azure 中的权限,以便能够写入日志。 具体要求包括:

  • 对 Azure 订阅的参与者访问权限。
  • 在要收集 Power BI 日志数据的 Azure 订阅中注册“microsoft insights”资源提供程序。
  • 在 Power BI 中设置 Log Analytics 集成的用户必须具有 Log Analytics 工作区的 Log Analytics 参与者角色。 如果无法分配“所有者”角色,请参阅常见问题解答以获取解决方法。

启用“microsoft insights”资源提供程序

Log Analytics 要求在 Azure 订阅级别启用“microsoft insights”资源提供程序。 下列步骤演示了此过程。

  1. 登录到 Azure 门户,选择要用于 Log Analytics 并且包含 Log Analytics 工作区的订阅。 在设置部分中,选择“资源提供程序”,如下图所示 。

    “设置”菜单选项的屏幕截图,其中已选择资源提供程序。

  2. 在“资源提供程序”下搜索 microsoft.insights。 然后选择“注册”。

    已注册 Microsoft.insights 的主窗格中资源提供程序的屏幕截图。

设置权限

  1. 确保配置 Log Analytics 集成的用户具有 Log Analytics 工作区的 Log Analytics 参与者角色。 在 Azure 门户中为订阅选择“访问控制 (IAM)”,然后从面板的顶部选项选择“角色分配”后,必须向当前用户显示一个条目:配置 Log Analytics 的用户的 Log Analytics 所有者

    “访问控制”窗格的屏幕截图,其中突出显示了角色。

完成以上步骤后,就完成了 Azure Log Analytics 配置部分。 下一节介绍如何继续完成 Power BI 管理门户中的配置。

允许在管理门户进行工作区级别日志记录

Power BI 管理员必须完成以下步骤才能为 Power BI Premium 工作区启用 Azure Log Analytics。 此设置支持 Power BI Premium 工作区管理员在满足先决条件后,可将其工作区日志发送到 Azure Log Analytics。

  1. 在“Power BI 管理门户”中,转到“租户设置 > 审核和使用情况设置”,然后展开“工作区管理员的 Azure Log Analytics 连接”。 要允许工作区管理员启用 Log Analytics,请将滑块设置为“已启用”,并在“应用于”下指定所需的安全组,如下图所示。

    管理门户中租户设置的屏幕截图。已展开且已启用工作区管理员的 Azure Log Analytics 连接。

在高级工作区中配置日志记录

  1. 在 Premium 工作区中,工作区管理员可以启用 Log Analytics。 为此,可转到“设置”,如下图所示。

    高级工作区中“设置”窗格的屏幕截图。

  2. 在“设置”窗格中,选择“Azure 连接”,然后展开“Log Analytics”,如下图所示。

    “设置”窗格中打开的 Azure 连接选项卡的屏幕截图,其中已展开 Log Analytics。

  3. 依次选择“Azure 订阅”、“资源组”和在上一部分中配置的 Log Analytics 工作区。 然后选择“保存”。 成功完成后,展开的“租户级 Log Analytics”部分的外观应与下图类似。

    “设置”窗格中打开的 Azure 连接选项卡的屏幕截图,其中显示的是示例信息。

断开 Azure Log Analytics

可以从 Azure Log Analytics 断开连接,停止将日志发送到 Azure。 要断开连接,请在“Power BI 工作区设置”中,转到“Log Analytics”设置。 选择“断开与 Azure 的连接”。 然后选择“保存”以断开连接。

“设置”窗格上断开连接警告的屏幕截图。

注意

将 Power BI 工作区从 Azure Log Analytics 断开连接时,不会删除日志。 数据将保留,并遵循此处设置的存储和保留策略。

使用方案

Azure Log Analytics 和 Power BI 可通过多种方式帮助解决组织的实际挑战。 考虑以下情况:

  • 按容量、工作区、报表或用户标识 Analysis Services 引擎活动频繁或异常的时间段。
  • 分析查询性能和趋势,包括外部 DirectQuery 操作。
  • 分析语义模型刷新持续时间、重叠和处理步骤。
  • 分析使用高级 XMLA 终结点发送的自定义操作。

在 Power BI 社区向我们发送有关你如何使用日志记录以及它如何帮助你所在组织的反馈。

错误情况和解决方法

下表提供了常见错误的集合和触发这些错误的事件或配置,以及建议的解决方法。

触发条件 类型 消息
你无权写入 Log Analytics 工作区 错误:无法继续 需要此 Log Analytics 工作区的写入权限,才能将其连接到 Power BI。 联系组织中管理 Azure 订阅的人员,以解决此问题。
你无权写入 Log Analytics 工作区帐户 错误:无法继续 需要此 Log Analytics 工作区的写入权限,才能将其连接到 Power BI。
你无权访问任何 Azure 订阅 错误:无法继续 无权访问任何 Azure 订阅 请求组织中管理 Azure 订阅的人员向你授予参与者访问权限或更高权限。
你无权访问该订阅内的任何 Azure Log Analytics 工作区 错误:无法继续 你无权访问 Azure Log Analytics 工作区。 请求组织中管理 Azure 订阅的人员将你添加到 Log Analytics 所有者或参与者角色。
尝试连接时禁用了工作区级别 Log Analytics 信息 请求租户管理员向工作区管理员授予连接 Log Analytics 工作区的权限。
尝试断开连接时禁用了工作区级别 Log Analytics 信息 租户管理员撤销了工作区管理员连接其自己的 Azure Log Analytics 工作区的权限。 如果断开连接,将无法连接到其他工作区。

事件和架构

启用 Azure Log Analytics 后,它会开始记录以下事件类别。 有关这些事件的详细信息,请参阅 Analysis Services 跟踪事件

  • AggregateTableRewriteQuery
  • 命令
  • 死锁
  • DirectQuery
  • 发现
  • 错误
  • ProgressReport
  • 查询
  • Session Initialize
  • VertiPaqSEQuery
  • 通知

下表介绍了架构。

属性 现有 Azure Analysis Services 属性 说明
TimeGenerated 生成日志的时间戳 (UTC)。
OperationName EventClass_s 与日志记录关联的 Analysis Services 跟踪事件。 有关每个类别可能的事件的更多详细信息,请参阅 AS 跟踪事件“文档”页。
CorrelationId 关联事件的 ID。 可用于标识多个表之间的关联事件。
PowerBIWorkspaceId 包含正在操作的项目的工作区的唯一标识符。
PremiumCapacityId 承载正在操作的项目的高级容量的唯一标识符。
ApplicationContext ApplicationContext_s 唯一标识符的属性包,提供有关执行请求的应用程序的详细信息。 例如,报表 ID。
ApplicationName ApplicationName_s 包含创建了到服务器连接的客户端应用程序的名称。 此列由应用程序传递的值填充,而不是由所显示的程序名填充。
ArtifactId 记录数据的资源的唯一标识符。
ArtifactKind 记录操作的项目的类型,例如语义模型。
CpuTimeMs CPUTime_s 事件所用的 CPU 时间(毫秒)。
ArtifactName DatabaseName_s 记录此操作的 Power BI 项目的名称。
LogAnalyticsCategory 唯一 与日志记录关联的 Analysis Services 跟踪事件类别。 有关可能的事件类别的更多详细信息,请参阅 AS 跟踪事件“文档”页。
DatasetMode 语义模型的模式。 Import、DirectQuery 或 Composite。
DurationMs Duration_s 操作使用的时间(毫秒)。
用户 User_s 与正在运行的操作关联的用户。 当必须在服务器上模拟最终用户身份时使用。
ExecutingUser EffectiveUsername_s 运行操作的用户。
OperationDetailName EventSubclass_s 有关与日志记录关联的 Analysis Services 跟踪事件的更多详细信息。 有关可能的值的更多详细信息,请参阅跟踪事件文档页的“子类”属性,例如 Command Begin
XmlaObjectPath ObjectPath_s 对象路径。 逗号分隔的父级列表,以对象的父级开头。
PowerBIWorkspaceName 包含该项目的 Power BI 工作区名称。
StatusCode Error_s 操作的状态代码 其中包括成功和失败。
ProgressCounter ProgressTotal_s 进度计数器。
XmlaProperties RequestProperties_s XMLA 请求的属性。
XmlaSessionId SPID_s Analysis Services 会话标识符。
级别 Severity_s 包含正在记录的操作的严重性级别。 成功、信息性、警告或错误。
标识 有关用户和声明的信息。
状态 操作的状态。
EventText TextData_s 包含与操作关联的详细信息,例如 DAX 查询。
CustomerTenantId 客户的 Power BI 租户标识符。
XmlaRequestId RootActivityId_g 请求的唯一标识符。
ReplicaID 在启用查询横向扩展 (QSO) 时,使用副本标识符可以识别副本。 读写副本始终具有 ReplicaId=“AAA”,并且只读副本的 ReplicaId 则从“AAB”开始。 对于未启用 QSO 的语义模型,ReplicaId 始终为“AAA”

ExecutionMetrics 事件

对于每个 Discover、Command 和 Query 请求,都会在请求结束时生成一个名为 ExecutionMetrics 的事件。 此事件包含请求的执行指标,可帮助你更有效地进行诊断和故障排除。 ExecutionMetrics 跟踪与最近的 [Discover|Command|Query]End 事件相关联

以下 KQL 查询检索语义模型在过去一天发生的所有刷新操作的 ExecutionMetrics 事件:

let commands = PowerBIDatasetsWorkspace
    | where TimeGenerated > ago(1d)
    | where ArtifactId =~ "[Semantic Model Id]"
    | where OperationName in ("CommandEnd")
    | where EventText contains "<Refresh"
    | project TimeGenerated, ArtifactId, CommandOperationName = OperationName, XmlaRequestId, CorrelationId, CommandText = EventText;
let executionMetrics = PowerBIDatasetsWorkspace        
    | where OperationName == "ExecutionMetrics"
    | project TimeGenerated, XmlaRequestId, CorrelationId, EventText;
commands
| join kind=leftouter executionMetrics on XmlaRequestId

以下 KQL 查询检索最近一天按工作区、项和用户限制的事件:

let executionMetrics = PowerBIDatasetsWorkspace
    | where TimeGenerated > ago(1d)    
    | where OperationName == "ExecutionMetrics"    
    | extend eventTextJson = parse_json(EventText)      
    | extend capacityThrottlingMs=toint(eventTextJson.capacityThrottlingMs)
    | where capacityThrottlingMs > 0;
let commands = PowerBIDatasetsWorkspace    
    | where OperationName in ("CommandEnd", "QueryEnd", "DiscoverEnd")    
    | project
        TimeGenerated,
        ExecutingUser,
        ArtifactId,
        PowerBIWorkspaceId,
        CommandOperationName = OperationName,
        XmlaRequestId,
        CorrelationId,
        CommandText = EventText;
commands
| join kind=inner executionMetrics on XmlaRequestId
| project
    TimeGenerated,
    ArtifactId,
    PowerBIWorkspaceId,
    ExecutingUser,
    CommandOperationName,
    XmlaRequestId,
    EventText,
    CommandText,
    capacityThrottlingMs
| summarize countThrottling = count(), avgThrottlingDuration = avg(capacityThrottlingMs) by PowerBIWorkspaceId, ArtifactId, ExecutingUser, CommandOperationName

统计信息在 EventText 属性中以 JSON 文本形式显示,请参阅以下示例

{
    "timeStart": "2024-03-20T12:39:59.681Z",
    "timeEnd": "2024-03-20T13:01:14.241Z",
    "durationMs": 1274559,    
    "vertipaqJobCpuTimeMs": 156,
    "mEngineCpuTimeMs": 9617484,
    "totalCpuTimeMs": 9618469,
    "executionDelayMs": 10,
    "approximatePeakMemConsumptionKB": 1683409,
    "mEnginePeakMemoryKB": 1676816,
    "tabularConnectionTimeoutMs": 18000000,    
    "refreshParallelism": 16,
    "vertipaqTotalRows": 114,
    "intendedUsage": 2
}

下表描述了所有可能的属性。 并非在每个事件中发出每个属性,因为内容取决于请求和语义模型。

properties 说明
timeStart 请求开始时的时间戳 (UTC)。
timeEnd 请求结束时的时间戳 (UTC)。
durationMs 执行的总持续时间。
datasourceConnectionThrottleTimeMs 达到数据源连接限制后的总限制时间。 在此处详细了解最大并发连接数。
externalQueryExecutionTimeMs 在请求期间执行所有外部数据源查询所用的总时间。
directQueryConnectionTimeMs 在请求期间创建新 DirectQuery 连接所花费的总时间
directQueryIterationTimeMs 迭代 DirectQuery 查询返回的结果所花费的总时间。
directQueryTotalTimeMs 在请求期间执行和读取所有 DirectQuery 查询所花费的总时间。
executionDelayMs 等待 Analysis Services 引擎线程池线程可用性所花费的总时间。
totalCpuTimeMs 请求的总 CPU 时间。
vertipaqJobCpuTimeMs Vertipaq 引擎花费的总 CPU 时间。
mEngineCpuTimeMs PowerQuery 引擎花费的总 CPU 时间。
queryProcessingCpuTimeMs Analysis Services 查询线程池线程上的任务花费的总 CPU 时间。
approximatePeakMemoryConsumptionKB 请求期间的近似峰值总内存消耗。
mEnginePeakMemoryKB 所有 PowerQuery 引擎糅合容器的近似峰值内存提交大小(以 KB 为单位)。
directQueryTimeoutMs 与 DirectQuery 查询关联的超时。
externalQueryTimeoutMs 与针对外部数据源的查询关联的超时。
tabularConnectionTimeoutMs 与外部表格数据源连接(例如 SQL)关联的超时。
refreshParallelism 请求中使用的有效 MaxParallelism。
vertipaqTotalRows 刷新操作期间 Vertipaq 引擎处理的总行数。
queryResultRows DAX 查询作为结果返回的总行数。
directQueryTotalRows 从各种 DirectQuery 查询读取的总行数。
directQueryRequestCount DAX 引擎执行的 DirectQuery 存储引擎查询总数。
errorCount 当前请求的错误总数。
qsoReplicaVersion 支持 QSO 的语义模型的副本版本,以 FILETIME 格式表示。
intendedUsage 预期用途:默认 (0);计划或 API 刷新 (1);按需刷新 (2);仪表板磁贴/查询缓存刷新 (3)
commandType 客户端请求的 Analysis Services 命令的类型(例如批处理、语句、备份...)
discoverType 客户端请求的发现类型。 有关发现类型的列表,请参阅 EventSubclass
queryDialect 用于查询服务器的方言客户端类型:未知 (-1);MDX (0);DMX (1);SQL (2);DAX (3);JSON (4)
capacityThrottlingMs 请求因容量限制而延迟的总时间。 在此处详细了解限制。
  • 所有持续时间和 CPU 时间均以毫秒为单位。
  • 可能会遇到上表中未描述的其他属性,应将这些属性视为未记录的属性,它们随时可能会更改。

Log Analytics KQL 查询示例

将 Azure Log Analytics 与 Power BI 结合使用时,以下示例查询集合可能会有所帮助。 可以直接在 Azure 门户中或通过 API 运行它们来查询最新数据(通常是大约 5 到 10 分钟前的数据)。

// log count per day for last 30d
PowerBIDatasetsWorkspace
| where TimeGenerated > ago(30d)
| summarize count() by format_datetime(TimeGenerated, 'yyyy-MM-dd')


// average query duration by day for last 30d
PowerBIDatasetsWorkspace
| where TimeGenerated > ago(30d)
| where OperationName == 'QueryEnd'
| summarize avg(DurationMs) by format_datetime(TimeGenerated, 'yyyy-MM-dd')


//query duration percentiles for a single day in 1 hour bins
PowerBIDatasetsWorkspace
| where TimeGenerated >= todatetime('2021-04-28') and TimeGenerated <= todatetime('2021-04-29')
| where OperationName == 'QueryEnd'
| summarize percentiles(DurationMs, 0.5, 0.9) by bin(TimeGenerated, 1h)


// refresh durations by workspace and semantic model for last 30d
PowerBIDatasetsWorkspace
| where TimeGenerated > ago(30d)
| where OperationName == 'CommandEnd'
| where ExecutingUser contains 'Power BI Service'
| where EventText contains 'refresh'
| project PowerBIWorkspaceName, DatasetName = ArtifactName, DurationMs

// query count, distinctUsers, avgCPU, avgDuration by workspace for last 30d
PowerBIDatasetsWorkspace  
| where TimeGenerated > ago(30d)
| where OperationName == "QueryEnd" 
| summarize QueryCount=count()
    , Users = dcount(ExecutingUser)
    , AvgCPU = avg(CpuTimeMs)
    , AvgDuration = avg(DurationMs)
by PowerBIWorkspaceId

示例 Power BI 报表模板

使用 GitHub 上的开源 Power BI 报表模板来浏览和获取 Azure Log Analytics Power BI 数据的见解。

以下文章可帮助你详细了解 Power BI 以及它与 Azure Log Analytics 的集成。