Application Insights及实时指标流内部原理与OAuth请求异常排查
我来帮你详细解答这两个问题,都是Application Insights使用中常见的关键点:
1. Application Insights(包含实时指标流)的内部工作机制
Application Insights的整体工作流程可以拆分为四个核心环节,实时指标流在其中有专门的优化:
- 数据收集层:通过对应语言的SDK(比如ASP.NET的
Microsoft.ApplicationInsights.Web包)嵌入到你的应用中,SDK内置了多个自动捕获模块——比如请求跟踪模块会监听ASP.NET管道的请求开始/结束事件,异常模块捕获未处理的异常,还有依赖项模块跟踪数据库、API调用等。实时指标流的收集逻辑更轻量化,会优先捕获实时的请求、错误、性能数据,并且默认采样率更高(甚至全量)。 - 数据传输层:常规遥测数据会先在本地缓存,达到批量阈值后通过HTTPS发送到Azure的Ingestion服务;而实时指标流采用WebSocket低延迟连接,数据几乎实时推送,不需要等待批量缓存,确保你能看到3-5秒内的最新应用状态。
- 数据处理与存储层:Azure收到数据后,会对常规遥测做清洗、聚合、索引,最终存储到Log Analytics工作区,支持长期保留和复杂查询;实时指标流的数据则是临时存储,仅用于实时仪表盘展示,不会长期归档,所以没法在分析工具或搜索里查到历史的实时指标数据。
- 展示层:Azure门户的Application Insights面板中,常规遥测用于趋势分析、历史故障回溯;实时指标流是专门的实时仪表盘,展示当前的请求率、错误率、响应时间,还有实时刷新的异常和请求详情。
2. OAuth2请求在实时指标流可见但分析/搜索中找不到的原因
结合你给出的OAuth2配置代码,这个问题主要和遥测捕获时机、过滤规则、采样策略这三个点有关:
- 遥测捕获时机不匹配:你的
HostAuthenticationFilter是在请求管道的早期执行的,如果OAuth验证失败,中间件可能直接返回了错误响应(比如401),而没有让请求到达Application Insights请求跟踪模块的完整捕获流程。实时指标流因为是更底层的监控(比如捕获HTTP层面的响应状态),所以能检测到这个错误,但常规请求遥测因为没走完完整的管道,所以没被记录。 - 默认遥测过滤规则拦截:Application Insights SDK默认会过滤掉一些“非业务请求”,比如健康检查端点、静态资源请求,部分版本的SDK也可能会默认排除
/oauth2/token这类认证端点。你可以检查TelemetryConfiguration中的TelemetryProcessor,看看是否有默认或自定义的过滤逻辑把这个URL的请求排除了。 - 采样策略差异:实时指标流和常规遥测的采样配置是分开的。实时指标流默认采用高采样率(甚至100%),而常规遥测可能因为全局采样率设置过低(比如默认的10%),导致这个请求没被采样到,自然不会出现在分析工具和搜索结果中。
对应的解决建议:
- 调整遥测过滤规则:添加自定义
ITelemetryProcessor,明确允许/oauth2/token的请求被记录,示例代码如下:
然后在public class AllowOAuthTokenRequestsProcessor : ITelemetryProcessor { private readonly ITelemetryProcessor _next; public AllowOAuthTokenRequestsProcessor(ITelemetryProcessor next) => _next = next; public void Process(ITelemetry item) { if (item is RequestTelemetry request && request.Url.AbsolutePath.Contains("/oauth2/token")) { _next.Process(item); return; } _next.Process(item); } }Startup.cs中注册这个处理器:TelemetryConfiguration.Active.TelemetryProcessorChainBuilder .Use((next) => new AllowOAuthTokenRequestsProcessor(next)) .Build(); - 调整采样配置:在
ApplicationInsights.config中把SamplingPercentage设置为100(或者针对请求URL设置自定义采样规则),确保这类请求能被采样到。 - 手动添加遥测:在OAuth中间件的错误处理逻辑中,手动调用
TelemetryClient来记录请求和异常,比如:var telemetryClient = new TelemetryClient(); telemetryClient.TrackRequest("/oauth2/token", DateTimeOffset.UtcNow, TimeSpan.Zero, "401", false);
内容的提问来源于stack exchange,提问作者Oleg Bezhan
相关产品推荐
相关产品推荐

