使用 Azure 監視器 Application Insights 監視 Azure Functions
Azure Functions 提供與 Application Insights 的內建整合來監視函式。 針對 .NET 和 .NETCore 以外的語言,需要其他語言特定的背景工作角色/延伸模組,才能取得分散式追蹤的完整優點。
Application Insights 會收集記錄、效能和錯誤資料,並自動偵測效能異常。 Application Insights 隨附強大的分析工具,以協助您診斷問題,以及了解如何使用您的函式。 您了解應用程式資料時,便可以持續改善效能和可用性。 您甚至可以在本機函式應用程式專案開發期間使用 Application Insights。
所需的 Application Insights 檢測已內建於 Azure Functions 中。 您只需要有效的連接字串,以便將您的函式應用程式連線至 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 Function 應用程式啟用分散式追蹤
在函式應用程式 [概觀] 窗格上,移至 Application Insights。 在 [集合層級] 下,選取 [建議]。
組態
若要針對不在取用方案中的 Azure Function App 設定此功能,請在應用程式設定中新增環境變數。 若要檢閱可用的組態,請參閱組態選項:適用於 Java 的 Azure 監視器 Application Insights。
對於取用方案中的 Azure Functions,可用的組態選項僅限於 APPLICATIONINSIGHTS_INSTRUMENTATION_LOGGING_LEVEL 和 APPLICATIONINSIGHTS_SELF_DIAGNOSTICS_LEVEL。 若要在取用方案函式上進行其他組態,請部署您自己的代理程式,並參閱 Java Functions 的自訂分散式追蹤代理程式。
部署您自己的代理程式會導致取用方案 Functions 的冷啟動時間更長。
疑難排解
如果您在 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
注意
如果 Azure Functions 中無法使用最新版 Application Insights Java 代理程式,請依照這些指示手動上傳。
測試應用程式主機與擷取服務之間的連線
應用程式深入剖析 SDK 和代理程式會傳送遙測,以擷取為 REST 呼叫擷取到我們擷取的端點。 您可以使用來自 PowerShell 或 curl 命令的原始 REST 用戶端,測試從 Web 伺服器或應用程式主機電腦到擷取服務端點的連線。 請參閱針對 Azure 監視器 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 Distro 來檢測您的函式。
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 監視器與 Application Insights。