- 概述
Envoy 提供了全面的 TCP 层面 metric 指标,覆盖了从监听器接收连接到 upstream 代理的整个过程。通过这些指标,我们可以深入了解 TCP 连接的建立、维护和关闭过程,识别网络问题和性能瓶颈。
核心优势:
-
全面的指标覆盖:从连接接受、处理到关闭的完整周期
-
精细的错误分类:按错误类型和来源分类的错误指标
-
实时监控能力:通过 Prometheus 等工具实现实时监控
-
故障定位支持:详细的错误和超时信息帮助快速定位问题
-
性能优化指导:流量控制和连接管理指标支持性能优化
最佳实践建议:
-
根据业务需求选择关键指标进行监控
-
建立基线,识别异常行为
-
配置告警规则,及时发现和响应问题
-
使用可视化工具,直观展示指标趋势
-
定期分析指标,优化系统配置
通过合理使用 Envoy TCP 指标,我们可以构建健壮的网络监控系统,提高应用程序的可靠性和性能,确保服务的稳定运行。
2. TCP 指标分类架构

- Listener 层级指标
3.1 监听器指标
bash
# 监听器指标(listener.<address>.*)listener.<address>.downstream_cx_total # 总连接数listener.<address>.downstream_cx_destroy # 总已销毁连接数listener.<address>.downstream_cx_active # 活跃连接数(Gauge)listener.<address>.downstream_cx_length_ms # 连接持续时间直方图(毫秒)listener.<address>.downstream_cx_transport_socket_connect_timeout # 传输套接字连接协商超时连接数listener.<address>.downstream_cx_overflow # 因监听器连接限制拒绝的连接数listener.<address>.downstream_cx_overload_reject # 因配置的过载操作拒绝的连接数listener.<address>.downstream_global_cx_overflow # 因全局连接限制拒绝的连接数listener.<address>.downstream_pre_cx_timeout # 在监听器过滤器处理期间超时的套接字数listener.<address>.downstream_pre_cx_active # 正在进行监听器过滤器处理的套接字数(Gauge)listener.<address>.extension_config_missing # 因监听器过滤器扩展配置缺失而关闭的连接数listener.<address>.global_cx_overflow # 因全局连接限制拒绝的连接数(与 downstream_global_cx_overflow 相同)listener.<address>.no_filter_chain_match # 未匹配任何过滤器链的连接数listener.<address>.downstream_listener_filter_remote_close # 监听器过滤器使用 peek 数据时远程关闭的连接数listener.<address>.downstream_listener_filter_error # 监听器过滤器使用 peek 数据时的读错误数
3.2 监听器 TLS 指标
bash
# TLS 相关指标(listener.<address>.ssl.*)listener.<address>.ssl.connection_error # TLS 连接错误数listener.<address>.ssl.handshake # TLS 握手次数listener.<address>.ssl.handshake_failure # TLS 握手失败次数listener.<address>.ssl.session_reused # TLS 会话复用次数listener.<address>.ssl.session_tickets_received # 收到的 TLS 会话票证数listener.<address>.ssl.session_tickets_issued # 颁发的 TLS 会话票证数
3.3 监听器 TCP 统计指标
bash
# TCP 统计指标(listener.<address>.tcp_stats.*)listener.<address>.tcp_stats.connection_error # TCP 连接错误数listener.<address>.tcp_stats.connection_reset # TCP 连接重置数listener.<address>.tcp_stats.connection_refused # TCP 连接拒绝数listener.<address>.tcp_stats.connection_timeout # TCP 连接超时数listener.<address>.tcp_stats.connection_close # TCP 连接关闭数
3.4 监听器 UDP 指标
bash
# UDP 监听器指标(listener.<address>.udp.*)listener.<address>.udp.downstream_rx_datagram_dropped # 因内核溢出或截断丢弃的数据报数
- TCP Proxy 层级指标
4.1 TCP 代理基本指标
bash
# TCP 代理指标(tcp.<stat_prefix>.*)tcp.<stat_prefix>.downstream_cx_total # 过滤器处理的连接总数tcp.<stat_prefix>.downstream_cx_no_route # 未找到匹配路由或路由集群不存在的连接数tcp.<stat_prefix>.downstream_cx_tx_bytes_total # 向下游连接写入的总字节数tcp.<stat_prefix>.downstream_cx_tx_bytes_buffered # 当前向下游连接缓冲的总字节数(Gauge)tcp.<stat_prefix>.downstream_cx_rx_bytes_total # 从下游连接读取的总字节数tcp.<stat_prefix>.downstream_cx_rx_bytes_buffered # 当前从下游连接缓冲的总字节数(Gauge)tcp.<stat_prefix>.downstream_flow_control_paused_reading_total # 流量控制暂停从下游读取的总次数tcp.<stat_prefix>.downstream_flow_control_resumed_reading_total # 流量控制恢复从下游读取的总次数tcp.<stat_prefix>.idle_timeout # 因空闲超时关闭的连接数tcp.<stat_prefix>.max_downstream_connection_duration # 因最大下游连接持续时间超时关闭的连接数
4.2 TCP 代理高级指标
bash
# TCP 代理高级指标(tcp.<stat_prefix>.*)tcp.<stat_prefix>.on_demand_cluster_attempt # 请求按需集群的连接总数tcp.<stat_prefix>.on_demand_cluster_missing # 因按需集群缺失而关闭的连接数tcp.<stat_prefix>.on_demand_cluster_success # 请求并接收按需集群的连接总数tcp.<stat_prefix>.on_demand_cluster_timeout # 因按需集群查找超时而关闭的连接数tcp.<stat_prefix>.upstream_flush_total # 下游连接关闭后继续刷新上游数据的连接总数tcp.<stat_prefix>.upstream_flush_active # 下游连接关闭后当前继续刷新上游数据的连接数(Gauge)
- Upstream 层级指标
5.1 上游连接指标
bash
# 上游连接指标(cluster.<name>.*)cluster.<name>.upstream_cx_total # 总上游连接数cluster.<name>.upstream_cx_active # 活跃上游连接数(Gauge)cluster.<name>.upstream_cx_connect_fail # 上游连接失败数cluster.<name>.upstream_cx_connect_timeout # 上游连接超时数cluster.<name>.upstream_cx_connect_ms # 上游连接建立时间直方图(毫秒)cluster.<name>.upstream_cx_length_ms # 上游连接持续时间直方图(毫秒)cluster.<name>.upstream_cx_destroy # 已销毁上游连接数cluster.<name>.upstream_cx_destroy_with_active_rq # 带有活跃请求的已销毁上游连接数cluster.<name>.upstream_cx_idle_timeout # 因空闲超时关闭的上游连接数cluster.<name>.upstream_cx_max_duration_reached # 达到最大连接持续时间的上游连接数cluster.<name>.upstream_cx_max_requests # 达到最大请求数的上游连接数
5.2 上游流量指标
bash
# 上游流量指标(cluster.<name>.*)cluster.<name>.upstream_cx_tx_bytes_total # 向上游发送的总字节数cluster.<name>.upstream_cx_rx_bytes_total # 从上游接收的总字节数
5.3 上游超时指标
bash
# 上游超时指标(cluster.<name>.*)cluster.<name>.upstream_rq_timeout # 上游请求超时数cluster.<name>.upstream_rq_per_try_timeout # 每次尝试的上游请求超时数
5.4 上游连接池指标
bash
# 上游连接池指标(cluster.<name>.*)cluster.<name>.upstream_cx_pool_overflow # 连接池溢出数(达到最大连接数)cluster.<name>.upstream_rq_pending_total # 待处理请求总数cluster.<name>.upstream_rq_pending_active # 活跃待处理请求数(Gauge)cluster.<name>.upstream_rq_pending_overflow # 待处理请求溢出数(达到最大待处理请求数)
- TCP 连接管理指标
6.1 流量控制指标
bash
# 流量控制指标tcp.<stat_prefix>.downstream_flow_control_paused_reading_total # 流量控制暂停从下游读取的总次数tcp.<stat_prefix>.downstream_flow_control_resumed_reading_total # 流量控制恢复从下游读取的总次数
cluster.<name>.upstream_flow_control_paused_reading_total # 流量控制暂停从上游读取的总次数cluster.<name>.upstream_flow_control_resumed_reading_total # 流量控制恢复从上游读取的总次数cluster.<name>.upstream_flow_control_backed_up_total # 上游连接备份数cluster.<name>.upstream_flow_control_drained_total # 上游连接排空数
6.2 连接超时指标
bash
# 连接超时指标tcp.<stat_prefix>.idle_timeout # 因空闲超时关闭的连接数tcp.<stat_prefix>.max_downstream_connection_duration # 因最大连接持续时间超时关闭的连接数
cluster.<name>.upstream_cx_idle_timeout # 因空闲超时关闭的上游连接数cluster.<name>.upstream_cx_max_duration_reached # 达到最大连接持续时间的上游连接数cluster.<name>.upstream_cx_connect_timeout # 上游连接超时数
6.3 错误处理指标
bash
# 错误处理指标listener.<address>.no_filter_chain_match # 未匹配任何过滤器链的连接数listener.<address>.downstream_cx_transport_socket_connect_timeout # 传输套接字连接协商超时连接数listener.<address>.downstream_cx_overflow # 因监听器连接限制拒绝的连接数listener.<address>.downstream_cx_overload_reject # 因配置的过载操作拒绝的连接数listener.<address>.downstream_global_cx_overflow # 因全局连接限制拒绝的连接数
tcp.<stat_prefix>.downstream_cx_no_route # 未找到匹配路由或路由集群不存在的连接数
cluster.<name>.upstream_cx_connect_fail # 上游连接失败数cluster.<name>.upstream_cx_connect_timeout # 上游连接超时数
- TLS 相关指标
7.1 监听器 TLS 指标
bash
# TLS 相关指标(listener.<address>.ssl.*)listener.<address>.ssl.connection_error # TLS 连接错误数listener.<address>.ssl.handshake # TLS 握手次数listener.<address>.ssl.handshake_failure # TLS 握手失败次数listener.<address>.ssl.session_reused # TLS 会话复用次数listener.<address>.ssl.session_tickets_received # 收到的 TLS 会话票证数listener.<address>.ssl.session_tickets_issued # 颁发的 TLS 会话票证数
7.2 上游 TLS 指标
bash
# 上游 TLS 指标(cluster.<name>.ssl.*)cluster.<name>.ssl.connection_error # TLS 连接错误数cluster.<name>.ssl.handshake # TLS 握手次数cluster.<name>.ssl.handshake_failure # TLS 握手失败次数cluster.<name>.ssl.session_reused # TLS 会话复用次数cluster.<name>.ssl.session_tickets_received # 收到的 TLS 会话票证数cluster.<name>.ssl.session_tickets_issued # 颁发的 TLS 会话票证数
- TCP 统计传输套接字指标
8.1 TCP 统计传输套接字指标
bash
# TCP 统计传输套接字指标(listener.<address>.tcp_stats.*)listener.<address>.tcp_stats.connection_error # TCP 连接错误数listener.<address>.tcp_stats.connection_reset # TCP 连接重置数listener.<address>.tcp_stats.connection_refused # TCP 连接拒绝数listener.<address>.tcp_stats.connection_timeout # TCP 连接超时数listener.<address>.tcp_stats.connection_close # TCP 连接关闭数
- 工作线程级指标
9.1 每个监听器处理程序的指标
xml
# 每个监听器处理程序的指标(listener.<address>.<handler>.*)listener.<address>.<handler>.downstream_cx_total # 该处理程序上的总连接数listener.<address>.<handler>.downstream_cx_active # 该处理程序上的活跃连接数(Gauge)
- 监听器管理器指标
10.1 监听器管理器指标
bash
# 监听器管理器指标(listener_manager.*)listener_manager.listener_added # 添加的监听器总数(静态配置或 LDS)listener_manager.listener_modified # 修改的监听器总数(通过 LDS)listener_manager.listener_removed # 删除的监听器总数(通过 LDS)listener_manager.listener_stopped # 停止的监听器总数listener_manager.listener_create_success # 成功添加到工作线程的监听器对象总数listener_manager.listener_create_failure # 监听器对象添加到工作线程失败的总数listener_manager.listener_in_place_updated # 创建以执行过滤器链更新路径的监听器对象总数listener_manager.total_filter_chains_draining # 当前正在排空的过滤器链数量(Gauge)listener_manager.total_listeners_warming # 当前正在预热的监听器数量(Gauge)listener_manager.total_listeners_active # 当前正在活动的监听器数量(Gauge)listener_manager.total_listeners_draining # 当前正在排空的监听器数量(Gauge)listener_manager.workers_started # 工作线程是否已启动(1 表示已启动,0 表示未启动)(Gauge)
- TCP 指标使用最佳实践
11.1 监控策略
bash
# 核心指标监控建议# 1. 连接层级监控- listener.<address>.downstream_cx_total # 总连接数- listener.<address>.downstream_cx_active # 活跃连接数- listener.<address>.downstream_cx_length_ms # 连接持续时间直方图- cluster.<name>.upstream_cx_total # 总上游连接数- cluster.<name>.upstream_cx_active # 活跃上游连接数
# 2. 流量层级监控- listener.<address>.downstream_cx_tx_bytes_total # 向下游发送的总字节数- listener.<address>.downstream_cx_rx_bytes_total # 从下游接收的总字节数- cluster.<name>.upstream_cx_tx_bytes_total # 向上游发送的总字节数- cluster.<name>.upstream_cx_rx_bytes_total # 从上游接收的总字节数
# 3. 错误和超时监控- listener.<address>.no_filter_chain_match # 未匹配任何过滤器链的连接数- listener.<address>.downstream_cx_transport_socket_connect_timeout # 传输套接字连接协商超时连接数- listener.<address>.downstream_cx_overflow # 因监听器连接限制拒绝的连接数- tcp.<stat_prefix>.downstream_cx_no_route # 未找到匹配路由或路由集群不存在的连接数- cluster.<name>.upstream_cx_connect_fail # 上游连接失败数- cluster.<name>.upstream_cx_connect_timeout # 上游连接超时数
# 4. 流量控制监控- tcp.<stat_prefix>.downstream_flow_control_paused_reading_total # 流量控制暂停从下游读取的总次数- tcp.<stat_prefix>.downstream_flow_control_resumed_reading_total # 流量控制恢复从下游读取的总次数
# 5. TLS 监控- listener.<address>.ssl.connection_error # TLS 连接错误数- listener.<address>.ssl.handshake # TLS 握手次数- listener.<address>.ssl.handshake_failure # TLS 握手失败次数- listener.<address>.ssl.session_reused # TLS 会话复用次数
11.2 告警配置示例
bash
# Prometheus 告警规则示例groups:- name: envoy_tcp_alerts rules: - alert: HighTCPConnectionErrorRate expr: sum(rate(listener_ssl_connection_error[5m])) / sum(rate(listener_ssl_handshake[5m])) > 0.1 for: 1m labels: severity: warning annotations: summary: "TLS 连接错误率过高" description: "TLS 连接错误率为 {{ $value }},高于 10%"
- alert: HighTCPConnectionFailureRate expr: sum(rate(cluster_upstream_cx_connect_fail[5m])) / sum(rate(cluster_upstream_cx_total[5m])) > 0.2 for: 1m labels: severity: critical annotations: summary: "上游连接失败率过高" description: "上游连接失败率为 {{ $value }},高于 20%"
- alert: HighTCPNoRouteRate expr: sum(rate(tcp_downstream_cx_no_route[5m])) / sum(rate(tcp_downstream_cx_total[5m])) > 0.05 for: 1m labels: severity: warning annotations: summary: "TCP 无路由率过高" description: "TCP 无路由率为 {{ $value }},高于 5%"
11.3 数据可视化
apache
# Grafana 仪表盘查询示例# 1. TCP 连接状态sum(listener_downstream_cx_active)sum(cluster_upstream_cx_active)
# 2. TCP 流量统计sum(rate(listener_downstream_cx_tx_bytes_total[1m]))sum(rate(listener_downstream_cx_rx_bytes_total[1m]))sum(rate(cluster_upstream_cx_tx_bytes_total[1m]))sum(rate(cluster_upstream_cx_rx_bytes_total[1m]))
# 3. TLS 连接统计sum(listener_ssl_session_reused)sum(listener_ssl_handshake_failure)
# 4. TCP 连接持续时间histogram_quantile(0.5, sum(rate(listener_downstream_cx_length_ms_bucket[1m])) by (le))histogram_quantile(0.9, sum(rate(listener_downstream_cx_length_ms_bucket[1m])) by (le))histogram_quantile(0.95, sum(rate(listener_downstream_cx_length_ms_bucket[1m])) by (le))
# 5. TCP 错误分布sum(rate(listener_downstream_cx_transport_socket_connect_timeout[1m]))sum(rate(listener_downstream_cx_overflow[1m]))sum(rate(tcp_downstream_cx_no_route[1m]))sum(rate(cluster_upstream_cx_connect_fail[1m]))
- TCP 指标高级分析
12.1 连接成功率分析
css
# 计算 TCP 连接成功率(1 - rate(listener_downstream_cx_transport_socket_connect_timeout[5m]) / rate(listener_downstream_cx_total[5m])) * 100(1 - rate(cluster_upstream_cx_connect_fail[5m]) / rate(cluster_upstream_cx_total[5m])) * 100
12.2 连接持续时间分析
apache
# 分析连接持续时间分布histogram_quantile(0.5, sum(rate(listener_downstream_cx_length_ms_bucket[5m])) by (le)) # 50 分位数histogram_quantile(0.9, sum(rate(listener_downstream_cx_length_ms_bucket[5m])) by (le)) # 90 分位数histogram_quantile(0.95, sum(rate(listener_downstream_cx_length_ms_bucket[5m])) by (le)) # 95 分位数
12.3 流量模式分析
bash
# 分析流量模式sum(rate(listener_downstream_cx_tx_bytes_total[1m])) # 发送速率sum(rate(listener_downstream_cx_rx_bytes_total[1m])) # 接收速率rate(listener_downstream_cx_total[1m]) # 连接建立速率rate(listener_downstream_cx_destroy[1m]) # 连接关闭速率
12.4 TLS 会话复用分析
apache
# 计算 TLS 会话复用率rate(listener_ssl_session_reused[5m]) / rate(listener_ssl_handshake[5m]) * 100