7

私は Azure Function で少し遊んでいます: ほとんどの場合、既存の Web ジョブを Azure Functions に移行しようとしていますが、今度は自分の関数の 1 つに Application Insights を統合する時が来ました。

したがって、基本的に必要なインスタンスは 1 つだけですTelemetryClientが、これは、アプリケーションが停止したときにメモリ内バッファーをフラッシュできることを前提としています。

私は TimerTrigger を使用しましたが、それはテスト目的のためだけでした。

Microsoft.ApplicationInsights nuget パッケージ (この SO 投稿から)を参照しましたが、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同じインスタンスを再利用することを確実にするためのスタティックがあります。
  • WebJobsShutdownWatcherTelemetryClient をフラッシュできるように、ホストの停止を検出するためにを使用してみました。

アプリケーションのシャットダウンをシミュレートするため"test"に、基になる Web アプリでアプリ設定を作成し、ホストを再起動するときにそれを変更します。

Azure 関数 - アプリケーション終了ログ

残念ながら、これは機能しません..."TelemetryClientFlush"アプリのインサイト ダッシュボードから、名前の付いたイベントが表示されませんでした:

Microsoft Application Insights - カスタム イベント ダッシュボード

だから、紺碧の機能ホストが停止しているときにインターセプトする方法があるかどうか疑問に思っていますか?

4

2 に答える 2

6

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}");
}
于 2016-04-22T12:25:58.727 に答える
3

Azure Functions は WebJobs SDK 上で実行されますが、従来のKudu WebJobsインフラストラクチャでは実行されません。WebJobsShutdownWatcher実際には、Kudu ホストの機能、特に で示されるセンチネル ファイルに依存していますWEBJOBS_SHUTDOWN_FILE。基本的に、Kudu ホストがシャットダウンしているときに、ウォッチャーが監視しているこのファイルにアクセスします。そのようなファイルは変更されていないため、コードはトリガーされていません。

ウォッチャーがそのまま機能するように変更を加えるか、代わりに関数の新しいパターンを導入することができます。この提案を追跡するために、こちらのレポに問題を記録しました。シナリオは重要だと思いますので、少し考えてみます。

于 2016-04-21T15:52:45.660 に答える