実稼働中のいくつかのプロジェクトで多くの問題(長い応答時間を読み取る)が発生しており、サーバーで何が起こっているのかを正確に確認したいと考えていました。次に、 この記事 に従って、すべてのプロジェクトにApplicationInsightsを追加しました。問題は、他のすべてのプロジェクト(MVC 5)が送信しているのに対し、両方のWebAPIプロジェクトがサーバーデータをAzureポータルに送信していないことです。
これは、Azureで対応するApplicationInsightsブレードにアクセスしたときに表示されるものです。
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にデータを送信しない原因を正確に特定するにはどうすればよいですか?
これは古い質問ですが、「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>
以下は、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);
}
}