監視 Azure Functions 和事件中樞

Azure 事件中樞
Azure Functions
Azure 監視器

監視可讓您深入瞭解系統的行為和健康情況,並協助建置環境的整體檢視、歷史趨勢、相互關聯各種因素,以及測量效能、耗用量或錯誤率的變化。

Azure Functions 提供與 Application Insights 的內建整合。 您可以從 Application Insights 取得資訊,例如函式應用程式實例的數目或函式的要求和相依性遙測。 使用 Functions 和事件中樞時,Application Insights 也可以追蹤傳出相依性遙測至事件中樞、計算處理時間,以及顯示透過事件中樞連線之系統的端對端流程。

本節介紹您可以從 Application Insights 取得的實用功能和深入解析,以取得事件中樞和函式解決方案。

應用程式對應

應用程式對應 顯示系統中的元件如何彼此互動。 由於 Application Insights 提供的相依性遙測,它會對應 Azure Functions 與事件中樞之間的事件流程,包括事件中樞中每個函式執行的平均和事件的平均持續時間,以及顯示包含以紅色標示失敗的交易。

將預期的負載傳送至您的系統之後,您可以在 Azure 入口網站 中移至 Application Insights,然後在提要欄中選擇 [應用程式對應]。 以下是一個對應,顯示寫入下游資料庫時的三個函式、三個事件中樞和明顯的失敗:

應用程式對應

端對端交易詳細資料

端對端交易詳細數據會依時間順序顯示系統元件彼此互動的方式。 此檢視也會顯示事件在處理中花費的時間長度。 您也可以從這個檢視鑽研每個元件的遙測數據,讓您在發生問題時更輕鬆地針對相同要求內的元件進行疑難解答。

端對端交易

平臺計量和遙測

在適用於事件中樞和 Azure Functions 的 Azure 監視器中,平臺產生的計量可用於整體監視解決方案行為和健康情況:

  • Azure 監視器中的 Azure 事件中樞 計量對於擷取事件中樞的實用見解感興趣(例如傳入要求、傳出要求、節流要求、成功要求、傳入訊息、傳出訊息、擷取的訊息、傳入位元組、傳出位元組、擷取的位元組、使用者錯誤)。

  • Azure Functions 計量會共用 Azure App 服務 的許多計量,並新增函式執行計數和函式執行單位,可用來瞭解使用量計劃的使用率和成本。 其他感興趣的計量包括連線、數據輸入、數據輸出、平均記憶體工作集、線程計數、要求和響應時間。

Azure Functions 與 Application Insights 整合,可為 Functions 主機和函式執行提供進階和詳細的遙測和深入解析。 若要深入瞭解,請參閱 在 Application Insights 中分析 Azure Functions 遙測。 使用 Application Insights 監視拓撲時,有各種不同的組態可供使用。 若要深入了解,請參閱如何設定 Azure Functions 的監視

以下是追蹤數據表中所產生事件中樞觸發函式的額外遙測範例:

Trigger Details: PartionId: 6, Offset: 3985758552064-3985758624640, EnqueueTimeUtc: 2022-10-31T12:51:58.1750000+00:00-2022-10-31T12:52:03.8160000+00:00, SequenceNumber: 3712266-3712275, Count: 10

此資訊會要求您使用事件中樞擴充功能 4.2.0 或更新版本。 此數據非常有用,因為它包含觸發函式執行之訊息的相關信息,並可用於查詢和深入解析。 每次觸發函式時,它都會包含下列數據:

  • 分割區 識別碼 (6)
  • 資料 分割位移 範圍 (3985758552064-3985758624640)
  • UTC 的加入佇列時間範圍 (2022-10-31T12:51:58.1750000+00:00:00-2022-10-31T12:52:03.8160000+00:00)
  • 序號範圍 3712266-3712275
  • 訊息計數 (10)

如需如何使用此遙測的範例,請參閱 Application Insights 查詢範例一節。

