Envoy Upstream HTTP 过滤器统计前缀修正:RBAC 统计正确归属父级作用域

发布时间:2026/9/12 16:28:49
Envoy Upstream HTTP 过滤器统计前缀修正:RBAC 统计正确归属父级作用域
Envoy Upstream HTTP 过滤器统计前缀修正RBAC 统计正确归属父级作用域【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy本文深入解析 Envoy 上游upstreamHTTP 过滤器统计命名空间的一次行为变更自修复起upstream HTTP 过滤器典型如envoy.filters.http.upstream_rbac的统计计数不再散落在无前缀的全局命名空间而是正确归入父级统计前缀之下——对于路由过滤器形如http.stat_prefix.rbac.*对于集群过滤器形如cluster.name.rbac.*。该变更由运行时标志envoy.reloadable_features.upstream_http_filters_correct_stats_prefix控制默认启用读者可通过本文了解变更背景、源码实现机理、测试验证方式以及升级回滚方案。变更背景Upstream HTTP 过滤器与 RBAC 统计Envoy 的 RBAC基于角色的访问控制过滤器在经典使用场景下挂载于下行downstream过滤链对入站请求做鉴权。而在某些架构中需要把 RBAC 作为upstream HTTP 过滤器挂载到上游过滤链在onHostSelected()阶段对发往所选上游集群的请求执行鉴权此类过滤器通过Server::Configuration::UpstreamHttpFilterConfigFactory注册见 source/extensions/filters/http/upstream_rbac/config.cc 中的REGISTER_FACTORY静态注册注册名称为envoy.filters.http.upstream_rbac。RBAC 过滤器运行时会维护若干统计计数器包括allowed_与denied_等见 source/extensions/filters/http/rbac/rbac_filter.cc 中命中策略时对config_-stats().allowed_.inc()/denied_.inc()的调用。这些统计的最终命名由 source/extensions/filters/common/rbac/utility.cc 中的generateStats()决定函数通过Envoy::statPrefixJoin(prefix, rbac.)将传入的前缀与rbac.拼接再依次追加rules_stat_prefixpolicy.等最终形如prefixrbac.allowed、prefixrbac.denied。问题在于传入的前缀从何而来。在修复之前upstream HTTP 过滤器拿到的前缀与实际挂载位置不匹配导致统计要么缺少命名空间前缀难以区分来源要么出现前缀重复叠加如cluster.name.cluster.name.rbac.*给基于统计的监控、告警与配额带来困扰。变更核心统计前缀正确归属父级作用域本次行为变更记录于 changelogs/current/minor_behavior_changes/upstream_rbac__use_stats_prefix.rst的要点如下挂载位置修复后统计前缀统计示例路由器Router中的 upstream HTTP 过滤器http.stat_prefix.rbac.*http.ingress.rbac.allowed、http.ingress.rbac.denied集群Cluster中的 upstream HTTP 过滤器cluster.name.rbac.*cluster.cluster_0.rbac.allowed、cluster.cluster_0.rbac.denied其中stat_prefix是 HttpConnectionManager 配置中stat_prefix字段的值name是集群名称。统计不再出现无前缀或双重前缀的命名。变更由运行时标志统一开关见 source/common/runtime/runtime_features.cc 中的RUNTIME_GUARD(envoy_reloadable_features_upstream_http_filters_correct_stats_prefix)默认值为true即新行为默认生效设置为false时可回退到旧行为。源码级实现三处前缀决策点该修复的实现分布在三个关键位置共同决定了 upstream HTTP 过滤器统计前缀的传递链路1. 过滤器工厂消费stats_prefix在 source/extensions/filters/http/upstream_rbac/config.cc 中工厂通过Runtime::runtimeFeatureEnabled()判断标志标志启用时取extra_context.stats_prefix该字段携带父级命名空间来自路由器时为http.stat_prefix.来自集群时为cluster.name.作为 RBAC 统计前缀标志禁用时回退到空字符串旧行为RBAC 统计直接落在所在 scope 的根上等价于无前缀统计。随后该前缀被传入RoleBasedAccessControlFilterConfig供generateStats()拼装完整统计名。2. 路由器Router传递 HCM 的stat_prefix在 source/common/router/router.cc 中当路由配置含upstream_http_filters时路由器会构造 upstream 过滤器上下文标志启用时前缀取 HCM 的stat_prefix使统计落于http.stat_prefix.rbac.*标志禁用时取路由器自身 scope 的 prefix 字符串router scope 前缀为空还原旧的“无命名空间”行为。3. 集群Cluster作用域已就位前缀置空在 source/common/upstream/upstream_impl.cc 中集群场景的处理与路由器相反由于upstream_context_本身已经 scoped 到cluster.name.因此标志启用时传给上游过滤器的统计前缀为空字符串统计恰好落在cluster.name.rbac.*不重复前缀标志禁用时复刻旧的字符串化 scope 前缀保留旧统计名也因此保留了旧的双重前缀问题。三处实现配合RUNTIME_GUARD注册确保开关在 reloadable可热加载语义下工作运行时调整标志即可在两个行为间切换。测试验证单测与集成测试双保险仓库为本次变更提供了两层测试佐证单元测试test/extensions/filters/http/upstream_rbac/upstream_rbac_filter_test.cc分别模拟 Router 与 Cluster 两种上下文Router 上下文以http.ingress.为stats_prefix断言存在http.ingress.rbac.allowed与http.ingress.rbac.denied计数器Cluster 上下文以cluster.cluster_0.为stats_prefix断言存在cluster.cluster_0.rbac.allowed与cluster.cluster_0.rbac.denied并显式断言不存在cluster.cluster_0.cluster.cluster_0.rbac.allowed即不出现双重前缀。集成测试test/extensions/filters/http/upstream_rbac/upstream_rbac_integration_test.cc端到端配置了envoy.filters.http.upstream_rbac与上游 codec 过滤器在真实转发流程中等待cluster.cluster_0.rbac.denied计数为 1同时确认cluster.cluster_0.cluster.cluster_0.rbac.denied为空验证统计前缀的最终落点。升级注意事项与回滚由于该变更默认启用RUNTIME_GUARD而非FALSE_RUNTIME_GUARD升级后 RBAC 相关统计的完整名称会发生变化。对运维的影响集中体现在依赖精确统计名的监控告警、配额与成本归因规则需要同步迁移到新的http.stat_prefix.rbac.*/cluster.name.rbac.*命名若希望保留旧统计名以兼容存量面板可在运行时或启动配置中将envoy.reloadable_features.upstream_http_filters_correct_stats_prefix显式设为false回退到旧行为该标志属 reloadable 运行时特性可通过 Envoy 运行时层动态调整无需重启实例即可在两个行为间切换如先灰度观察新统计名再切换监控规则。总体而言这是一次以“统计命名正确性”为目标的小型行为变更不改变 RBAC 的鉴权语义仅修正统计归集路径但直接影响所有依赖rbac.allowed/rbac.denied等计数的监控体系升级前务必核对统计命名空间。【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考