使用 Azure Monitor Application Insights 监视 Azure Functions

Azure Functions 内置集成了 Application Insights 来监视函数。 对于 .NET 和 .NETCore 以外的语言,需要其他特定于语言的辅助角色/扩展才能充分利用分布式跟踪。

Application Insights 会收集日志、性能和错误数据,并自动检测性能异常。 Application Insights 包含功能强大的分析工具,可帮助你诊断问题并了解函数的使用方式。 当你能够洞察应用程序数据后,你可以持续改善性能和可用性。 你甚至可以在本地函数应用项目开发过程中使用 Application Insights。

Azure Functions 中内置了必需的 Application Insights 检测。 你只需提供有效的连接字符串即可将函数应用连接到 Application Insights 资源。 在 Azure 中创建函数应用资源时,应将连接字符串添加到应用程序设置中。 如果函数应用还没有连接字符串,可手动设置该字符串。 有关详细信息,请参阅在 Azure Functions 中监视执行连接字符串

注意

对检测密钥引入的支持将于 2025 年 3 月 31 日结束。 检测密钥引入功能将会继续工作,但我们将不再为该功能提供更新或支持。 转换为连接字符串,以利用新功能

有关支持的自动检测方案的列表,请参阅支持的环境、语言和资源提供程序

对 Java 应用程序进行分布式跟踪

注意

此功能过去需要 8 到 9 秒的冷启动时间,现在已减少到少于 1 秒。 如果你是此功能的早期采用者(例如,在 2023 年 2 月之前),请查看“故障排除”部分,以更新到当前版本并受益于新的更快的启动速度。

若要查看基于 Java 的 Azure Functions 应用程序中比默认收集量还多的数据,请启用 Application Insights Java 3.x 代理。 此代理允许 Application Insights 自动从常用库和 Azure 软件开发工具包 (SDK) 中收集和关联依赖项、日志、指标。 此遥测数据是 Functions 捕获的请求遥测的补充。

通过使用应用程序映射和更完整的端到端事务视图,可以更好地诊断问题。 拥有关于系统如何与平均性能和错误率数据交互的拓扑视图。 此外,还有更多用于端到端诊断的数据。 可以使用应用程序映射,根据每个请求轻松查找可靠性问题和性能瓶颈的根本原因。

对于更高级的用例,可以通过添加范围、更新范围状态和添加范围属性来修改遥测。 还可以使用标准 API 发送自定义遥测数据。

为 Java 函数应用启用分布式跟踪

在函数应用的“概述”窗格中,转到“Application Insights”。 在“集合等级”下,选择“建议”。

显示如何启用 AppInsights Java 代理的屏幕截图。

配置

要为并非基于消耗计划的 Azure 函数应用配置此功能,请在应用设置中添加环境变量。 要查看可用配置,请参阅配置选项:Azure Monitor Application Insights for Java

对于消耗计划上的 Azure Functions,可用的配置选项仅限于APPLICATIONINSIGHTS_INSTRUMENTATION_LOGGING_LEVEL 和 APPLICATIONINSIGHTS_SELF_DIAGNOSTICS_LEVEL。 若要对消耗计划函数进行其他配置,请部署自己的代理,请参阅适用于 Java 函数的自定义分布式跟踪代理

部署自己的代理将导致消耗计划函数的冷启动影响更长。

疑难解答

如果你在 2023 年 2 月之前采用了此功能,你的 Java 函数可能启动缓慢。 在函数应用的“概述”窗格中,转到左侧导航菜单中的“配置”。 然后选择“应用程序设置”并遵循以下步骤修复问题。

Windows

  1. 检查以下设置是否存在并删除它们:

    XDT_MicrosoftApplicationInsights_Java -> 1
    ApplicationInsightsAgent_EXTENSION_VERSION -> ~2
    
  2. 通过添加此设置来启用最新版本:

    APPLICATIONINSIGHTS_ENABLE_AGENT: true
    

Linux 专用版/高级版

  1. 检查以下设置是否存在并删除它们:

    ApplicationInsightsAgent_EXTENSION_VERSION -> ~3
    
  2. 通过添加此设置来启用最新版本:

    APPLICATIONINSIGHTS_ENABLE_AGENT: true
    

注意

如果最新版本的 Application Insights Java 代理在 Azure Functions 中不可用,请按照这些说明手动上传该代理。

测试应用程序主机与引入服务之间的连接性

Application Insights SDK 和代理发送遥测,将其作为 REST 调用引入到引入终结点。 可以使用原始 REST 客户端通过 PowerShell 或使用 curl 命令,测试从 Web 服务器或应用程序主机计算机到引入服务终结点的连接。 请参阅排查 Azure Monitor Application Insights 中缺失应用程序遥测的问题

重复日志

如果使用 log4jlogback 进行控制台日志记录,则 Java Functions 的分布式跟踪会创建重复的日志。 然后,这些重复的日志将发送到 Application Insights。 若要避免此行为,请使用以下变通方法。

Log4j

将以下筛选器添加到 log4j.xml:

<Filters>
  <ThresholdFilter level="ALL" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>

示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
      <Filters>
        <ThresholdFilter level="ALL" onMatch="DENY" onMismatch="NEUTRAL"/>
      </Filters>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>
Logback

将以下筛选器添加到 logback.xml:

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  <level>OFF</level>
</filter>  

示例:

<configuration debug="true">
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are  by default assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
      <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>OFF</level>
      </filter>  
    </encoder>
  </appender>
  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

Node.js 函数应用的分布式跟踪

若要查看 Node Azure Functions 应用程序中比默认收集量还多的数据,请使用 Azure Monitor OpenTelemetry 发行版检测你的函数。

Python 函数应用的分布式跟踪

要从 Requests、urllib3、httpx、PsycoPG2 等服务收集遥测,请使用 Azure Monitor OpenTelemetry Distro。 传入 Azure Functions 中托管的 Python 应用程序的受跟踪传入请求不会自动与其中跟踪的遥测关联。 可以通过直接提取 TraceContext 来手动实现跟踪关联,如下所示:

import azure.functions as func

from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import trace
from opentelemetry.propagate import extract

# Configure Azure monitor collection telemetry pipeline
configure_azure_monitor()

def main(req: func.HttpRequest, context) -> func.HttpResponse:
   ...
   # Store current TraceContext in dictionary format
   carrier = {
      "traceparent": context.trace_context.Traceparent,
      "tracestate": context.trace_context.Tracestate,
   }
   tracer = trace.get_tracer(__name__)
   # Start a span using the current context
   with tracer.start_as_current_span(
      "http_trigger_span",
      context=extract(carrier),
   ):
      ...

后续步骤