在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的重叠情况:
- 取最近10条pageView的
operation_Id:
pageViews | take 10 | project timestamp, pageViewName = name, operation_Id, url
- 用上面的
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:
- 前端:在触发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 } });
- 后端:读取请求头里的
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(); });
- 查询关联:用自定义的
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
相关产品推荐
相关产品推荐

