19

我们在生产中的几个项目中遇到了一堆问题(读取较长的响应时间),并且想看看服务器上到底发生了什么。然后,我按照这篇文章继续将 Application Insights 添加到我们所有的项目中。问题是我们的两个 WebAPI 项目都没有将服务器数据发送到 Azure 门户,而所有其他项目 (MVC 5) 都是。

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

在此处输入图像描述

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

当我看到这些特定项目的数据没有从我们的 Azure 虚拟机发送时,我尝试在我们自己的基础设施中托管的开发环境中设置相同的集合,并且完全相同的情况再次出现,排除了这种可能性这与托管在 Azure VM 中的项目有关。

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

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

4

3 回答 3

21

这是一个老问题,但它仍然在搜索“web api 应用程序洞察 owin”的前 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>
于 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 回答