You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Application Insights日志分析中如何关联pageViews与后端requests?

关联AppInsights的pageViews与requests:解决方案与排查步骤

首先直接给你结论:正常情况下是有开箱即用的关联键(operation_Id)的,你遇到的关联失败大概率是配置或请求头传递的问题,而非没有OOTB外键。下面一步步帮你排查和解决:

一、为什么默认的operation_Id关联失败?

AppInsights的浏览器SDK和后端SDK本来就设计了自动关联逻辑:前端发起请求时,会自动在请求头里带上Request-Id和Request-Context,后端SDK读取这些头后,会继承前端的operation_Id,让前后端同一用户会话的请求共享同一个operation_Id。

你关联失败可能是这几个原因:

  • 前端SDK没自动注入关联头:检查浏览器SDK配置,确保enableAutoRouteTracking设为true(默认是开启的),同时correlationIdHeaderExcludedDomains里没有包含你的后端域名(如果把后端域名加进去,SDK就不会给这个域名的请求加关联头)。
  • 后端没正确读取关联头:比如ASP.NET Core项目,要确保AppInsights中间件在请求管道里的位置正确(得放在路由中间件之前),或者后端框架没有拦截/丢弃这些请求头。
  • 前端请求不是SDK自动追踪的:比如你用了自定义的fetch/axios封装,没有手动传递SDK生成的关联头,这种情况也会导致前后端operation_Id不一致。

二、先做个快速排查

先跑两个查询确认operation_Id的重叠情况:

  1. 取最近10条pageView的operation_Id:
pageViews
| take 10
| project timestamp, pageViewName = name, operation_Id, url
  1. 用上面的operation_Id去查对应的requests:
requests
| where operation_Id in (pageViews | take 10 | project operation_Id)
| project timestamp, requestName = name, operation_Id, cloudRoleInstance

如果第二个查询返回空,那说明确实没有建立自动关联,需要调整配置或手动实现关联。

三、修复自动关联(优先推荐)

前端侧配置检查

如果用的是最新的@microsoft/applicationinsights-web SDK,确保初始化时没有禁用关联:

const appInsights = new ApplicationInsights({
  config: {
    instrumentationKey: "YOUR_KEY",
    enableAutoRouteTracking: true, // 必须开启,默认是true
    correlationIdHeaderExcludedDomains: [] // 不要把后端域名放这里
  }
});
appInsights.loadAppInsights();

如果是用axios这类自定义请求库,需要手动传递关联头:

// 获取SDK生成的关联头
const correlationHeaders = appInsights.context.contextKeys;
axios.get("/api/your-endpoint", {
  headers: {
    "Request-Id": correlationHeaders.requestId,
    "Request-Context": `appId=${appInsights.config.instrumentationKey}`
  }
});

后端侧配置检查

以ASP.NET Core为例,确保Program.cs里正确注册了AppInsights中间件:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddApplicationInsightsTelemetry(); // 注册服务
var app = builder.Build();
app.UseApplicationInsightsRequestTelemetry(); // 必须在路由中间件之前
app.UseRouting();
// ...其他中间件

四、手动实现关联(如果自动关联不可行)

如果因为某些架构限制没法用自动关联,那可以手动生成一个关联ID:

  1. 前端:在触发pageView时,生成一个唯一ID,存入pageView的customDimensions,同时在请求时把这个ID传到后端:
const customCorrelationId = uuid.v4(); // 用uuid库生成唯一ID
// 手动追踪pageView并带上自定义ID
appInsights.trackPageView({
  name: "Home Page",
  customDimensions: { customCorrelationId: customCorrelationId }
});
// 请求后端时带上这个ID
axios.get("/api/your-endpoint", {
  headers: { "X-Custom-Correlation-Id": customCorrelationId }
});
  1. 后端:读取请求头里的X-Custom-Correlation-Id,存入request的customDimensions:
// ASP.NET Core示例,用中间件添加自定义维度
app.Use(async (context, next) => {
  var customCorrelationId = context.Request.Headers["X-Custom-Correlation-Id"].FirstOrDefault();
  if (!string.IsNullOrEmpty(customCorrelationId))
  {
    var telemetry = context.Features.Get<RequestTelemetry>();
    telemetry?.Properties.Add("customCorrelationId", customCorrelationId);
  }
  await next();
});
  1. 查询关联:用自定义的customCorrelationId来join:
pageViews
| extend customCorrelationId = customDimensions.customCorrelationId
| join kind=inner (
  requests
  | extend customCorrelationId = customDimensions.customCorrelationId
) on customCorrelationId
| summarize avg(duration) by cloudRoleInstance, pageViewName = name

五、针对你的需求:按cloudRoleInstance统计pageView时长

如果自动关联修复成功,直接用operation_Id关联的查询就可以:

pageViews
| join kind=inner (requests) on operation_Id
| summarize avg(duration) by cloudRoleInstance, pageViewName = name

如果是多个requests对应一个pageView,你可能需要用kind=leftouter并做去重处理,比如取每个pageView对应的第一个request的cloudRoleInstance:

pageViews
| join kind=leftouter (
  requests
  | summarize arg_min(timestamp, cloudRoleInstance) by operation_Id
) on operation_Id
| where cloudRoleInstance != ""
| summarize avg(duration) by cloudRoleInstance, pageViewName = name

内容的提问来源于stack exchange,提问作者Devin Gleason Lambert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:27:17