如何在 ASP.NET MVC 应用程序中跟踪实时指标的依赖项、异常和请求?

How to track dependencies, exceptions and requests for Live Metrics in ASP.NET MVC app?

我已经为我的 ASP.NET MVC 应用程序 配置了 Live Metrics target framework 4.7。 2 使用 Microsoft Docs 中给出的教程:

https://docs.microsoft.com/en-us/azure/azure-monitor/app/live-stream#enable-livemetrics-using-code-for-any-net-application

在本教程中,他们最后给出了 client.TrackDependency()client.TrackRequest() 调用示例。他们还在评论中提到,这些只是示例,我们必须将其替换为实际的应用程序逻辑才能正常工作。我对所有这些都是新手,我不知道要替换什么。由于我的应用程序很大并且有很多方法,因此在每个方法或控制器中调用跟踪方法是不切实际的。由于它不是 ASP.NET Core,因此没有中间件,我也必须通过代码启用 Live Metrics。我已将代码添加到我的应用程序 Global.asax.csApplication_Start() 中,以便它在启动期间运行。

这是我到目前为止所做的,

// Create a TelemetryConfiguration instance.
Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration telemetryConfig = Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.CreateDefault();
telemetryConfig.InstrumentationKey = System.Web.Configuration.WebConfigurationManager.AppSettings["AppInsightsInstrumentationKey"];
QuickPulseTelemetryProcessor quickPulseProcessor = null;
telemetryConfig.DefaultTelemetrySink.TelemetryProcessorChainBuilder
    .Use((next) =>
    {
        quickPulseProcessor = new QuickPulseTelemetryProcessor(next);
        return quickPulseProcessor;
    })
    .Build();

var quickPulseModule = new QuickPulseTelemetryModule();

// Secure the control channel.
// This is optional, but recommended.
//quickPulseModule.AuthenticationApiKey = "YOUR-API-KEY-HERE";
quickPulseModule.Initialize(telemetryConfig);
quickPulseModule.RegisterTelemetryProcessor(quickPulseProcessor);

// Create a TelemetryClient instance. It is important
// to use the same TelemetryConfiguration here as the one
// used to setup Live Metrics.
TelemetryClient client = new TelemetryClient(telemetryConfig);

// I need some method by which I can track all the requests, exceptions,
// dependencies etc. here. 

我搜索并搜索了很多解决方案,但找不到具体的解决方案。作为最后的手段,我请求你们帮助我。我该怎么做才能在全球范围内跟踪所有请求、依赖项、异常等...?

如果您将 ASP .NET MVC 与 .Net Framework 4.7.2 版本一起使用,您需要配置与 .NET 特定 SDK 类型(如框架、核心、控制台)相关的 Application Insights 代码等

从给定的MS doc, you're following the console app related app insights code but as you're using the MVC Web App so you need to follow this code from this section of documentation.

这是我尝试获取实时指标的解决方法,登录到 Azure 门户的 Application Insights。

  • 在 Visual Studio 中,创建了 asp .net mvc 网络应用程序(.NET Framework 版本 4.7.2)
  • ApplicationInsights.config
  • 中添加了 Application Insights Instrumentation 密钥
  • 按照上面的文档说明在根目录中创建一个新文件夹并添加 ErrorHandler class 并修改 FilterConfig class 来自 App_Start 文件夹以匹配您的 ErrorHandler Class 功能。
  • 然后部署 MVC Web 应用程序。发布时在 Visual Studio 中配置 Application Insights 发布 Window,如下所示:

部署应用程序后,在浏览器中打开 Web 应用程序 URL,然后您可以在概览选项卡和 App Insights 资源实时指标页面中看到日志,如下面的屏幕截图所示:

我自己找到了解决办法。我发现我可以使用 Application_BeginRequest() 事件处理程序来捕获 Global.asax 内部的所有请求。我所要做的就是将 TelemetryConfiguration 存储到全局变量中并从 Application_BeginRequest() 处理程序访问它。这就是我所做的:


using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse;
 
protected void Application_Start()
{
  RegisterLiveMetrics();
  // Omitted the other code for brevity
}

protected void Application_BeginRequest(object sender, EventArgs e)
{
  var telemetryConfig = Application["TelemetryConfig"] as TelemetryConfiguration;
  TelemetryClient client = new TelemetryClient(telemetryConfig);

  var httpContextCurrent = HttpContext.Current;
  client.TrackRequest(httpContextCurrent.Request.RawUrl, DateTimeOffset.Now, 
  TimeSpan.FromMilliseconds(230), httpContextCurrent.Response.StatusCode.ToString(), 
  true);
}

private void RegisterLiveMetrics()
{
  // Create a TelemetryConfiguration instance.
Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration telemetryConfig = Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.CreateDefault();
telemetryConfig.InstrumentationKey = System.Web.Configuration.WebConfigurationManager.AppSettings["AppInsightsInstrumentationKey"];
QuickPulseTelemetryProcessor quickPulseProcessor = null;
telemetryConfig.DefaultTelemetrySink.TelemetryProcessorChainBuilder
    .Use((next) =>
    {
        quickPulseProcessor = new QuickPulseTelemetryProcessor(next);
        return quickPulseProcessor;
    })
    .Build();

var quickPulseModule = new QuickPulseTelemetryModule();

quickPulseModule.Initialize(telemetryConfig);
quickPulseModule.RegisterTelemetryProcessor(quickPulseProcessor);

Application["TelemetryConfig"] = telemetryConfig;
}

幸运的是,这似乎工作正常。目前我只跟踪请求。

注意:我不确定上面提到的命名空间。