如何設定 Azure Functions 的監視

Azure Functions 與 Application Insights 整合,讓您更能監視函式應用程式。 Application Insights 是 Azure 監視器的一項功能,是可延伸的應用程式效能管理 (APM) 服務,可收集函式應用程式所產生的資料,包括應用程式寫入記錄的資訊。 建立函式應用程式時,通常會啟用 Application Insights 整合。 如果您的應用程式沒有檢測金鑰集,您必須先啟用 Application Insights 整合

您可以使用 Application Insights,而不需任何自訂設定。 預設設定可能會導致大量資料。 如果您使用 Visual Studio Azure 訂用帳戶,可能就會達到 Application Insights 適用的資料上限。 如需 Application Insights 成本的資訊,請參閱 Application Insights 計費。 如需詳細資訊,請參閱具有大量遙測的解決方案

您將在本文稍後了解如何設定及自訂您的函式傳送到 Application Insights 的資料。 針對函式應用程式,記錄會設定於 host.json 檔案中。

注意

您可以使用特別設定的應用程式設定來代表 host.json 檔案中的特定設定,且該檔案針對的是特定的環境。 這可讓您有效地變更 host.json 設定,而不需要重新發佈專案中 的 host.json 檔案。 如需詳細資訊,請參閱 覆寫 host.json 值

設定類別

Azure Functions 記錄器包括每個記錄的「類別」。 類別指出寫入記錄的是哪個部分的執行階段程式碼或函式程式碼。 1.x 版與更新版本之間的類別不同。 下圖說明執行階段所建立記錄的主要類別:

類別 Table 描述
Function.<YOUR_FUNCTION_NAME> 相依性 會針對某些服務自動收集相依性資料。 針對成功的執行,這些記錄均位於 Information 層級。 如需詳細資訊,請參閱相依性。 例外狀況會記錄於 Error 層級。 執行階段也會建立 Warning 層級的記錄,像是將佇列訊息傳送至有害佇列時。
Function.<YOUR_FUNCTION_NAME> customMetrics
customEvents
C# 和 JavaScript SDK 可讓您收集自訂計量和記錄自訂事件。 如需詳細資訊,請參閱自訂遙測資料
Function.<YOUR_FUNCTION_NAME> traces 包含特定函式執行的函式已啟動和函式已完成記錄。 針對成功的執行,這些記錄均位於 Information 層級。 例外狀況會記錄於 Error 層級。 執行階段也會建立 Warning 層級的記錄,像是將佇列訊息傳送至有害佇列時。
Function.<YOUR_FUNCTION_NAME>.User traces 使用者產生的記錄,可能屬於任何記錄層級。 如需從函式寫入記錄的詳細資訊,請參閱寫入至記錄
Host.Aggregator customMetrics 這些執行階段產生的記錄會透過可設定的期間來提供函式引動過程的計數與平均。 預設期間為 30 秒或 1,000 個結果,視何者較早達到而定。 範例包括執行次數、成功率和持續時間。 所有這些記錄都會在 Information 層級寫入。 如果您在 Warning 或以上層級進行篩選,就不會看到此資料。
Host.Results requests 這些執行階段產生的記錄表示函式的成功或失敗。 所有這些記錄都會在 Information 層級寫入。 如果您在 Warning 或以上層級進行篩選,就不會看到此資料。
Microsoft traces 完整記錄類別,反映主機所叫用的 .NET 執行階段元件。
Worker traces 針對非 .NET 語言,由語言背景工作處理序所產生的記錄。 在 Microsoft.* 類別中也可能記錄語言背景工作記錄,例如 Microsoft.Azure.WebJobs.Script.Workers.Rpc.RpcFunctionInvocationDispatcher。 這些記錄都會在 Information 層級寫入。

注意

對於 .NET 類別庫函式,這些類別會假設您使用的是 ILogger,而不是 ILogger<T>。 如需詳細資訊,請參閱Functions ILogger 文件

[資料表] 資料行會指出寫入記錄檔的資料表是 Application Insights 中的哪一個資料表。

