ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Finagle Mux 协议指标(Metrics)完全指南:会话排空、帧传输、TLS 升级与握手延迟监控

Finagle Mux 协议指标(Metrics)完全指南:会话排空、帧传输、TLS 升级与握手延迟监控 后端RPC框架【免费下载链接】finagleA fault tolerant, protocol-agnostic RPC system项目地址https://gitcode.com/gh_mirrors/fi/finagle点击查看免费下载导读Mux 是 Finagle 自研的多路复用 RPC 协议为 ThriftMux、MySQL 等协议栈提供底层传输能力。本文以官方指标文档 doc/src/sphinx/metrics/Mux.rst 为骨架逐一解析 Mux 会话生命周期draining/leased/drained、帧与流控framer、传输失败、TLS 协商及握手延迟等全部指标的含义、前缀规则与源码实现位置帮助你准确读懂 Finagle 上报的mux/*监控数据并据此定位会话挂起、连接被异常终止、协议降级等线上问题。Mux 协议与指标前缀约定Mux 是一个面向多路复用会话multiplexed session的二进制协议客户端与服务端共享一套消息类型Tdispatch/Rdispatch、Treq/Rreq、Tping/Rping、Tdrain/Rdrain、Tlease 等并支持握手阶段协商帧大小、TLS 与压缩能力。协议主体实现在 finagle-mux/src/main/scala/com/twitter/finagle/Mux.scala会话层实现位于 finagle-mux/src/main/scala/com/twitter/finagle/mux/pushsession。理解以下指标前需要先掌握两类命名前缀server_label/mux/...与client_label/mux/...label由com.twitter.finagle.param.Label参数决定即客户端/服务端实例的名称。源码中 Mux.Client 通过params[Stats].statsReceiver.scope(mux)将指标限定在client_label/mux之下服务端同样以statsReceiver.scope(mux)组织见 Mux.Server 的defaultSessionFactory。无前缀的裸名称如clienthangup、serverhangup表示指标直接挂载在会话级默认统计路径下不经过mux命名空间。会话生命周期指标draining、drained 与 leasedMux 会话的调度状态机为Dispatching - Leasing - Draining - Drained见 MuxClientSession.scala相关指标精确对应这几次状态迁移指标类型含义server_label/mux/drainingcounter服务端发起会话排空session draining的次数server_label/mux/leasedcounterverbosity:debug服务端在会话处于非 draining/drained 状态下发出的租约lease次数client_label/mux/drainingcounter客户端观察到的服务端发起会话排空的次数client_label/mux/drainedcounter服务端发起的排空成功完成收到服务端确认并结束会话的次数源码印证客户端会话中三个计数器定义在 MuxClientSession.scalaprivate[this] val leaseCounter statsReceiver.counter(Verbosity.Debug, leased) private[this] val drainingCounter statsReceiver.counter(draining) private[this] val drainedCounter statsReceiver.counter(drained)当客户端收到服务端的Tdrain消息时MuxClientSession.scala会立即回写Rdrain应答、将状态置为Draining并递增draining计数器当所有未完成 dispatch 归零后pendingDispatches 0状态转为Drained并递增drained计数器MuxClientSession.scala。服务端侧在 MuxServerSession.scala 中于发起Tdrain(Tags.ControlTag)时递增自己的draining计数。leased计数只在Dispatching/Leasing状态下收到Tlease消息时递增MuxClientSession.scala与 Finagle 的 GC 回避GC Avoidance租约机制相关。监控建议若客户端mux/draining频繁增长而mux/drained不增长说明排空过程被卡住可能仍有未完成请求可结合 finagle-mux/src/main/scala/com/twitter/finagle/mux/lease/exp/ClockedDrainer.scala 中drain/undrain/forcedgcs/naturalgcs等租约管理指标交叉定位。消息处理正确性指标duplicate_tag 与 orphaned_tdiscard这两个指标反映服务端在处理多路复用标签tag时遇到的协议异常情况指标类型含义server_label/mux/duplicate_tagcounter服务端正在处理某个 tag 的请求时又收到了使用同一 tag 的新请求的次数server_label/mux/orphaned_tdiscardcounter服务端收到没有对应请求的Tdiscard消息次数典型场景是请求已被响应后才收到该 tag 的取消消息源码印证两者都定义在 ServerTracker.scala 中duplicate_tag在服务端发现 tag 已被占用时递增ServerTracker.scala随后会中断该 tag 上原有的 pending dispatchorphaned_tdiscard在服务端收到Tdiscard但找不到对应请求时递增ServerTracker.scala此时服务端无需回写Rdiscarded。源码注释特别说明这两个计数器是按需创建on-demand的——因为这类事件足够稀少不值得常驻一个计数器。监控建议正常情况下两者应接近 0若duplicate_tag持续增长通常意味着客户端与服务端的 tag 分配逻辑出现失配例如客户端重试或中断处理有误属于需要告警的协议层异常信号。请求上下文大小request_context_bytes指标类型含义server_label/mux/request_context_bytesstat每个请求所携带的 context广播上下文字节数源码印证定义于 ServerProcessor.scalaprivate[this] val contextBytesStat statsReceiver.stat(request_context_bytes)在dispatch处理Tdispatch消息时服务端对tdispatch.contexts的序列化大小累加到该 statServerProcessor.scala随后通过Contexts.broadcast.letUnmarshal还原广播上下文。监控建议该 stat 是直方图而非计数器关注其分布而非累计值。若 P99 显著偏高说明客户端携带了过大的广播 context如过长的 Dtab 或自定义 context 键值会直接推高每个请求的带宽与解码开销。连接挂断指标clienthangup 与 serverhangup指标类型含义clienthangupcounter客户端一侧突然终止abruptly terminated会话的次数serverhangupcounter服务端一侧突然终止会话的次数与draining的优雅排空不同hangup表示连接被非协议方式强行断开如 TCP 重置、超时关闭、进程崩溃。这两个指标不带mux/前缀直接位于会话统计路径下。监控建议两者中的任何一个出现非预期增长都说明对端在未走Tdrain流程的情况下断开了连接结合传输层指标下文的read/failures、write/failures可以进一步判断断连发生在握手阶段还是正常数据阶段。帧与流控指标mux/framer 系列启用 mux framing帧化/分片后以下指标用于观察传输层字节流量与流控状态指标类型含义label/mux/framer/write_stream_byteshistogrammux framing 启用时写入传输层的字节数label/mux/framer/read_stream_byteshistogrammux framing 启用时从传输层读取的字节数label/mux/framer/pending_write_streamsgauge未完成的写流outstanding write streams数量label/mux/framer/pending_read_streamsgauge未完成的读流outstanding read streams数量label/mux/framer/write_window_bytesgauge分片fragment的最大尺寸值为 -1 表示写入不分片源码印证前四个指标统一定义在 SharedNegotiationStats.scala 中其中字节直方图与 pending gauge 均以Verbosity.Debug级别注册意味着默认情况下不会上报到生产监控需开启 debug verbosity 才能观测val writeStreamBytes sr.stat(framerVerbosity, mux, framer, write_stream_bytes) val readStreamBytes sr.stat(framerVerbosity, mux, framer, read_stream_bytes) // ... sr.addGauge(framerVerbosity, mux, framer, pending_write_streams) { ... } sr.addGauge(framerVerbosity, mux, framer, pending_read_streams) { ... }write_window_bytes与握手阶段协商的MaxFrameSize参数直接相关。Mux.scala 中的MaxFrameSize参数允许配置单帧最大字节数超过该值的消息会被分片为多个片段传输其默认值为Int.MaxValue.bytes约 2 GiB因此默认情况下写入通常不分片write_window_bytes为 -1 恰好印证这一默认行为。帧大小在握手期间通过MuxFramer.Header键交换见 transport/MuxFramer.scala客户端与服务端分别在 Mux.Client.headers 与 Mux.Server.headers 中编码发送。监控建议pending_write_streams与pending_read_streams分别反映写方向与读方向的积压情况是判断 Mux 会话是否被流控卡住的直接依据两个字节直方图可用来核对客户端与服务端之间的实际传输吞吐是否与业务请求量匹配。传输层失败指标read/failures 与 write/failures指标类型含义label/mux/transport/read/failures/countermux 读路径上发生的任何异常包括握手异常、thrift 降级针对服务端等label/mux/transport/write/failures/countermux 写路径上发生的任何异常同样包括握手异常、thrift 降级等指标名的尾缀/表示该处为按异常类型区分的子树——Finagle 的 stats 体系会为不同类型的异常各建一个计数例如.../failures/org.apache.thrift.TApplicationException之类。监控建议当对端使用旧版或非 Mux 协议栈如纯 Thrift 直连时握手会失败并反映在这些计数中服务端侧还会发生 thrift 降级downgrade路径因此服务端这两个计数出现少量增长并不一定代表故障需要结合握手成功率见下一节综合判断。TLS 协商指标tls/upgrade/success 与 tls/upgrade/incompatible指标类型含义label/mux/tls/upgrade/successcounter客户端或服务端成功将连接升级为 TLS 的次数label/mux/tls/upgrade/incompatiblecounter客户端或服务端因 TLS 要求或能力不兼容而建立会话失败的次数源码印证两个计数定义于 SharedNegotiationStats.scala其中success以默认 verbosity 注册incompatible亦如此tlsVerbosity Verbosity.Default因此这两项在生产监控中默认可见val tlsSuccess sr.counter(tlsVerbosity, mux, tls, upgrade, success) val tlsFailures sr.counter(tlsVerbosity, mux, tls, upgrade, incompatible)Mux 支持机会式 TLSOpportunistic TLS客户端与服务端在握手阶段通过MuxOpportunisticTls.Header交换各自期望的 TLS 等级Off / Desired / Required协商成功后再动态在 Netty pipeline 中注入 SSL 处理器见 Mux.scala 的tlsEnable与 Mux.scala 的服务端对应实现。协商等级由com.twitter.finagle.param.OppTls参数控制OpportunisticTlsParams混入Client/Server以供配置。监控建议incompatible增长表示一方要求Required而另一方仅支持Off/Desired或 TLS 证书配置缺失——注意 Mux.Client.validateTlsParamConsistency 会在启用机会式 TLS 但缺少 SSL 配置时直接抛出IllegalStateException这类配置错误应在部署时被拦截而非等到运行时才暴露为incompatible计数。握手延迟指标handshake_latency_us指标类型含义label/mux/handshake_latency_ushistogramverbosity:debugMux 握手协商帧大小、TLS、压缩等的延迟源码印证定义于 MuxClientNegotiatingSession.scalaprivate[this] val muxHandshakeLatencyStat stats.stat(Verbosity.Debug, handshake_latency_us)该指标以微秒为单位统计从发起协商到会话就绪的耗时覆盖帧大小、机会式 TLS 等级与压缩偏好的交换过程。与framer系列一样注册为verbosity:debug默认不进入生产指标仅在调试会话建立性能时启用。verbosity:debug 指标的观测方式本文档中标记verbosity:debug的指标共有三个server_label/mux/leased、label/mux/framer/*系列字节直方图与 pending gauge以及label/mux/handshake_latency_us。在 Finagle 的 stats 体系中Verbosity.Debug表示该指标属于按需观测类别默认不会被生产 StatsReceiver 暴露可参考 finagle-core/src/main/scala/com/twitter/finagle/stats/JavaLoggerStatsReceiver.scala 中按 verbosity 区分日志级别的处理方式。排查会话建立缓慢、帧传输积压等问题时需要显式开启 debug verbosity 的采集通道才能看到这些数据。指标速查总表指标名类型verbosity统计内容server_label/mux/drainingcounter默认服务端发起会话排空的次数server_label/mux/leasedcounterdebug服务端在非排空状态下发出的租约次数client_label/mux/drainingcounter默认客户端观察到的服务端排空次数client_label/mux/drainedcounter默认服务端排空成功完成的次数server_label/mux/duplicate_tagcounter默认服务端收到重复 tag 请求的次数server_label/mux/orphaned_tdiscardcounter默认服务端收到无对应请求的 Tdiscard 次数server_label/mux/request_context_bytesstat默认每请求携带的 context 字节数clienthangupcounter默认客户端侧突然终止会话的次数serverhangupcounter默认服务端侧突然终止会话的次数label/mux/framer/write_stream_byteshistogramdebugframing 下写入传输层的字节数label/mux/framer/read_stream_byteshistogramdebugframing 下从传输层读取的字节数label/mux/framer/pending_write_streamsgaugedebug未完成写流数量label/mux/framer/pending_read_streamsgaugedebug未完成读流数量label/mux/framer/write_window_bytesgaugedebug分片最大尺寸-1 表示不分片label/mux/transport/read/failures/counter默认读路径异常含握手、thrift 降级label/mux/transport/write/failures/counter默认写路径异常含握手、thrift 降级label/mux/tls/upgrade/successcounter默认TLS 升级成功次数label/mux/tls/upgrade/incompatiblecounter默认TLS 协商不兼容失败次数label/mux/handshake_latency_ushistogramdebugMux 握手延迟微秒结语如何用这套指标定位线上问题将上述指标组合起来可以形成一套完整的 Mux 会话健康排查路径会话无法优雅关闭观察client_label/mux/draining与client_label/mux/drained的差值若排空请求频繁但完成数长期不增长说明有请求未结束、排空被阻塞连接被异常断开clienthangup/serverhangup增长时同步查看label/mux/transport/read/failures/与write/failures/下的异常类型区分握手失败与数据阶段异常协议失配或版本不兼容duplicate_tag非零增长表示 tag 管理失配tls/upgrade/incompatible增长表示 TLS 等级协商失败吞吐与积压开启 debug verbosity 后用framer系列的字节直方图与 pending gauge 判断读写方向是否存在积压用handshake_latency_us判断连接建立是否变慢。关于 ThriftMux基于 Mux 的 Thrift 多路复用实现的补充指标可继续参阅姊妹文档 ThriftMux 指标说明。赞分享后端RPC框架【免费下载链接】finagleA fault tolerant, protocol-agnostic RPC system项目地址https://gitcode.com/gh_mirrors/fi/finagle点击查看免费下载相关推荐KCP协议终极指南重塑视频监控低延迟传输的完全解析KCP协议终极指南重塑视频监控低延迟传输的完全解析 KCP协议是一种快速可靠的自动重传请求ARQ协议专为优化网络数据传输的速度和可靠性而设计。在视频监控网络通信如何零基础搭一套智能问数系统对话式查询数据库 5 分钟出图完整实操指南如何零基础搭一套智能问数系统对话式查询数据库 5 分钟出图完整实操指南 还在等数据组排期出报表用 SQLBot一句话就能把数据问出来。这套开源的智能问数系后端人工智能大模型RAGAI 应用数据可视化前端MCP 服务theMLbook动画插图制作从静态图表到动态可视化的完整流程theMLbook动画插图制作从静态图表到动态可视化的完整流程 theMLbook是一个专注于重现《百页机器学习书》中插图的Python开源项目通过动画可视上一篇DownKyi完整使用指南B站视频下载的终极解决方案下一篇哔哩下载姬完整指南3分钟掌握B站视频下载的终极技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表