4

我在玩一點Azure功能:大多數情況下,我嘗試將現有的Webjob移植到Azure函數,現在是時候讓我將Application Insights集成到我的一個函數中。攔截Azure功能主機關閉:刷新應用程序洞察TelemetryClient

所以基本上我只需要TelemetryClient的一個實例,但是這個假設我能夠在應用程序停止時刷新內存緩衝區。

我已經使用了TimerTrigger,但它只是用於測試目的。

我引用的Microsoft.ApplicationInsights NuGet包(from this SO post)和我run.csx文件看起來像這樣:

using System; 
using Microsoft.ApplicationInsights; 
using Microsoft.Azure.WebJobs; 

public static void Run(TimerInfo myTimer, TraceWriter log) 
{ 
    MyTimerJob.TelemetryClient.TrackEvent("AzureFunctionTriggered"); 
    log.Verbose($"C# Timer trigger function executed at: {DateTime.Now}"); 
}  

public static class MyTimerJob 
{ 
    public static readonly TelemetryClient TelemetryClient; 

    static MyTimerJob(){ 
     TelemetryClient = new TelemetryClient() 
      { InstrumentationKey = "MyInstrumentationKey" }; 

     // When it shutdowns, we flush the telemty client. 
     new WebJobsShutdownWatcher().Token.Register(() => 
     { 
      TelemetryClient.TrackEvent("TelemetryClientFlush"); 
      TelemetryClient.Flush(); 
     }); 
    } 
} 

這個實現是一個有點棘手...

  • 我有一個靜態TelemetryClient以確保我將重用相同的實例。
  • 我嘗試使用WebJobsShutdownWatcher來檢測主機何時停止,以便我可以刷新TelemetryClient。

要模擬應用程序關閉,我在下面的Web應用程序創建一個應用程序"test"設置,我修改它時,我想在主機重新啓動:

Azure Function - Application terminated log

不幸的是,這並不工作......我沒看到名字"TelemetryClientFlush"任何情況下從應用程序分析信息中心:

Microsoft Application Insights - Custom Events dashboard

所以我現在想知道當azure函數主機停止時是否有任何方法來攔截?

+0

能否請你加$日誌語句將關閉回調確認代碼運行在所有。查看WebJobsShutdownWatcher源代碼,需要遵循幾個條件才能執行關機回調:https://github.com/Azure/azure-webjobs-sdk/blob/master/src/Microsoft.Azure.WebJobs。主機/ WebjobsShutdownWatcher.cs –

回答

3

除了Mathew所描述的內容之外,您可能還想玩弄取消令牌,如果要求我們會通過。

如果你爲你的函數添加一個CancellationToken類型的參數,我們會傳入一個令牌,當主機在正常情況下關閉時,這個令牌會被髮送信號。使用可以讓你關閉到你所需要的:

using System; 
using System.Threading; 
using Microsoft.ApplicationInsights; 

public static readonly TelemetryClient TelemetryClient = new TelemetryClient(){ InstrumentationKey = "MyInstrumentationKey" }; 
public static bool first = true; 
public static void Run(TimerInfo myTimer, TraceWriter log, CancellationToken token) 
{ 
    if(first){ 
     token.Register(() => 
     { 
      TelemetryClient.TrackEvent("TelemetryClientFlush"); 
      TelemetryClient.Flush(); 
     }); 
     first = false; 
    } 

    TelemetryClient.TrackEvent("AzureFunctionTriggered"); 
    log.Verbose($"C# Timer trigger function executed at: {DateTime.Now}"); 
} 
+0

這樣我就可以存儲取消令牌並註冊一個將在主機關閉時執行的操作? – Thomas

+0

是的,如果尚未註冊(即第一次調用函數),您需要註冊該操作。該動作將在/如果令牌被髮信號時被調用。 –

+1

法比奧,而不是編輯我的問題或發佈一個新的答案,我編輯了你的答案和我用過的示例代碼(對於不熟悉webjob sdk的人可能會很有用)。它很棒!謝謝。 – Thomas

3

雖然Azure函數確實在WebJobs SDK上運行,但它不會在傳統的Kudu WebJobs基礎結構下運行。 WebJobsShutdownWatcher實際上依賴於Kudu主機的功能,特別是WEBJOBS_SHUTDOWN_FILE指示的哨點文件。基本上,當Kudu主機關閉時,它會觸及觀察者正在監視的這個文件。由於沒有這樣的文件被觸摸,你的代碼不會被觸發。

我們可以進行更改以允許觀察者按原樣工作,否則我們可能會爲函數引入新模式。我在我們的回購here中記錄了一個問題,以跟蹤此建議。我認爲這個場景很重要,我們會考慮一下。