設定記錄層級

記錄層級會指派給每個記錄檔。 值為整數,表示相對重要性:

LogLevel 程式碼 描述
追蹤 0 包含最詳細訊息的記錄。 這些訊息可能包含敏感性應用程式資料。 這些訊息預設會停用,且永遠不應在生產環境中啟用。
偵錯 1 開發期間用於互動式調查的記錄。 這些記錄主要應包含適用於偵錯的資訊,且不具備任何長期值。
資訊 2 追蹤應用程式一般流程的記錄。 這些記錄應具備長期值。
警告 3 醒目提示應用程式流程中異常或未預期事件的記錄,這些異常或未預期事件不會造成應用程式停止執行。
錯誤 4 在目前流程因失敗而停止執行時醒目提示的記錄。 這些錯誤應指出目前活動中的失敗,而非整個應用程式的失敗。
重大 5 描述無法復原的應用程式或系統損毀,或需要立即注意重大失敗的記錄。
None 6 停用指定類別的記錄。

host.json 檔案的設定決定函式應用程式傳送至 Application Insights 的記錄數量。

針對每個類別,您可以指出要傳送的最小記錄層級。 host.json 設定會根據Functions 執行階段版本而有所不同。

下列範例會根據下列規則定義記錄:

  • 針對 Host.ResultsFunction 的記錄,只在 Error 或更高層級記錄事件。
  • 針對 Host.Aggregator 的記錄,記錄所有產生的計量 (Trace)。
  • 對於所有其他的記錄,包括使用者記錄,僅記錄 Information 層級和更高層級的事件。
{
  "logging": {
    "fileLoggingMode": "always",
    "logLevel": {
      "default": "Information",
      "Host.Results": "Error",
      "Function": "Error",
      "Host.Aggregator": "Trace"
    }
  }
}

如果 host.json 包含多個以相同字串開頭的記錄,則會先比對具有已定義內容較多的記錄。 請考慮下列範例,該範例在執行階段中記錄了所有的項目,但 Host.Aggregator 除外,該項目記錄於 Error 層級:

{
  "logging": {
    "fileLoggingMode": "always",
    "logLevel": {
      "default": "Information",
      "Host": "Error",
      "Function": "Error",
      "Host.Aggregator": "Information"
    }
  }
}

您可以使用 None 的記錄層級設定來防止針對類別寫入任何記錄。

注意

Azure Functions 將遙測事件儲存在 Application Insights 資料表中,以便與 Application Insights 進行整合。 請勿將類別記錄層級設定為 Information 值,設定不同的值可以防止遙測傳送至這些資料表。 因此,您將無法在 Application Insights 或 [函式監視器] 索引標籤中看到相關資料。

從上述範例可以知道:

  • 如果 Host.Results 類別設定為 Error 記錄層級,那麼系統只會在 requests 資料表中收集失敗函式執行的主機執行遙測事件,以防在 Application Insights 和 [函式監視器] 索引標籤中顯示成功執行的主機執行詳細資料。
  • 如果 Function 類別設定為 Error 記錄層級,那麼系統將停止收集與 dependenciescustomMetricscustomEvents 相關的函式遙測資料,並防止在 Application Insights 中看到此資料。 系統只會收集以 Error 層級記錄的 traces

在這兩種情況下,您都會繼續收集 Application Insights 和 [函式監視器] 索引標籤中的錯誤和例外狀況資料。如需詳細資訊,請參閱具有大量遙測的解決方案

設定彙總工具

如前一節所述,執行階段經過一段時間就會彙總有關函式執行的資料。 預設期間為 30 秒或 1,000 個執行,視何者較早達到而定。 您可以在 host.json 檔案中設定此設定。 以下是範例:

{
    "aggregator": {
      "batchSize": 1000,
      "flushTimeout": "00:00:30"
    }
}

設定取樣

Application Insights 具有取樣功能,可以提供保護,以避免在尖峰負載期間完成的執行中產生過多的遙測資料。 當傳入執行速率超過指定的閾值時,Application Insights 就會開始隨機忽略某些傳入執行。 每秒執行次數上限的預設值為 20 (在 1.x 版中為五)。 您可以在 host.json 中設定取樣。 以下為範例:

{
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "maxTelemetryItemsPerSecond" : 20,
        "excludedTypes": "Request;Exception"
      }
    }
  }
}

您可以從取樣中排除特定類型的遙測。 在此範例中,RequestException 類型的資料會從取樣中遭到排除。 這可確保「所有」函式執行 (要求) 和例外狀況都會記錄下來,而其他類型的遙測仍會受到取樣。

如需詳細資訊,請參閱在 Application Insights 中取樣

設定調整控制器記錄

此功能處於預覽狀態。

您可以讓 Azure Functions 調整控制器發出記錄至 Application Insights 或 Blob 儲存體,以便進一步了解調整控制器針對您函式應用程式所做的決策。

若要啟用此功能,您可以將名為 SCALE_CONTROLLER_LOGGING_ENABLED 的應用程式設定新增至函式應用程式設定。 設定的下列值必須按照 <DESTINATION>:<VERBOSITY> 格式:

屬性 描述
<DESTINATION> 已傳送記錄的目的地。 有效值為 AppInsightsBlob
當您使用 AppInsights 時,請確定您的函式應用程式中已啟用 Application Insights
當您將目的地設定為 Blob 時,記錄會在名為 azure-functions-scale-controller 的 Blob 容器中建立,該容器位於 AzureWebJobsStorage 應用程式設定中的預設儲存體帳戶中。
<VERBOSITY> 指定記錄的層級。 支援的值為 NoneWarningVerbose
當設定為 Verbose 時,調整控制器會記錄背景工作計數中每次變更的原因,並針對考慮這些決策的觸發程序,記錄其相關資訊。 詳細資訊記錄包括觸發程序警告,以及觸發程序在調整控制器執行前後所使用的雜湊。

秘訣

請記住,如果您讓調整控制器記錄保持啟用狀態,您監視函式應用程式的潛在成本就會受到影響。 請考慮在您收集到足夠的資料前啟用記錄,並在資料足夠讓您了解調整控制器的行為之後,將其停用。

例如,下列 Azure CLI 命令會開啟從調整控制器到 Application Insights 的詳細資訊記錄:

az functionapp config appsettings set --name <FUNCTION_APP_NAME> \
--resource-group <RESOURCE_GROUP_NAME> \
--settings SCALE_CONTROLLER_LOGGING_ENABLED=AppInsights:Verbose

在此範例中,分別將 <FUNCTION_APP_NAME><RESOURCE_GROUP_NAME> 取代為函式應用程式的名稱和資源群組名稱。

下列 Azure CLI 命令會將詳細資訊設定為 None 來停用記錄:

az functionapp config appsettings set --name <FUNCTION_APP_NAME> \
--resource-group <RESOURCE_GROUP_NAME> \
--settings SCALE_CONTROLLER_LOGGING_ENABLED=AppInsights:None

您也可以使用下列 Azure CLI 命令移除 SCALE_CONTROLLER_LOGGING_ENABLED 設定來停用記錄:

az functionapp config appsettings delete --name <FUNCTION_APP_NAME> \
--resource-group <RESOURCE_GROUP_NAME> \
--setting-names SCALE_CONTROLLER_LOGGING_ENABLED

啟用調整控制器記錄後,您現在可以查詢調整控制器記錄了。

啟用 Application Insights 整合

針對將資料傳送至 Application Insights 的函式應用程式,它需要知道 Application Insights 資源的檢測金鑰。 金鑰必須在名為 APPINSIGHTS_INSTRUMENTATIONKEY 的應用程式設定中。

當您在 Azure 入口網站中,使用 Azure Functions Core ToolsVisual Studio Code,從命令列建立函式應用程式時,預設會啟用 Application Insights 整合。 Application Insights 資源的名稱與您的函式應用程式相同,而且其會建立於相同區域或最近的區域中。

入口網站中新的函式應用程式

