在 Application Insights 中分析 Azure Functions 遥测数据

Azure Functions 与 Application Insights 集成,以用于更好地监视函数应用。 Application Insights 收集函数应用生成的遥测数据,包括应用写入到日志的信息。 通常,在创建函数应用时会启用 Application Insights 集成。 如果函数应用未设置检测密钥,则必须先启用 Application Insights 集成

默认情况下,从函数应用中收集的数据会存储在 Application Insights 中。 在 Azure 门户中,Application Insights 提供了一组全面的遥测数据可视化效果。 你可以深入查看错误日志,并且可以查询事件和指标。 本文提供了一些基本示例来说明如何查看和查询收集的数据。 若要详细了解如何在 Application Insights 中探索函数应用数据,请参阅什么是 Application Insights?

若要能够从函数应用中查看 Application Insights 数据,在该函数应用上至少必须有参与者角色权限。 还需要对 Application Insights 实例具有监视读取者权限。 在默认情况下,你对于任何你自己创建的函数应用和 Application Insights 实例都具有这些权限。

若要详细了解数据保留和可能产生的存储成本,请参阅 Application Insights 中的数据收集、保留和存储

在“监视”选项卡中查看遥测数据

启用 Application Insights 集成后,可以在“监视”选项卡中查看遥测数据。

  1. 在函数应用页中,选择在配置 Application Insights 之后至少运行过一次的函数。 然后,在左窗格中选择“监视”。 定期选择“刷新”,直到显示函数调用列表。

    Invocations list

    注意

    在遥测客户端对数据进行批处理以传输到服务器时,最长可能需要 5 分钟的时间才会显示该列表。 这种延迟不适用于实时指标流。 加载页面时,该服务会连接到 Functions 主机,因此,日志会直接流式传输到页面。

  2. 若要查看特定函数调用的日志,选择该调用对应的“日期 (UTC)”列链接。 该调用的日志记录输出显示在新页中。

    Invocation details

  3. 选择“在 Application Insights 中运行”,以查看在 Azure 日志中检索 Azure Monitor 日志数据的查询源。 如果这是首次在订阅中使用 Azure Log Analytics,系统会要求启用它。

  4. 启用 Log Analytics 后,将显示以下查询。 可以看到,查询结果仅限于最近 30 天 (where timestamp > ago(30d)),而且显示的结果不超过 20 行 (take 20)。 相比之下,函数的调用详细信息列表显示最近 30 天的信息,没有任何限制。

    Application Insights Analytics invocation list

有关详细信息,请参阅本文稍后的查询遥测数据

在 Application Insights 中查看遥测

若要在 Azure 门户中从某个函数应用打开 Application Insights,请执行以下操作:

  1. 在门户中浏览到你的函数应用。

  2. 在左侧页面中,选择“设置”下方的“Application Insights” 。

  3. 如果这是你首次通过自己的订阅使用 Application Insights,系统将会提示你启用它。 为此,请选择“打开 Application Insights”,然后在下一页上选择“应用” 。

Open Application Insights from the function app Overview page

有关如何使用 Application Insights 的信息,请参阅 Application Insights 文档。 本部分介绍如何在 Application Insights 中查看数据的一些示例。 如果已经熟悉 Application Insights,则可以直接转到有关如何配置和自定义遥测数据的部分

Application Insights Overview tab

在评估函数中的行为、性能和错误时,Application Insights 的以下方面可能会有所帮助:

调查 说明
失败 基于函数失败和服务器异常来创建图表和警报。 操作名称是函数名称。 不显示依赖项中的失败,除非为依赖项实现了自定义遥测。
性能 通过查看每个 Cloud 角色实例的资源利用率和吞吐量来分析性能问题。 如果要针对函数阻碍基础资源正常工作的情况进行调试,此性能数据会很有用。
指标 创建基于指标的图表和警报。 指标包括函数调用次数、执行时间和成功率。
实时指标: 随着指标数据的创建,近实时地查看指标数据。

查询遥测数据

借助 Application Insights Analytics,便可以访问数据库中以表形式存储的所有遥测数据。 Analytics 提供了一种用于提取、处理和可视化数据的查询语言。

选择“日志”以浏览或查询记录的事件。

Analytics example

下面是一个查询示例,它显示过去 30 分钟内每个辅助角色的请求的分布。

requests
| where timestamp > ago(30m) 
| summarize count() by cloud_RoleInstance, bin(timestamp, 1m)
| render timechart

可用的表会显示在左侧的“架构”选项卡中。 可以在下表中找到由函数调用生成的数据:

说明
traces 由函数代码中的运行时、规模控制器和跟踪创建的日志。
requests 一个请求用于一个函数调用。
异常 由运行时引发的任何异常。
customMetrics 成功和失败调用的计数、成功率和持续时间。
customEvents 运行时跟踪的事件,例如:触发函数的 HTTP 请求。
performanceCounters 有关运行函数的服务器的性能的信息。

其他表适用于可用性测试、客户端和浏览器遥测。 可以实现自定义遥测以向其中添加数据。

在每个表内,一些函数特定的数据位于 customDimensions 字段。 例如,以下查询检索所有具有日志级别 Error 的跟踪。

traces 
| where customDimensions.LogLevel == "Error"

运行时提供了 customDimensions.LogLevelcustomDimensions.Category 字段。 可以在日志中提供在函数代码中编写的其他字段。 有关用 C# 编写的示例,请参阅 .NET 类库开发人员指南中的结构化日志记录

查询函数调用

每个函数调用都分配有一个独一无二的 ID。 InvocationId 包含在自定义维度中,可用于关联来自特定函数执行的所有日志。

traces
| project customDimensions["InvocationId"], message

遥测关联

可以使用 operation_Id 关联来自不同函数的日志。 使用以下查询返回特定逻辑操作的所有日志。

traces
| where operation_Id == '45fa5c4f8097239efe14a2388f8b4e29'
| project timestamp, customDimensions["InvocationId"], message
| order by timestamp

采样百分比

采样配置可用于减少遥测量。 使用以下查询来确定采样是否可操作。 如果你发现任何类型的 RetainedPercentage 小于 100,则表示正在对该类型的遥测数据采样。

union requests,dependencies,pageViews,browserTimings,exceptions,traces
| where timestamp > ago(1d)
| summarize RetainedPercentage = 100/avg(itemCount) by bin(timestamp, 1h), itemType

查询规模控制器日志

此功能为预览版。

启用规模控制器日志 Application Insights 集成后,可以使用 Application Insights 日志搜索来查询已发出的规模控制器日志。 规模控制器日志保存在 ScaleControllerLogs 下的 traces 集合中。

以下查询可用于在指定时间段内搜索当前函数应用的所有规模控制器日志:

traces 
| extend CustomDimensions = todynamic(tostring(customDimensions))
| where CustomDimensions.Category == "ScaleControllerLogs"

以下查询对上一个查询进行了扩展,以显示如何只获取指示规模更改的日志:

traces 
| extend CustomDimensions = todynamic(tostring(customDimensions))
| where CustomDimensions.Category == "ScaleControllerLogs"
| where message == "Instance count changed"
| extend Reason = CustomDimensions.Reason
| extend PreviousInstanceCount = CustomDimensions.PreviousInstanceCount
| extend NewInstanceCount = CustomDimensions.CurrentInstanceCount

特定于消耗计划的指标

消耗计划中运行时,单个函数执行的执行成本以“GB 秒”来度量 。 执行成本是通过将其内存用量与执行时间相结合计算得出的。 若要了解详细信息,请参阅估算消耗计划成本

以下遥测数据查询特定于对在消耗计划中运行函数的成本有影响的指标。

确定内存用量

在“监视”下选择“日志(分析)”,复制以下遥测查询并将其粘贴到查询窗口中,然后选择“运行”。 此查询返回每个采样时间的总内存用量。

performanceCounters
| where name == "Private Bytes"
| project timestamp, name, value

结果类似于以下示例:

timestamp [UTC] name
9/12/2019, 1:05:14.947 AM 专用字节数 209,932,288
9/12/2019, 1:06:14.994 AM 专用字节数 212,189,184
9/12/2019, 1:06:30.010 AM 专用字节数 231,714,816
9/12/2019, 1:07:15.040 AM 专用字节数 210,591,744
9/12/2019, 1:12:16.285 AM 专用字节数 216,285,184
9/12/2019, 1:12:31.376 AM 专用字节数 235,806,720

确定持续时间

Azure Monitor 可跟踪资源级指标,对于函数来说,就是跟踪函数应用指标。 Application Insights 集成会发出每个函数的指标。 下面是一个示例分析查询,可用于获取函数的平均持续时间:

customMetrics
| where name contains "Duration"
| extend averageDuration = valueSum / valueCount
| summarize averageDurationMilliseconds=avg(averageDuration) by name
name averageDurationMilliseconds
QueueTrigger AvgDurationMs 16.087
QueueTrigger MaxDurationMs 90.249
QueueTrigger MinDurationMs 8.522

后续步骤

请参阅以下文章,以详细了解如何监视 Azure Functions: