如何在使用 OWIN 的 WebApi 项目上启用 Application Insights 服务器遥测?
How do I enable Application Insights server telemetry on WebApi project that uses OWIN?
我们在生产中的几个项目中遇到了很多问题(读取响应时间长),我们想确切地了解服务器上发生了什么。然后,我按照 this article 继续将 Application Insights 添加到我们所有的项目中。问题是我们的两个 WebAPI 项目都没有将服务器数据发送到 Azure 门户,而所有其他项目 (MVC 5) 都是。
这是我在 Azure 上访问相应的 Application Insights 边栏选项卡时显示的内容:
我尝试在我们的 Azure VM 的 Application Insights 状态监视器中禁用和重新启用数据收集,在向 API 发出请求时重新启动 IIS 几次,但无济于事。当我在 MVC 项目上启用它时,当我在站点上打开页面时,几乎可以立即在 Azure 门户上看到数据。
当我看到这些特定项目的数据没有从我们的 Azure VM 发送时,我尝试在我们自己的基础设施中托管的开发环境中设置相同的集合,但完全相同的情况又重复了一遍,排除了这与托管在 Azure VM 中的项目相关的可能性。
我不确定是什么阻止了这些项目将数据发送到 Azure,但是通过查看工作项目与非工作项目,我认为这可能与我们的 Web API 项目使用新的 OWIN 管道,而 MVC 项目是标准 MVC 项目。我检查了两种项目类型的 web.config 文件和 bin 文件夹,它们似乎被 Insights Monitor 正确修改了(我可以看到相同的新 dll 添加到 bin 文件夹,相同的 http 模块添加到web.config).
考虑到这一点,我如何使用 Application Insights for WebAPI 依赖 OWIN/Katana 管道的项目启用服务器端遥测?在这种情况下,我该怎么做才能找出导致项目不向 Azure 发送数据的确切原因?
AI 使用 httpmodule 在开始请求时收集信息并在结束请求时发送。如所述 here Owin/Katana 使用中间件在不同阶段执行逻辑。由于大多数 AI 自动收集逻辑是内部的,您不能在中间件中重用它。但是您可以自己检测代码。
从您的代码创建 TelemetryClient 并开始发送请求、跟踪和异常(如所述 here)
下面是我们为 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);
}
}
这是一个老问题,但它仍然在搜索 "web api application insights owin" 的前 3 个结果中。经过大量搜索并没有太多不需要我们编写自己的中间件或明确检测所有内容的答案。我们遇到了一个使事情变得超级简单的扩展包:
这是Github Repository for it and the associated NuGet Package
对于那些懒得看链接的人,需要添加的是:
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>
我们在生产中的几个项目中遇到了很多问题(读取响应时间长),我们想确切地了解服务器上发生了什么。然后,我按照 this article 继续将 Application Insights 添加到我们所有的项目中。问题是我们的两个 WebAPI 项目都没有将服务器数据发送到 Azure 门户,而所有其他项目 (MVC 5) 都是。
这是我在 Azure 上访问相应的 Application Insights 边栏选项卡时显示的内容:
我尝试在我们的 Azure VM 的 Application Insights 状态监视器中禁用和重新启用数据收集,在向 API 发出请求时重新启动 IIS 几次,但无济于事。当我在 MVC 项目上启用它时,当我在站点上打开页面时,几乎可以立即在 Azure 门户上看到数据。
当我看到这些特定项目的数据没有从我们的 Azure VM 发送时,我尝试在我们自己的基础设施中托管的开发环境中设置相同的集合,但完全相同的情况又重复了一遍,排除了这与托管在 Azure VM 中的项目相关的可能性。
我不确定是什么阻止了这些项目将数据发送到 Azure,但是通过查看工作项目与非工作项目,我认为这可能与我们的 Web API 项目使用新的 OWIN 管道,而 MVC 项目是标准 MVC 项目。我检查了两种项目类型的 web.config 文件和 bin 文件夹,它们似乎被 Insights Monitor 正确修改了(我可以看到相同的新 dll 添加到 bin 文件夹,相同的 http 模块添加到web.config).
考虑到这一点,我如何使用 Application Insights for WebAPI 依赖 OWIN/Katana 管道的项目启用服务器端遥测?在这种情况下,我该怎么做才能找出导致项目不向 Azure 发送数据的确切原因?
AI 使用 httpmodule 在开始请求时收集信息并在结束请求时发送。如所述 here Owin/Katana 使用中间件在不同阶段执行逻辑。由于大多数 AI 自动收集逻辑是内部的,您不能在中间件中重用它。但是您可以自己检测代码。 从您的代码创建 TelemetryClient 并开始发送请求、跟踪和异常(如所述 here)
下面是我们为 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);
}
}
这是一个老问题,但它仍然在搜索 "web api application insights owin" 的前 3 个结果中。经过大量搜索并没有太多不需要我们编写自己的中间件或明确检测所有内容的答案。我们遇到了一个使事情变得超级简单的扩展包:
这是Github Repository for it and the associated NuGet Package
对于那些懒得看链接的人,需要添加的是:
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>