拦截 Azure Function Host Shutdown:Flush Application Insights TelemetryClient
Intercept Azure Function Host Shutdown: Flush Application Insights TelemetryClient
我正在尝试使用 Azure Functions:我主要尝试将现有的 Web 作业迁移到 Azure Functions,现在是时候将 Application Insights 集成到我的一个函数中了。
所以基本上我只需要 TelemetryClient
的一个实例,但这假设我能够在应用程序停止时刷新内存缓冲区。
我使用了 TimerTrigger,但它只是用于测试目的。
我引用了 Microsoft.ApplicationInsights nuget package (),我的 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。
为了模拟应用程序关闭,我在底层网络应用程序中创建了一个 "test"
应用程序设置,并在我希望主机重新启动时修改它:
不幸的是,这不起作用...我没有在应用洞察仪表板中看到名称为 "TelemetryClientFlush"
的任何事件:
所以我现在想知道是否有任何方法可以在 azure 函数主机停止时进行拦截?
虽然 Azure Functions 运行 在 WebJobs SDK 之上,但它不会 运行 在传统的 Kudu WebJobs 基础架构下。 WebJobsShutdownWatcher
实际上依赖于 Kudu 主机的功能,特别是 WEBJOBS_SHUTDOWN_FILE
指示的哨兵文件。基本上,当 Kudu 主机关闭时,它会触及观察者正在监视的这个文件。由于未触及此类文件,因此未触发您的代码。
我们可以进行更改以允许观察者按原样工作,或者我们可以改为引入新的函数模式。我在我们的 repo here 中记录了一个问题来跟踪这个建议。我认为场景很重要,我们会考虑一下。
除了 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}");
}
我正在尝试使用 Azure Functions:我主要尝试将现有的 Web 作业迁移到 Azure Functions,现在是时候将 Application Insights 集成到我的一个函数中了。
所以基本上我只需要 TelemetryClient
的一个实例,但这假设我能够在应用程序停止时刷新内存缓冲区。
我使用了 TimerTrigger,但它只是用于测试目的。
我引用了 Microsoft.ApplicationInsights nuget package (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。
为了模拟应用程序关闭,我在底层网络应用程序中创建了一个 "test"
应用程序设置,并在我希望主机重新启动时修改它:
不幸的是,这不起作用...我没有在应用洞察仪表板中看到名称为 "TelemetryClientFlush"
的任何事件:
所以我现在想知道是否有任何方法可以在 azure 函数主机停止时进行拦截?
虽然 Azure Functions 运行 在 WebJobs SDK 之上,但它不会 运行 在传统的 Kudu WebJobs 基础架构下。 WebJobsShutdownWatcher
实际上依赖于 Kudu 主机的功能,特别是 WEBJOBS_SHUTDOWN_FILE
指示的哨兵文件。基本上,当 Kudu 主机关闭时,它会触及观察者正在监视的这个文件。由于未触及此类文件,因此未触发您的代码。
我们可以进行更改以允许观察者按原样工作,或者我们可以改为引入新的函数模式。我在我们的 repo here 中记录了一个问题来跟踪这个建议。我认为场景很重要,我们会考虑一下。
除了 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}");
}