若要檢閱所建立的 Application Insights 資源,請加以選取以展開 [Application Insights] 視窗。 您可以變更新資源名稱,或者在您希望儲存資料的 Azure 地理位置中,選取不同的位置

建立函式應用程式時啟用 Application Insights 的螢幕擷取畫面。

當您選取 [建立] 時,即會使用您的函式應用程式來建立 Application Insights 資源,其已在應用程式設定中設定了 APPINSIGHTS_INSTRUMENTATIONKEY。 一切都已準備就緒。

新增至現有的函式應用程式

如果沒有以函式應用程式建立 Application Insights 資源,請使用下列步驟來建立資源。 然後,您可以從該資源新增檢測金鑰,以作為函式應用程式中的應用程式設定

  1. Azure 入口網站中,搜尋並選取函式應用程式,然後選取您的函式應用程式。

  2. 選取視窗頂端的 [未設定 Application Insights] 橫幅。 如果您看不到此橫幅,則您的應用程式可能已經啟用 Application Insights。

    從入口網站啟用 Application Insights 的螢幕擷取畫面。

  3. 使用下表中指定的設定,展開 [變更您的資源] 並建立 Application Insights 資源:

    設定 建議的值 描述
    新資源名稱 唯一的應用程式名稱 最簡單的方式是使用與您函式應用程式一樣的名稱,而這必須是您訂用帳戶中唯一的名稱。
    位置 西歐 可能的話,請使用與函式應用程式相同的區域,或該區域附近的區域。

    建立 Application Insights 資源的螢幕擷取畫面。

  4. 選取 [套用]。

    Application Insights 資源會建立在函式應用程式所在的資源群組和訂用帳戶。 建立資源之後,請關閉 [Application Insights] 視窗。

  5. 在您的函式應用程式中,選取 [設定] 之下的 [組態],然後選取 [應用程式設定]。 如果您看到名為 APPINSIGHTS_INSTRUMENTATIONKEY 的設定,表示 Azure 中執行的函式應用程式已啟用 Application Insights 整合。 如果由於某些原因,此設定不存在,請使用 Application Insights 檢測金鑰做為值,以新增此設定。

注意

舊版 Functions 會使用內建的監視功能 (不再建議使用)。 當您針對這類函式應用程式啟用 Application Insights 整合時,您也必須停用內建記錄

停用內建記錄

當您啟用 Application Insights,請停用使用 Azure 儲存體的內建記錄。 內建記錄適合用來測試少量的工作負載,但不適用於負載繁重的實際執行環境。 若要監視實際執行環境,建議使用 Application Insights。 如果將內建記錄用於實際執行環境,記錄內容可能會因為 Azure 儲存體的頻寬節流設定而變得不完整。

若要停用內建記錄,請刪除 AzureWebJobsDashboard 應用程式設定。 如需在 Azure 入口網站中刪除應用程式設定的詳細資訊,請參閱如何管理函式應用程式應用程式設定。 刪除應用程式設定之前,確定相同函式應用程式中目前沒有任何函式會使用適用於 Azure 儲存體觸發程序或繫結的設定。

具有大量遙測的解決方案

函式應用程式是解決方案中不可或缺的一環,該解決方案可能會導致大量的遙測,例如 IoT 解決方案、快速事件驅動解決方案、高負載財務系統和整合系統。 在此情況下,您應該考慮額外的設定,以便降低成本,同時維持可檢視性。

