如何在使用OWIN的WebApi项目上启用Application Insights服务器遥测?

时间:2015-04-06 12:59:04

标签: c# asp.net-web-api owin azure-application-insights katana

我们遇到了一堆问题(读取很长的响应时间)以及生产中的几个项目,并希望确切了解服务器上发生了什么。然后,我按照this article继续向我们的所有项目添加Application Insights。问题是我们的两个WebAPI项目都没有将服务器数据发送到Azure门户,而所有其他项目(MVC 5)都是。

这是我在Azure上访问相应的Application Insights刀片时显示的内容:

enter image description here

我尝试在Azure VM中的Application Insights状态监视器中禁用并重新启用数据收集,在向API发出请求时重启IIS几次,但无济于事。当我在MVC项目上启用它时,当我在网站上打开页面时,我几乎可以立即在Azure门户上看到数据。

当我看到我们的Azure VM没有为这些特定项目发送数据时,我尝试在我们的开发环境中设置相同的集合,该环境托管在我们自己的基础架构中,并且完全相同的情况重复,统治这可能与Azure VM中托管的项目有关。

我不确定是什么阻止这些项目向Azure发送数据,但是通过查看工作项目与非工作项目,我认为它可能与我们的WebAPI项目使用的事实有某种关系新的OWIN管道,而MVC管道是标准的MVC项目。我检查了两个项目类型的web.config文件和bin文件夹,它们似乎被Insights Monitor正确修改(我可以看到添加到bin文件夹的相同新dll和添加到Web的相同http模块。配置)。

考虑到这一点,如何使用依赖于OWIN / Katana管道的WebAPI项目的Application Insights启用服务器端遥测?在这种情况下,我该怎么做才能找出究竟是什么导致项目不向Azure发送数据?

3 个答案:

答案 0 :(得分:18)

这是一个老问题,但在搜索“web api application insights owin”时仍然排在前3位。经过大量的搜索,而不是很多答案,不需要我们编写自己的中间件或明确地检测一切。我们遇到了一个扩展包,它使事情变得非常简单:

以下是Github Repository及相关的NuGet Package

对于那些懒得查看链接的人来说,需要添加的是:

<TelemetryInitializers>
    <!-- other initializers.. -->
    <Add Type="ApplicationInsights.OwinExtensions.OperationIdTelemetryInitializer, ApplicationInsights.OwinExtensions"/>
</TelemetryInitializers>

并将其添加到您的ApplicationInsights.Config

swap

答案 1 :(得分:10)

AI使用httpmodule收集有关开始请求的信息,并在结束请求时发送。正如所描述的那样here Owin / Katana使用middelware来在不同的阶段执行逻辑。由于大多数AI自动收集逻辑都是内部的,因此您无法在中间件中重复使用它。但您可以自己检测代码。 从您的代码创建TelemetryClient并开始发送请求,跟踪和异常(如所描述的here

答案 2 :(得分: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);

    }
}