将您的画布应用程序连接到 Application Insights,这是 Azure Monitor 的一项功能。 Application Insights 包括分析工具,有助于诊断问题和了解应用程序中的用户行为。 使用收集到的信息做出更好的业务决策并提高应用质量。
先决条件
- 您需要访问 Azure 门户。
- 您需要创建 Azure 资源的权限。
备注
若要查看遥测信息,租户管理员必须启用画布应用见解。 以管理员身份登录 Power Platform 管理中心。 选择设置>租户设置>画布应用见解。 在画布应用见解窗格中,将开关设置为开并保存您的更改。 了解有关租户设置的更多信息。
创建 Application Insights 资源
通过创建用于存储事件的 Application Insights 资源,从应用程序发送系统生成的日志。
了解如何在 Azure 门户中为 Application Insights 创建基于工作区的资源。
将您的应用连接到 Application Insights
备注
- 指定连接字符串时,请记住数据可以跨租户发送。 跟踪事件将发送到与为应用设置的连接字符串相对应的 App Insights 资源,即使目标 App Insights 实例与应用位于不同的租户中也是如此。
- 导入现有 .msapp 文件时要小心,因为可能存在 App Insights 的连接字符串。 导入后手动打开应用,以检查是否使用了正确的 App Insights 连接字符串。
登录到 Power Apps。
打开应用程序进行编辑。
在左侧导航树视图中选择应用程序对象,然后粘贴 Application Insights 资源中的连接字符串:
保存并发布您的应用。
播放已发布的应用并浏览不同屏幕。
浏览应用程序屏幕时,事件会自动记录到 Application Insights。 其中包括使用详细信息,例如:
- 用户从何处访问应用程序
- 用户使用的设备
- 用户使用的浏览器类型
重要提示
运行已发布的应用程序,将事件发送到 Application Insights。 在 Power Apps Studio 中预览应用程序时,事件不会发送到 Application Insights。
在 Application Insights 中查看事件
登录 Azure 门户,打开之前创建的 Application Insights 资源。
在左侧导航窗格中,选择使用情况部分下的用户。
备注
用户视图显示应用程序的使用详情,例如:
- 查看应用的用户数
- 用户会话数
- 记录的事件数
- 用户的操作系统和浏览器版本详细信息
- 用户的区域和位置
选择用户会话可查看特定详细信息,例如会话时长和访问的屏幕。
在左导航窗格中,选择使用情况部分下的事件。 您可以查看所有应用程序会话中查看的所有屏幕的摘要。
创建自定义跟踪事件
向 Application Insights 写入自定义跟踪,分析应用程序的特定信息。 Trace 函数允许您收集:
- 屏幕上控件的详细使用信息
- 哪些特定用户正在访问您的应用
- 发生什么错误
跟踪功能可在用户浏览应用程序和执行操作时发送跟踪信息,从而帮助您诊断问题。 发送到 Application Insights 的跟踪消息具有以下三种严重性之一:
- Information
- 警告
- Error
根据情况发送具有适当严重性的跟踪消息。 您可以查询数据并根据严重性执行特定操作。
备注
如果您在记录任何个人数据,请注意您在遵守各种隐私法律和法规方面的义务。 有关详细信息,请参考 Microsoft 信任中心和服务信任门户。
在应用程序中创建一个组件,收集每个屏幕上的反馈信息,并将事件记录到 Application Insights。
登录到 Power Apps。
在左侧导航窗格中选择应用。 从应用列表中,选择 Kudos 应用,然后选择编辑。
在树形视图中选择组件:
选择新建组件,然后将宽度调整为 200,高度调整为 75:
从菜单中选择插入,然后选择图标添加表情符号 - 哭脸和表情符号 - 微笑:
选择新建自定义属性创建自定义属性:
输入属性名称和显示名称(例如 FeedbackScreen)。
输入属性描述。
属性类型选择输入,数据类型选择屏幕:
备注
输入属性可以捕捉屏幕名称及其组件,将信息记录到 Application Insights。
在树形视图中选择组件,选择更多操作(...),然后选择重命名,为组件命名,例如反馈组件。
选择图标,选择更多操作(...),然后选择重命名,用有意义的名称重命名图标,如 FrownIcon 和 SmileIcon。
选择 FrownIcon,选择 OnSelect 属性,并在公式栏中输入以下表达式:
Trace( "App Feedback", TraceSeverity.Information, { UserName: User().FullName, UserEmail: User().Email, Screen: FeedbackComponent.FeedbackScreen.Name, FeedbackValue: "-1" } ); Notify("Thanks for your feedback!");
备注
公式将 UserName、UserEmail、Screen 和 Feedback(值为 -1)发送到 Application Insights。
选择 SmileIcon,选择 OnSelect 属性,然后在公式栏中输入以下表达式:
Trace( "App Feedback", TraceSeverity.Information, { UserName: User().FullName, UserEmail: User().Email, Screen: FeedbackComponent.FeedbackScreen.Name, FeebackValue: "1" } ); Notify("Thanks for your feedback!");
将组件添加到应用的屏幕之一:
选择保存,然后选择发布保存并发布您的应用。
播放发布的应用,然后从屏幕发送微笑和哭脸反馈。
重要提示
您必须播放发布的应用才能将事件发送到 Application Insights。 在 Power Apps Studio 中预览应用时,事件不会发送到 Application Insights。
分析 Application Insights 中的自定义数据
现在,您可以开始在 Application Insights 中分析使用 Trace 函数从您的应用发送的数据。
登录 Azure 门户,打开您在之前创建的 application insights 资源。
在左侧导航窗格的监视下选择日志:
输入以下查询并选择运行,即可查看应用程序的反馈信息:
traces | where message == "App Feedback" | order by timestamp
在结果中选择一行,然后展开 customDimensions 字段。
组件中微笑或哭脸图标的 OnSelect 事件的 Screen、UserName、UserEmail 和 FeedbackValue 值已被记录。 还将记录发送到 Application Insights 的每个事件的值,如 appId、appName 和 appSessionId。
使用以下示例查询,您可以扩展 JSON 自定义维度的属性,并将列投射到结果视图中。
traces | extend customdims = parse_json(customDimensions) | where message == "App Feedback" | project timestamp , message , AppName = customdims.['ms-appName'] , AppId = customdims.['ms-appId'] , FeedbackFrom = customdims.UserEmail , Screen = customdims.Screen , FeedbackValue = customdims.FeedbackValue | order by timestamp desc
小费
日志查询功能非常强大。 使用它们来联接多个表、聚合大量数据以及执行复杂的操作。 详细了解日志查询。
分析 Application Insights 中的应用程序生命周期数据
会话摘要事件为每个会话记录一次,其中包含有关应用打开成功、应用打开最佳与非最佳会话以及应用打开性能指标的信息。
限额
这些事件对于在网络浏览器中运行的画布应用程序是准确的。 它们不适用于在 Power Apps 移动设备中运行的应用程序,而且对于自定义页面,它们的值可能并不总是可用或准确的。
下面是一个示例查询,显示了如何访问会话摘要事件和所有可用字段:
customEvents
| where name == "PowerAppsClient.PublishedApp.SessionLoadSummary"
//
| extend cd = parse_json(customDimensions)
//
| extend sessionSummary = parse_json(tostring(cd["ms-sessionSummary"]))
| extend successfulAppLaunch = tobool(sessionSummary["successfulAppLaunch"])
| extend unsuccessfulReason = tostring(sessionSummary["unsuccessfulReason"])
| extend appLoadResult = tostring(sessionSummary["appLoadResult"])
| extend appLoadNonOptimalReason =
tostring(sessionSummary["appLoadNonOptimalReason"])
//
| extend timeToAppInteractive = todouble(sessionSummary["timeToAppInteractive"])
| extend timeToAppFullLoad = todouble(sessionSummary["timeToAppFullLoad"])
//
| project
timestamp,
session_Id,
successfulAppLaunch,
unsuccessfulReason,
appLoadResult,
appLoadNonOptimalReason,
timeToAppInteractive,
timeToAppFullLoad
| limit 5
以下字段有助于衡量与最终用户体验相关的性能标记的应用打开成功与否和延迟。
字段 | Description |
---|---|
successfulAppLaunch | 指示会话是否成功启动应用的布尔值 |
不成功原因 | 如果会话无法启动应用程序,则表示原因/错误。 如果会话成功,则此字段将为空字符串。 |
appLoadResult | 指示会话是否为最佳会话。 可能的值:最佳值、其他值 |
appLoadNonOptimalReason | 如果会话不是最佳的,则表明原因。 可能的值:需要交互、节流、屏幕导航离开、其他 |
timeToAppInteractive | 应用会话达到交互状态的持续时间(以毫秒为单位)。 在此状态下,用户可以开始与第一个屏幕交互,但数据可能未完全加载。 |
timeToAppFullLoad | 应用会话达到完全加载状态的持续时间(以毫秒为单位),在该状态中,第一个屏幕的所有数据请求都已完成加载。 |
示例查询
应用打开成功率
此查询将按天显示应用打开成功率。 这可用于评估用户可能遇到的问题的峰值或趋势
customEvents
| where name == "PowerAppsClient.PublishedApp.SessionLoadSummary"
| extend cd = parse_json(customDimensions)
| extend sessionSummary = parse_json(tostring(cd["ms-sessionSummary"]))
| extend successfulAppLaunch = tobool(sessionSummary["successfulAppLaunch"])
| summarize
sessions_total = dcount(session_Id),
sessions_success = dcountif(session_Id, successfulAppLaunch == true)
by bin(timestamp, 1d)
| extend successRate =
100.0 * (todouble(sessions_success) / todouble(sessions_total))
| project timestamp, successRate
| render timechart
按原因划分的不成功会话计数
此查询将按原因/错误显示不成功的会话计数。 这可用于调试应用打开失败或评估用户可能遇到的问题的趋势。
customEvents
| where name == "PowerAppsClient.PublishedApp.SessionLoadSummary"
| extend cd = parse_json(customDimensions)
| extend sessionSummary = parse_json(tostring(cd["ms-sessionSummary"]))
| extend successfulAppLaunch = tobool(sessionSummary["successfulAppLaunch"])
| extend unsuccessfulReason = tostring(sessionSummary["unsuccessfulReason"])
| where successfulAppLaunch == false
| summarize
count()
by unsuccessfulReason, bin(timestamp, 1d)
| render timechart
应用打开表现
此查询将按天显示应用打开性能指标。 这可用于评估一段时间内或进行更改后的性能趋势。 我们推荐:
- 使用 timeToAppInteractive 和 timeToAppFullLoad 字段的第 75 个百分位数来避免异常值引起的噪音。
- 仅筛选为最佳会话,以避免由预期情况(如用户交互会话、在后台选项卡中加载应用的会话等)引起的数据噪音。
customEvents
| where name == "PowerAppsClient.PublishedApp.SessionLoadSummary"
| extend cd = parse_json(customDimensions)
| extend sessionSummary = parse_json(tostring(cd["ms-sessionSummary"]))
| extend appLoadResult = tostring(sessionSummary["appLoadResult"])
| extend timeToAppInteractive = todouble(sessionSummary["timeToAppInteractive"])
| extend timeToAppFullLoad = todouble(sessionSummary["timeToAppFullLoad"])
| where appLoadResult == "optimal"
| summarize
percentile(timeToAppInteractive, 75),
percentile(timeToAppFullLoad, 75)
by bin(timestamp, 1d)
| render timechart
HTTP 调用时的应用加载状态
有一个新的请求标头 x-ms-app-load-state,用于指示 HTTP 调用是否有助于应用启动。 具体而言,这可用于确定哪些 HTTP 调用影响了上述 timeToAppFullLoad。
标头可以是以下两个值之一:
价值 | Description |
---|---|
TTFL | 指示请求贡献了 timeToAppFullLoad |
PostTTFL | 指示请求未参与 timeToAppFullLoad |
下面是一个示例查询,演示如何访问标头值并将其投影到 appLoadState 列中:
dependencies
| extend cd = parse_json(customDimensions)
| extend requestHeaders = parse_json(tostring(cd["requestHeaders"]))
| extend appLoadState = tostring(requestHeaders["x-ms-app-load-state"])
| project timestamp, session_Id, appLoadState, name, duration
| limit 5
有助于完全加载的 HTTP 调用的技术
此查询将按天显示对 timeToAppFullLoad 有贡献的 HTTP 调用的平均计数。 这可用于评估应用在启动时进行的可能导致性能不佳的调用次数。
dependencies
| extend cd = parse_json(customDimensions)
| extend requestHeaders = parse_json(tostring(cd["requestHeaders"]))
| extend appLoadState = tostring(requestHeaders["x-ms-app-load-state"])
| where appLoadState == "TTFL"
| summarize httpCalls = count() by session_Id, bin(timestamp, 1d)
| summarize avg(httpCalls) by timestamp
| render timechart
有助于完全加载的 HTTP 调用的持续时间
此查询将按天显示对 timeToAppFullLoad 有贡献的 HTTP 调用的总持续时间。 这可用于评估 HTTP 调用对应用启动性能的总体影响。
dependencies
| extend cd = parse_json(customDimensions)
| extend requestHeaders = parse_json(tostring(cd["requestHeaders"]))
| extend appLoadState = tostring(requestHeaders["x-ms-app-load-state"])
| where appLoadState == "TTFL"
| summarize httpCallDuration = sum(duration) by session_Id, bin(timestamp, 1d)
| summarize percentile(httpCallDuration, 80) by timestamp
| render timechart
按 URL 贡献完全加载的 HTTP 调用的持续时间
与上述类似,此查询将按 URL 显示对 timeToAppFulLoad 有贡献的 HTTP 调用的计数和持续时间。 这可用于识别影响应用启动性能的特定慢速 HTTP 调用。
dependencies
| extend cd = parse_json(customDimensions)
| extend requestHeaders = parse_json(tostring(cd["requestHeaders"]))
| extend appLoadState = tostring(requestHeaders["x-ms-app-load-state"])
| where appLoadState == "TTFL"
| summarize
count(), percentile(duration, 80) by name
监视未处理的错误(试验)
[本部分包含预发行文档,有可能会有所更改。]
重要提示
- 这是一项试验功能。
- 试验功能不适合生产使用且功能可能受限。 这些功能在正式发布之前已经可用,以便客户可以抢先体验并提供反馈。
您无法始终预测或计划应用运行时可能发生的每个错误。 未处理的 Power Fx 公式错误将作为横幅消息报告给用户。 这些错误也可以报告给 Application Insights,以显示其频率和严重程度,而无需依赖应用程序的用户报告问题。 您还可以设置在发生运行时错误时发出实时警报,以采取更主动的方法。
允许将错误传递到 Application Insights
启用设置,让 Power Apps 将未处理的运行时错误传递给 Azure Application Insights。
警告
启用将错误传递到 Azure Application Insights 设置可能会产生额外的日志存储 Application Insights 费用。
- 打开画布应用进行编辑。
- 选择设置>更新>实验性,然后打开将错误传递给 Azure Application Insights。
- 保存并发布应用程序。
Application Insights 中的错误事件
用户在应用程序运行时遇到的未处理 Power Fx 错误会报告到跟踪表中。 可以通过事件消息“未处理的错误”来识别未处理的错误,并将其与其他错误事件区分开来。这些事件的“severityLevel”维度为 3(TraceSeverity.Error)。
customDimension 属性的“错误”维度中提供了详细的错误消息。 在同一操作中发生多个错误的情况下,这些错误将合并到单个跟踪事件的“errors”维度中。 错误消息与实时调试会话期间监视器中报告的错误消息相同。
此示例查询标识未处理的错误,并展开跟踪事件中的所有错误消息:
traces
| where message == "Unhandled error"
| extend customdims = parse_json(customDimensions)
| extend errors = parse_json(tostring(customdims.['errors']))
| mv-expand errors
| project timestamp
, itemId //unique identifier for the trace event
, AppName = customdims.['ms-appName']
, AppId = customdims.['ms-appId']
, errors = errors.['Message']
| order by timestamp desc
相关性跟踪(试验)
[本部分包含预发行文档,有可能会有所更改。]
重要提示
- 这是一项试验功能。
- 试验功能不适合生产使用且功能可能受限。 这些功能在正式发布之前已经可用,以便客户可以抢先体验并提供反馈。
连接到外部数据和服务对于大多数应用至关重要。 相关性跟踪生成并传播上下文信息,以在画布应用及其连接中链接系统生成的日志,但有某些限制。 例如,您的应用可能会调用自定义连接器,然后该连接器调用 Azure 函数或其他 REST API。 相关性跟踪允许您将应用中采取的操作与跨层的基础 API 调用相关联。 这对于故障排除非常有用。
画布应用程序相关性跟踪实现了上下文跟踪,并遵循 W3C 规范。
启用相关性跟踪
警告
启用此设置可能会产生与 Application Insights 日志存储相关的额外成本。
- 要启用关联跟踪,请打开您的画布应用程序进行编辑。
- 选择设置>更新>实验性>,然后打开启用Azure Application Insights 关联跟踪。
- 保存并发布应用。
限制
- 关联跟踪仅适用于自定义连接器。 不支持其他连接器类型。
- 只有当连接服务也连接到 Application Insights 时,才会在 Application Insights 中捕获 HTTP 请求。
使用相关性跟踪
启用后,相关性跟踪会在画布应用的 Application Insights 实例的依赖项表中添加一个新的系统生成的日志事件。 在接收到来自网络调用的响应时将记录此事件。 依赖事件捕获网络调用的详细信息,包括请求和响应标头、响应状态代码和调用持续时间。
如果连接服务也连接到 Application Insights,在服务的 Application Insights 实例的请求表中会生成捕获请求的系统生成的额外日志事件。 有些 Azure 服务(如 Azure Functions)可以在没有来自 Azure 门户的任何编码的情况下连接。 画布应用或多个应用和连接服务可以连接到同一个 Application Insights 实例。
在“operation_Id”维度上将对受支持连接器的网络调用与系统生成的其他日志联接。 以下查询显示了网络调用以及应用会话期间发出的跟踪事件。
traces | union dependencies | union requests | union pageViews | union customEvents
| project timestamp
, itemType
, name
, operation_Name
, message
, severityLevel
, customDimensions
, operation_Id
, operation_ParentId
| where operation_Id == "0a7729e3e83c4e4d93cb4f51149f73b9" //placeholder operation_Id, replace
| order by timestamp asc
将数据导出到 Power BI
您可以将 Application Insights 数据和查询结果导出到 Power BI 进行分析和数据呈现。
登录 Azure 门户,打开之前设置的 Application Insights 资源。
在左侧导航窗格的监视下选择日志:
在日志分析查询窗口中,选择导出菜单。
选择导出到 Power BI(M 查询)以下载 Power BI 查询文件。
在文本编辑器中打开下载的文件,然后将查询复制到剪贴板。
打开 Power BI。
在主页功能区选择获取数据,然后选择空白查询。
在查询窗口中,选择高级编辑器,将查询粘贴到窗口中,选择完成,然后选择关闭并应用。
在 Power BI 中创建图表和可视化效果,以体现应用程序的反馈并做出数据驱动的决策。
默认跟踪事件上下文和维度
默认维度会添加到每个跟踪事件的 customDimensions 属性中。 这些维度标识了发生事件的应用程序和应用程序会话。 如果使用跟踪功能记录其他自定义数据,这些数据也会显示在自定义维度中。
维度名称 | 表示 |
---|---|
ms-appId | 发送事件的应用的应用程序 ID。 |
ms-appname | 发送事件的应用的应用程序名称。 |
ms-appSessionId | 应用程序会话 ID。 在某些情况下,该值可能不会被填充。 可用时,此值将替代标准 Application Insights sessionID 维度。 |
ms-tenantID | 发布应用程序的租户的唯一标识符。 |
ms-environmentId | 发布应用程序的环境的名称。 |
用户 ID | 与会话关联的用户的唯一标识符。 |
ms-duration | 衡量用户从一个屏幕导航到另一个屏幕所需时间的估算值。 此值将替代标准 Application Insights PageView 持续时间维度。 |
sessionId | 可用于关联与单个应用程序会话关联的所有事件的会话 ID。 此值始终存在,建议用它来了解唯一会话计数。 此值取自播放器的会话 ID,在播放应用的过程中查看会话详细信息时显示。 会话 ID 有时可能会获得一个默认、随机、唯一 Application Insights 生成的值。 此默认值不可靠,不会与任何特定于应用的参数关联。 |
持续时间 | 衡量用户从一个屏幕导航到另一个屏幕所需时间的估算值。 该值与 ms-duration 维度报告的持续时间相匹配。 |
ms-isTest | 指示会话是否与 Test Studio 测试运行程序相关联。 |
ms-currentScreenName | 用户导航的页面名称(适用于页面导航事件)。 |
ms-targetScreenName | 用户导航到的页面的名称(用于页面导航事件)。 |
不受支持的情形
Application Insights 不支持这些情况。
- 不记录脱机播放器事件。
- 当应用程序暂停时,不会记录来自移动应用程序(iOS 和 Android)的事件。