使用java-grpc-prometheus获取gRPC服务指标及查询客户端会话数
gRPC指标采集及双向流客户端会话统计方案
基础指标适配(java-grpc-prometheus原生支持)
你提到的大部分指标无需额外开发,通过java-grpc-prometheus自带的拦截器即可采集,按需做标签聚合即可:
- 调用次数:直接取用
grpc_client_requests_total(客户端侧)/grpc_server_requests_total(服务端侧)Counter指标 - 调用耗时:取用
grpc_client_processing_duration_seconds/grpc_server_processing_duration_secondsHistogram指标,支持按接口、返回状态做分组统计 - 超时次数:对上述请求总指标,按
status=DEADLINE_EXCEEDED标签过滤聚合即可得到 - 接口重置次数:按
status=CANCELLED或status=UNAVAILABLE标签过滤聚合即可得到 - 内部API调用总次数:初始化拦截器时为内部API的调用添加自定义
api_type=internal标签,后续按标签过滤统计即可
双向流式API客户端会话总数量统计
java-grpc-prometheus默认不提供TCP会话级别的统计,需要通过自定义gRPC传输层过滤器实现,方案如下:
- 先定义会话统计所需的Prometheus指标,包括累计总发起会话数、当前活跃会话数两个维度
import io.grpc.netty.NettyChannelBuilder; import io.grpc.TransportFilter; import io.prometheus.client.Counter; import io.prometheus.client.Gauge; // 全局定义指标 private static final Counter GRPC_CLIENT_TOTAL_TCP_SESSIONS = Counter.build() .name("grpc_client_total_tcp_sessions") .help("累计发起的gRPC客户端TCP会话总数量") .register(); private static final Gauge GRPC_CLIENT_ACTIVE_TCP_SESSIONS = Gauge.build() .name("grpc_client_active_tcp_sessions") .help("当前存活的gRPC客户端TCP会话数量") .register();
- 实现自定义传输过滤器,监听连接生命周期事件更新指标
TransportFilter sessionCountFilter = new TransportFilter() { // 新TCP连接创建时触发 @Override public void transportCreated(ClientTransport transport) { GRPC_CLIENT_TOTAL_TCP_SESSIONS.inc(); GRPC_CLIENT_ACTIVE_TCP_SESSIONS.inc(); } // TCP连接销毁时触发 @Override public void transportTerminated(ClientTransport transport) { GRPC_CLIENT_ACTIVE_TCP_SESSIONS.dec(); } };
- 将过滤器注册到你的ManagedChannel构建流程中
ManagedChannel channel = NettyChannelBuilder.forAddress("你的服务地址", 端口) // 你现有的其他配置 .usePlaintext() // 注册会话统计过滤器 .addTransportFilter(sessionCountFilter) // 注册原生prometheus监控拦截器 .intercept(MonitoringClientInterceptor.create()) .build();
- 如果需要在服务端统计接入的客户端会话总数量,逻辑完全一致,将过滤器注册到
NettyServerBuilder中,监听ServerTransport的生命周期即可 - 双向流RPC复用TCP连接的场景不会重复触发
transportCreated事件,统计的会话数完全符合TCP级会话计数需求,不会和RPC调用次数混淆 - 直接取
grpc_client_total_tcp_sessions的指标值,即可得到历史到当前所有已发起的客户端会话总数量
内容的提问来源于stack exchange,提问作者wandermonk
相关产品推荐
相关产品推荐