您可以在即時儀表板、警示、詳細診斷中取用產生的遙測。 根據如何取用產生的遙測,您必須定義一個策略,以便減少產生的資料量。 此策略可讓您在生產環境中正確地監視、操作和診斷函式應用程式。 您可以考慮下列選項:

  • 使用取樣:如先前所述,這有助於大幅減少擷取的遙測事件量,同時維持統計上正確的分析。 即使使用取樣,您仍可能會收到大量的遙測。 檢查調適型取樣提供的選項。 例如,將 maxTelemetryItemsPerSecond 設定為適當的值,以便平衡監視需求與產生的遙測量。 請記住,每個執行函式應用程式的主機都會套用遙測取樣。

  • 預設記錄層級:使用 WarningError 做為所有遙測類別的預設值。 現在,您可以決定要在 Information 層級設定什麼類別,以便正確監視和診斷函式。

  • 調整函式遙測:將預設記錄層級設定為 ErrorWarning 時,不會收集每個函式的詳細資訊 (相依性、自訂計量、自訂事件和追蹤)。 對於生產環境監視的關鍵函式,請定義 Function.<YOUR_FUNCTION_NAME> 類別的明確項目,並將其設定為 Information,以便讓您收集詳細資訊。 此時,若要避免在 Information 層級收集使用者產生的記錄,請將 Function.<YOUR_FUNCTION_NAME>.User 類別設定為 ErrorWarning 記錄層級。

  • Host.Aggregator 類別:如設定類別中所述,此類別會提供函式叫用的彙總資訊。 此類別中的資訊會在 Application Insights customMetrics 資料表中受到收集,並顯示在 [Azure 入口網站] 的函式 [概觀] 索引標籤中。 根據您設定彙總工具的方式,請考慮到在收集的遙測中會有延遲,該延遲取決於 flushTimeout。 如果您將此類別設定為不同於 Information 的其他值,您將停止收集 customMetrics 資料表中的資料,而且不會在函式 [概觀] 索引標籤中顯示計量。

    下列螢幕擷取畫面顯示函式 [概觀] 索引標籤中顯示的 Host.Aggregator 遙測資料:

    螢幕擷取畫面顯示函式 [概觀] 索引標籤中顯示的 Host.Aggregator 遙測。

    下列螢幕擷取畫面顯示 Application Insights customMetrics 資料表中的 Host.Aggregator 遙測資料:

    螢幕擷取畫面顯示 customMetrics Application Insights 資料表中的 Host.Aggregator 遙測。

  • Host.Results 類別:如設定類別中所述,此類別會提供執行階段產生的記錄,該記錄會指出函式叫用是成功或失敗。 此類別的資訊會在 Application Insights requests 資料表中受到收集,並顯示在 [監視] 索引標籤和不同的 Application Insights 儀表板 (效能、失敗等等) 中。 如果您將此類別設定為不同於 Information 的其他值,則只會收集在定義的記錄層級 (或更高層級) 產生的遙測。 例如,將其設定為 error 會導致只追蹤失敗執行的要求資料。

    下列螢幕擷取畫面顯示函式 [監視] 索引標籤中顯示的 Host.Results 遙測資料:

    螢幕擷取畫面顯示函式 [監視] 索引標籤中的 Host.Results 遙測。

    下列螢幕擷取畫面顯示 Application Insights 效能儀表板中顯示的 Host.Results 遙測資料:

    螢幕擷取畫面顯示 Application Insights 效能儀表板中的 Host.Results 遙測。

  • Host.Aggregator 與 Host.Results:這兩個類別都會提供有關函式執行的良好見解。 如有需要,您可以從其中一個類別中移除詳細資訊,以便使用另一個類別進行監視和警示。 以下是一個範例:

{
  "version": "2.0",  
  "logging": {
    "logLevel": {
      "default": "Warning",
      "Function": "Error",
      "Host.Aggregator": "Error",
      "Host.Results": "Information", 
      "Function.Function1": "Information",
      "Function.Function1.User": "Error"
    },
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "maxTelemetryItemsPerSecond": 1,
        "excludedTypes": "Exception"
      }
    }
  }
} 

