You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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传输层过滤器实现,方案如下:

  1. 先定义会话统计所需的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();
  1. 实现自定义传输过滤器,监听连接生命周期事件更新指标
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();
    }
};
  1. 将过滤器注册到你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:06:02