19

実稼働中のいくつかのプロジェクトで一連の問題 (応答時間が長い) が発生しており、サーバーで何が起こっているかを正確に確認したいと考えていました。次に、この記事に従って、すべてのプロジェクトに Application Insights を追加しました。問題は、両方の WebAPI プロジェクトがサーバー データを Azure portal に送信していないのに対し、他のすべてのプロジェクト (MVC 5) は送信していることです。

Azure で対応する Application Insights ブレードにアクセスすると、次のように表示されます。

ここに画像の説明を入力

Azure VM の Application Insights ステータス モニターでデータ収集を無効にして再度有効にしようとしましたが、API への要求中に IIS を数回再起動しましたが、役に立ちませんでした。MVC プロジェクトでこれを有効にすると、サイトでページを開いたときに Azure portal でほぼ瞬時にデータを確認できます。

これらの特定のプロジェクトのデータが Azure VM から送信されていないことを確認したとき、独自のインフラストラクチャでホストされている開発環境で同じコレクションをセットアップしようとしましたが、まったく同じ状況が繰り返され、可能性が排除されました。これは、Azure VM でホストされているプロジェクトに関連しています。

これらのプロジェクトが Azure にデータを送信するのを妨げている原因は正確にはわかりませんが、動作中のプロジェクトと動作していないプロジェクトを比較すると、WebAPI プロジェクトが新しい OWIN を使用しているという事実に関係している可能性があると思います。 MVC のものは標準の MVC プロジェクトですが、パイプラインです。両方のプロジェクト タイプの web.config ファイルと bin フォルダーの両方を確認したところ、Insights Monitor によって正しく変更されているようです (同じ新しい dll が bin フォルダーに追加され、同じ http モジュールが Web に追加されていることがわかります。構成)。

それを念頭に置いて、OWIN/Katana パイプラインに依存する WebAPI プロジェクトで Application Insights を使用してサーバー側のテレメトリを有効にするにはどうすればよいでしょうか? この場合、プロジェクトが Azure にデータを送信しない正確な原因を突き止めるにはどうすればよいでしょうか?

4

3 に答える 3

21

これは古い質問ですが、「web api application Insights owin」の検索では依然として上位 3 位にランクされていました。多くの検索を行った後、独自のミドルウェアを作成したり、すべてを明示的に計測したりする必要のない多くの回答は得られませんでした。物事を非常にシンプルにする拡張パッケージに出会いました。

これと関連するNuGet パッケージGithub リポジトリは次のとおりです。

リンクを見るのが面倒な人のために、追加する必要があったのは次のとおりです。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseApplicationInsights();

        // rest of the config here...
    }
}

これを ApplicationInsights.Config に追加します

<TelemetryInitializers>
    <!-- other initializers.. -->
    <Add Type="ApplicationInsights.OwinExtensions.OperationIdTelemetryInitializer, ApplicationInsights.OwinExtensions"/>
</TelemetryInitializers>
于 2016-05-18T02:08:34.420 に答える
10

AI は httpmodule を使用して開始要求で情報を収集し、終了要求でそれを送信します。こちらで説明されているように、Owin/Katana はミドルウェアを使用してさまざまなステージでロジックを実行します。AI 自動収集ロジックのほとんどは内部にあるため、ミドルウェアで再利用することはできません。ただし、コードを自分で計測することはできます。コードから TelemetryClient を作成し、リクエスト、トレース、および例外の送信を開始します (ここで説明したように)

于 2015-04-06T20:01:56.640 に答える
7

以下は、Application Insights 用の OWIN ミドルウェアの実装です。

/// <summary>
/// Extensions to help adding middleware to the OWIN pipeline
/// </summary>
public static class OwinExtensions
{
    /// <summary>
    /// Add Application Insight Request Tracking to the OWIN pipeline
    /// </summary>
    /// <param name="app"><see cref="IAppBuilder"/></param>
    public static void UseApplicationInsights(this IAppBuilder app) => app.Use(typeof(ApplicationInsights));

}

/// <summary>
/// Allows for tracking requests via Application Insight
/// </summary>
public class ApplicationInsights : OwinMiddleware
{

    /// <summary>
    /// Allows for tracking requests via Application Insight
    /// </summary>
    /// <param name="next"><see cref="OwinMiddleware"/></param>
    public ApplicationInsights(OwinMiddleware next) : base(next)
    {
    }

    /// <summary>
    /// Tracks the request and sends telemetry to application insights
    /// </summary>
    /// <param name="context"><see cref="IOwinContext"/></param>
    /// <returns></returns>
    public override async Task Invoke(IOwinContext context)
    {
        // Start Time Tracking
        var sw = new Stopwatch();
        var startTime = DateTimeOffset.Now;
        sw.Start();

        await Next.Invoke(context);

        // Send tracking to AI on request completion
        sw.Stop();

        var request = new RequestTelemetry(
            name: context.Request.Path.Value,
            startTime: startTime,
            duration: sw.Elapsed,
            responseCode: context.Response.StatusCode.ToString(),
            success: context.Response.StatusCode >= 200 && context.Response.StatusCode < 300
            )
        {
            Url = context.Request.Uri,
            HttpMethod = context.Request.Method
        };

        var client = new TelemetryClient();
        client.TrackRequest(request);

    }
}
于 2016-03-12T03:24:39.773 に答える