使用 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 中的執行連接字串

注意

針對檢測金鑰擷取的支援將在 2025 年 3 月 31 日結束。 檢測金鑰擷取將會繼續運作,但我們不再提供該功能的更新或支援。 轉換至連接字串以利用新功能

如需支援自動偵測案例的清單,請參閱支援的環境、語言和資源提供者

Java 應用程式的分散式追蹤

注意

這項功能用來具有 8 到 9 秒的冷啟動影響,這已縮減為小於 1 秒。 如果您是這項功能的早期採用者 (例如,在 2023 年 2 月之前),請檢閱「疑難排解」一節,以更新為目前版本,並運用新的較快速啟動。

若要從 Java 型 Azure Functions 應用程式檢視比 預設收集更多的資料,請啟用 Application Insights Java 3.x 代理程式。 此代理程式可讓 Application Insights 自動從熱門連結庫和 Azure 軟體開發工具包 (SDK) 收集並相互關聯相依性、記錄和計量。 此遙測可補強 Functions 已擷取的要求遙測。

藉由使用應用程式對應並擁有更完整的端對端交易檢視,您可以更妥善地診斷問題。 其中有系統如何與平均效能和錯誤率的資料互動的拓撲檢視。 其中也有更多資料用於端對端診斷。 您可以使用應用程式對應,找出可靠性問題的根本原因和每個要求的效能瓶頸。

如需更進階的使用案例,您可以藉由新增範圍、更新範圍狀態和新增範圍屬性來修改遙測。 您也可以使用標準 API 傳送自訂遙測。

為 Java Function 應用程式啟用分散式追蹤

在函式應用程式 [概觀] 窗格上,移至 Application Insights。 在 [集合層級] 下,選取 [建議]

顯示如何啟用AppInsights 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
    

注意

如果 Azure Functions 中無法使用最新版 Application Insights Java 代理程式,請依照這些指示手動上傳。

測試應用程式主機與擷取服務之間的連線

應用程式深入剖析 SDK 和代理程式會傳送遙測,以擷取為 REST 呼叫擷取到我們擷取的端點。 您可以使用來自 PowerShell 或 curl 命令的原始 REST 用戶端,測試從 Web 伺服器或應用程式主機電腦到擷取服務端點的連線。 請參閱針對 Azure 監視器 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函式應用程式的分散式追蹤

若要從節點 Azure Functions 應用程式檢視比 預設收集更多的數據,請使用 Azure 監視器 OpenTelemetry Distro 檢測您的函式。

Python 函式應用程式的分散式追蹤

若要從要求、urllib3、httpx、PsycoPG2 等服務收集遙測數據,請使用 Azure 監視器 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),
   ):
      ...

下一步