使用此設定,您將讓:

  • 所有函式和遙測類別的預設值設定為 Warning (包括 Microsoft 和背景工作類別)。 因此,根據預設,會收集執行階段和自訂記錄所產生的所有錯誤和警告。

  • Function 類別記錄層級設定為 Error,這樣一來根據預設,針對所有函式,只會收集例外狀況和錯誤記錄 (會跳過相依性、使用者產生的計量,以及使用者產生的事件)。

  • 針對 Host.Aggregator 類別,因為其設定為 Error 記錄層級,所以不會在 customMetrics Application Insights 資料表中收集來自函式叫用的彙總資訊,而且執行計數的相關資訊 (總計、成功和失敗) 將不會顯示在函式概觀儀表板中。

  • 針對 Host.Results 類別,會在 requests Application Insights 資料表中收集所有主機執行資訊。 所有叫用結果都會顯示在函式監視儀表板 和 Application Insights 儀表板中。

  • 針對稱為 Function1 的函式,我們已將記錄層級設定為 Information。 因此,針對此具體的函式,會收集所有遙測 (相依性、自訂計量和自訂事件)。 針對相同的函式,Function1.User 類別 (使用者產生的追蹤) 會設定為 Error,因此只會收集自訂錯誤記錄。

    注意

    在 v1.x 中不支援每個函式分別設定。

  • 取樣會設定為,每個類型每秒傳送一個遙測項目,但不包括例外狀況。 執行函式應用程式的每個伺服器主機都會發生此取樣。 因此,如果我們有四個執行個體,此設定會針對每個類型每秒發出四個遙測項目,以及所有可能發生的例外狀況。

    注意

    度量計量 (例如要求率及例外狀況率) 會受到調整來補償取樣率,讓它們能在計量瀏覽器中顯示大致上正確的值。

秘訣

實驗不同的設定,以確保您涵蓋記錄、監視和警示的需求。 此外,請確定您在發生非預期的錯誤或運作異常時具有詳細的診斷。

在執行階段覆寫監視設定

最後,在某些情況下,您可能會需要在生產環境中快速變更特定類別的記錄行為,而且您不想只為了要進行 host.json 檔案中的變更就進行整個部署。 在這種情況下,您可以覆寫 host.json 值

若要在應用程式設定層級設定這些值 (並避免只為了 host.json 變更就得重新部署),您應該建立對等值做為應用程式設定,以便覆寫特定的 host.json 值。 當執行階段以格式 AzureFunctionsJobHost__path__to__setting 尋找應用程式設定時,其會覆寫位於 JSON 中 path.to.setting 的對等 host.json 設定。 以應用程式設定表示時,用來表示 JSON 階層的點 (.) 會取代為雙底線 (__)。 例如,您可以使用下列應用程式設定來設定個別函式記錄層級,如上方的 host.json 所示。

Host.json 路徑 應用程式設定
logging.logLevel.default AzureFunctionsJobHost__logging__logLevel__default
logging.logLevel.Host.Aggregator AzureFunctionsJobHost__logging__logLevel__Host__Aggregator
logging.logLevel.Function AzureFunctionsJobHost__logging__logLevel__Function
logging.logLevel.Function.Function1 AzureFunctionsJobHost__logging__logLevel__Function.Function1
logging.logLevel.Function.Function1.User AzureFunctionsJobHost__logging__logLevel__Function.Function1.User

您可以直接在 [Azure 入口網站函式應用程式設定] 刀鋒視窗覆寫設定,或使用 Azure CLI 或 PowerShell 指令碼進行覆寫。

az functionapp config appsettings set --name MyFunctionApp --resource-group MyResourceGroup --settings "AzureFunctionsJobHost__logging__logLevel__Host__Aggregator=Information"

注意

透過變更應用程式設定來覆寫 host.json將會重新啟動您的函式應用程式。

使用健康情況檢查來監視函數應用程式

健康情況檢查功能可以用來監視進階 (Elastic Premium) 和專用 (App Service) 方案上的函數應用程式。 健康情況檢查不是取用方案的選項。 若要了解如何進行設定,請參閱使用健康情況檢查來監視 App Service 執行個體。 您的函數應用程式應該有在端點上回應 HTTP 狀態碼 200 的 HTTP 觸發程序函數,而此端點與健康情況檢查的 'Path' 參數上所設定的端點相同。 您也可以讓該函數執行額外的檢查,以確保相依服務可連線且可運作。

後續步驟

如需有關監視的詳細資訊,請參閱: