OTel疑问:ASP.NET Core部署IIS后kestrel_queued_connections未导出
部署IIS后Kestrel指标消失的原因及解决办法
核心根源:IIS反向代理的运行模式
ASP.NET Core部署到IIS时,默认是IIS做反向代理——用户请求先到IIS,再转发给内部的Kestrel服务器。这时候Kestrel不直接对外监听端口,只监听本地回环地址,它的连接计数器(包括你需要的kestrel_queued_connections)统计的是IIS和Kestrel之间的内部连接,而非用户到IIS的真实连接。
常见具体原因
- 指标触发条件未满足:IIS和Kestrel之间的内部连接都是短连接,流量小的时候Kestrel的指标数值可能始终为0,被采集器过滤掉,导致/metrics页面看不到。
- 托管模式选错:如果用了IIS集成模式(InProcess),Kestrel根本没独立运行,是IIS直接处理请求,Kestrel的核心组件没初始化,自然出不来计数器。
- 部署时配置遗漏:上线时可能没在
Program.cs里明确启用Kestrel指标,或者IIS应用池权限不够,读不到Kestrel的性能计数器。
解决方法
- 确认托管模式:检查
web.config里的<aspNetCore>节点,确保hostingModel是OutOfProcess(进程外模式,ASP.NET Core默认)。 - 强制开启Kestrel指标采集:在
Program.cs里显式配置,保证采集器能捕获内部连接:
同时确保builder.Services.AddMetrics() .AddKestrelMetrics();app.UseMetricsEndpoint()的调用顺序正确,在中间件链的合适位置。 - 改用IIS自身计数器:如果要统计用户端的连接队列,直接用IIS自带的
Web Service性能计数器,比如Current Connections、Connection Attempts/sec,这些更能反映真实的外部请求情况。 - 调整应用池权限:给IIS应用池身份(比如
ApplicationPoolIdentity)添加读取性能计数器的权限,可通过本地安全策略配置。
内容的提问来源于stack exchange,提问作者leonardzheng
相关产品推荐
相关产品推荐