自定義遙測也適用於不同語言(C# 類別庫、C# 隔離C# 腳本JavaScriptJavaPowerShellPython)。 此記錄會顯示在 Application Insights 中的追蹤 資料表中。 您可以在 Application Insights 中建立自己的專案,並新增可用於查詢數據和建立自定義儀錶板的自定義維度。

最後,當您的函式應用程式使用輸出系結連線到事件中樞時,專案也會寫入 Application Insights 相依性數據表

相依性資料表

針對事件中樞,相互關聯會插入事件承載中,而且您會在 事件中看到 Diagnostic-Id 屬性:

診斷標識碼屬性

這會遵循 W3C 追蹤內容 格式,該格式也會當做 Functions 所建立遙測中的作業標識碼作業連結 ,這可讓 Application Insights 建構事件中樞事件與函式執行之間的相互關聯,即使事件中樞事件和函式執行分散也一樣。

批次事件相互關聯

Application Insights 查詢範例

以下是使用 Azure Functions 監視事件中樞時實用的 Application Insights 查詢清單。 此查詢會使用事件中樞擴充功能 4.2.0 和更新的遙測,顯示事件中樞觸發函式的詳細資訊。

在 Application Insights 中啟用取樣時,數據可能會有間距。

詳細的事件處理資訊

只有在使用批次分派時,才會以正確的格式發出數據。 批次分派表示函式會針對每個執行接受多個事件,這是 建議用於效能。 請記住以下考量:

  • dispatchTimeMilliseconds 大約是事件寫入事件中樞的時間長度,以及函式應用程式所挑選的處理時間長度。
  • dispatchTimeMilliseconds 可能是負數或不正確,因為事件中樞伺服器與函式應用程式之間的時鐘漂移。
  • 事件中樞分割區會循序處理。 在處理所有先前的訊息之前,訊息將不會分派至函式程式代碼進行處理。 監視函式的運行時間,因為運行時間較長會導致分派延遲。
  • 計算會使用批次中第一個訊息的 enqueueTime。 批次中其他訊息的分派時間可能會較低。
  • dispatchTimeMilliseconds 是以時間點為基礎。
  • 序號是每個分割區,而且可能會發生重複的處理,因為事件中樞不保證一次訊息傳遞。
traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| project timestamp, cloud_RoleInstance, operation_Name, processId =
customDimensions.ProcessId, partitionId, messageCount, sequenceNumberStart,
sequenceNumberEnd, enqueueTimeStart, enqueueTimeEnd, dispatchTimeMilliseconds

詳細事件處理

分派延遲視覺效果

此查詢會將指定事件中樞觸發函式的第 50 個和第 90 個百分位數事件分派延遲可視化。 如需詳細資訊和注意事項,請參閱上述查詢。

traces
| where operation_Name == "<ENTER THE NAME OF YOUR FUNCTION HERE>"
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| summarize percentiles(dispatchTimeMilliseconds, 50, 90) by bin(timestamp, 5m)
| render timechart

分派延遲視覺效果

分派延遲摘要

此查詢與上述類似,但會顯示摘要檢視。

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| summarize messageCount = sum(messageCount),
percentiles(dispatchTimeMilliseconds, 50, 90, 99, 99.9, 99.99) by operation_Name

分派延遲摘要

跨分割區的訊息散發

此查詢示範如何可視化跨數據分割的訊息散發。

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| summarize messageCount = sum(messageCount) by cloud_RoleInstance,
bin(timestamp, 5m)
| render areachart kind=stacked

跨分割區的訊息散發

跨實例的訊息散發

此查詢示範如何可視化跨實例的訊息散發。

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| summarize messageCount = sum(messageCount) by cloud_RoleInstance,
bin(timestamp, 5m)
| render areachart kind=stacked

跨實例的訊息散發

執行實例和已配置的實例

此查詢示範如何可視化正在處理事件中樞事件的 Azure Functions 實例數目,以及實例總數(處理和等候租用)。 大部分時候,他們都應該是相同的。

traces
| where message startswith "Trigger Details: Parti"
| summarize type = "Executing Instances", Count = dcount(cloud_RoleInstance) by
bin(timestamp, 60s)
| union (
    traces
    | summarize type = "Allocated Instances", Count = dcount(cloud_RoleInstance) by
bin(timestamp, 60s)
)
| project timestamp, type, Count
| render timechart

執行實例和已配置的實例

特定函式執行的所有遙測

operation_Id欄位可以跨 Application Insights 中的不同數據表使用。 針對事件中樞觸發的 Azure Functions,例如,下列查詢會產生觸發程式資訊、函式程式代碼內記錄的遙測,以及相依性和例外狀況:

union isfuzzy=true requests, exceptions, traces, dependencies
| where * has "<ENTER THE OPERATION_ID OF YOUR FUNCTION EXECUTION HERE>"
| order by timestamp asc

特定函式執行的所有遙測

事件的端對端延遲

當觸發程式詳細數據追蹤中的 enqueueTimeUtc 屬性只顯示函式處理之每個批次第一個事件的加入佇列時間時,可以使用更進階的查詢來計算兩個函式與事件中樞之間的事件端對端延遲。 此查詢將會展開第二個函式要求中的作業連結(如果有的話),並將其結束時間對應至第一個函式開始時間的相同對應作業標識符。

let start = view(){
requests
| where operation_Name == "FirstFunction"
| project start_t = timestamp, first_operation_Id = operation_Id
};
let link = view(){
requests
| where operation_Name == "SecondFunction"
| mv-expand ex = parse_json(tostring(customDimensions["_MS.links"]))
| extend parent = case(isnotempty(ex.operation_Id), ex.operation_Id, operation_Id )
| project first_operation_Id = parent, second_operation_Id = operation_Id
};
let finish = view(){
traces
| where customDimensions["EventName"] == "FunctionCompleted" and operation_Name
== "SecondFunction"
| project end_t = timestamp, second_operation_Id = operation_Id
};
start
| join kind=inner (
link
| join kind=inner finish on second_operation_Id
) on first_operation_Id
| project start_t, end_t, first_operation_Id, second_operation_Id
| summarize avg(datetime_diff('second', end_t, start_t))

事件的端對端延遲

參與者

本文由 Microsoft 維護。 原始投稿人如下。

主體作者:

若要查看非公開的 LinkedIn 設定檔,請登入 LinkedIn。

下一步

若要深入瞭解,請考慮檢閱下列相關文章: