web-dev-qa-db-ja.com

OWINを使用するWebApiプロジェクトでApplicationInsightsサーバーテレメトリを有効にするにはどうすればよいですか?

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

これは、Azureで対応するApplicationInsightsブレードにアクセスしたときに表示されるものです。

enter image description here

AzureVMのApplicationInsightsステータスモニターでデータ収集を無効にしてから再度有効にしようとしましたが、APIにリクエストを送信しているときに、IISを数回再起動しましたが、役に立ちませんでした。有効にするとMVCプロジェクトでは、サイトでページを開くと、Azureポータルでほぼ瞬時にデータを確認できます。

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

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

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

17
julealgon

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

10
Anastasia Black

これは古い質問ですが、「web api applicationinsightsowin」の検索結果の上位3件に含まれていました。独自のミドルウェアを作成したり、すべてを明示的に計測したりする必要がなかった、多くの検索と多くの回答の後で。私たちは物事を非常にシンプルにする拡張パッケージに出くわしました:

これが Githubリポジトリ とそれに関連する NuGetパッケージ です

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

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>
19
Norrec

以下は、ApplicationInsights用の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);

    }
}
7
Phillsta