使用 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 中监视执行和连接字符串。
有关支持的自动检测方案的列表,请参阅支持的环境、语言和资源提供程序。
对 Java 应用程序进行分布式跟踪
注意
此功能过去需要 8 到 9 秒的冷启动时间,现在已减少到少于 1 秒。 如果你是此功能的早期采用者(例如,在 2023 年 2 月之前),请查看“故障排除”部分,以更新到当前版本并受益于新的更快的启动速度。
若要查看基于 Java 的 Azure Functions 应用程序中比默认收集量还多的数据,请启用 Application Insights Java 3.x 代理。 此代理允许 Application Insights 自动从常用库和 Azure 软件开发工具包 (SDK) 中收集和关联依赖项、日志、指标。 此遥测数据是 Functions 捕获的请求遥测的补充。
通过使用应用程序映射和更完整的端到端事务视图,可以更好地诊断问题。 拥有关于系统如何与平均性能和错误率数据交互的拓扑视图。 此外,还有更多用于端到端诊断的数据。 可以使用应用程序映射,根据每个请求轻松查找可靠性问题和性能瓶颈的根本原因。
对于更高级的用例,可以通过添加范围、更新范围状态和添加范围属性来修改遥测。 还可以使用标准 API 发送自定义遥测数据。
为 Java 函数应用启用分布式跟踪
在函数应用的“概述”窗格中,转到“Application Insights”。 在“集合等级”下,选择“建议”。
配置
要为并非基于消耗计划的 Azure 函数应用配置此功能,请在应用设置中添加环境变量。 要查看可用配置,请参阅配置选项:Azure Monitor Application Insights for Java。
对于消耗计划上的 Azure Functions,可用的配置选项仅限于APPLICATIONINSIGHTS_INSTRUMENTATION_LOGGING_LEVEL 和 APPLICATIONINSIGHTS_SELF_DIAGNOSTICS_LEVEL。 若要对消耗计划函数进行其他配置,请部署自己的代理,请参阅适用于 Java 函数的自定义分布式跟踪代理。
部署自己的代理将导致消耗计划函数的冷启动影响更长。
疑难解答
如果你在 2023 年 2 月之前采用了此功能,你的 Java 函数可能启动缓慢。 在函数应用的“概述”窗格中,转到左侧导航菜单中的“配置”。 然后选择“应用程序设置”并遵循以下步骤修复问题。
Windows
检查以下设置是否存在并删除它们:
XDT_MicrosoftApplicationInsights_Java -> 1 ApplicationInsightsAgent_EXTENSION_VERSION -> ~2
通过添加此设置来启用最新版本:
APPLICATIONINSIGHTS_ENABLE_AGENT: true
Linux 专用版/高级版
检查以下设置是否存在并删除它们:
ApplicationInsightsAgent_EXTENSION_VERSION -> ~3
通过添加此设置来启用最新版本:
APPLICATIONINSIGHTS_ENABLE_AGENT: true
注意
如果最新版本的 Application Insights Java 代理在 Azure Functions 中不可用,请按照这些说明手动上传该代理。
测试应用程序主机与引入服务之间的连接性
Application Insights SDK 和代理发送遥测,将其作为 REST 调用引入到引入终结点。 可以使用原始 REST 客户端通过 PowerShell 或使用 curl 命令,测试从 Web 服务器或应用程序主机计算机到引入服务终结点的连接。 请参阅排查 Azure Monitor Application Insights 中缺失应用程序遥测的问题。
重复日志
如果使用 log4j
或 logback
进行控制台日志记录,则 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),
):
...
后续步骤
- 阅读关于监视 Azure Functions 的更多说明和信息。
- 获取分布式跟踪的概述。
- 了解应用程序映射可以为你的业务做什么。
- 了解 Java 应用的请求和依赖项。
- 详细了解 Azure Monitor 和 Application Insights。