【问题标题】:How to debug grpc call?如何调试grpc调用?
【发布时间】:2016-09-04 16:34:40
【问题描述】:

我试图弄清楚为什么我的grpc 调用不起作用,但我不知道如何打开调试,所以我可以看到通过 grpc 连接发送和接收的数据。

如何为 grpc 调用开启调试功能?

【问题讨论】:

    标签: grpc


    【解决方案1】:

    还有一个工具grpcdebug

    grpcdebug 是一个命令行界面,专注于简化 gRPC 应用程序的调试过程。 grpcdebug 通过 gRPC 协议从应用程序中获取 gRPC 库的内部状态,并提供人性化的用户体验来浏览它们。目前,它支持 Channelz/健康检查/CSDS(又名管理服务)。换句话说,它可以获取有关给定 gRPC 通道上已发送或失败的 RPC 数量的统计信息,它可以检查地址解析结果,它可以转储指导 RPC 路由的无效 xDS 配置。

    这里有一些示例

    • 用法 1:原始 Channelz 输出

    对于所有 Channelz 命令,您可以添加 --json 以获取原始 Channelz 输出。

    grpcdebug localhost:50051 channelz channels --json
    grpcdebug localhost:50051 channelz servers --json
    
    • 用法 2:列出客户渠道

    grpcdebug localhost:50051 channelz 频道

    # Channel ID   Target            State     Calls(Started/Succeeded/Failed)   Created Time
    # 7            localhost:10001   READY     5136/4631/505                     8 minutes ago
    
    • 用法 3:列出服务器

    grpcdebug localhost:50051 channelz 服务器

    # Server ID   Listen Addresses   Calls(Started/Succeeded/Failed)   Last Call Started
    # 1           [:::10001]         2852/2530/322                     now
    # 2           [:::50051]         29/28/0                           now
    # 3           [:::50052]         4/4/0                             26 seconds ago
    

    【讨论】:

      【解决方案2】:

      您可以使用Mediator 工具来调试和跟踪 gRPC 调用。

      charles一样是一个GUI工具,但是如果你需要解析protobuf 消息体,gRPC服务器需要支持Server Reflection

      【讨论】:

        【解决方案3】:

        来自docs

        GRPC_VERBOSITY用于设置gRPC打印的日志消息的最低级别(支持的值为DEBUGINFOERROR)。如果未设置此环境变量,则只会打印ERROR 日志。

        另外,请检查GRPC_TRACE

        有15+ grpc环境variables

        Windows 用户须知,引自docs

        已知限制:GPRC_TRACE=tcp 目前未针对 Windows 实现(您不会看到任何 TCP 跟踪)。

        【讨论】:

        • 试过了,这对于“打印请求/响应消息”是没用的。我没有找到任何有用的输出。我认为这些标志仅适用于 GRPC C 库的开发人员。
        • @juwens 我怀疑这些标志仅适用于 grpc c 库的开发人员,因为 OP 的回答有很多赞成票,这表明至少有一些标志对其他人有用。
        【解决方案4】:

        导出 GRPC_GO_LOG_VERBOSITY_LEVEL=99
        导出 GRPC_GO_LOG_SEVERITY_LEVEL=info

        用最新的 grpc go 版本试试这个。

        【讨论】:

          【解决方案5】:

          在 Golang 中,您需要设置 GODEBUG environment variable 以查看 HTTP2 跟踪,即 gRPC 设置的标头:

          GODEBUG=http2debug=1   # enable verbose HTTP/2 debug logs
          GODEBUG=http2debug=2   # ... even more verbose, with frame dumps
          

          然后输出将被发送到标准输出。这是一个例子:

          {"level":"info","msg":"2017/06/11 08:52:20 http2: Framer 0xc42009c0e0: wrote SETTINGS len=0","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: Framer 0xc42009c0e0: wrote WINDOW_UPDATE len=4 (conn) incr=983025","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: Framer 0xc42009c0e0: read SETTINGS len=18, settings: ENABLE_PUSH=0, MAX_CONCURRENT_STREAMS=0, INITIAL_WINDOW_SIZE=1048576","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: Framer 0xc42009c0e0: read WINDOW_UPDATE len=4 (conn) incr=983041","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: Framer 0xc42009c0e0: wrote SETTINGS flags=ACK len=0","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: Framer 0xc42009c0e0: read SETTINGS flags=ACK len=0","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: Framer 0xc42009c0e0: read HEADERS flags=END_HEADERS|PRIORITY stream=3 len=249","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: decoded hpack field header field \":authority\" = \"\"","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: decoded hpack field header field \":path\" = \"/internal.push.v1.UnifiedDevicePush/SendMessage\"","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: decoded hpack field header field \":method\" = \"POST\"","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: decoded hpack field header field \":scheme\" = \"http\"","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: decoded hpack field header field \"content-type\" = \"application/grpc\"","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: decoded hpack field header field \"te\" = \"trailers\"","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: decoded hpack field header field \"user-agent\" = \"grpc-java-netty/1.0.3\"","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: decoded hpack field header field \"root-common.xirequestid-bin\" = \"ChIJzE6lBfCTCsYRoIIJujc92JY=\"","time":"2017-06-11T08:52:20Z"}
          {"level":"info","msg":"2017/06/11 08:52:20 http2: decoded hpack field header field \"te\" = \"trailers\"","time":"2017-06-11T08:52:20Z"}
          

          【讨论】:

          • @Dominik - 感谢您的编辑。当我写这个答案时,我一定很兴奋:/
          【解决方案6】:

          您可以将 GRPC_TRACE 环境变量设置为 all 以让 grpc 转储有关连接正在做什么的一大堆数据:

          export GRPC_TRACE=all
          

          从评论编辑:显然你还需要设置:

          export GRPC_VERBOSITY=DEBUG
          

          【讨论】:

          • 我试过了,在控制台中没有看到任何东西。您是否在应用程序中执行了其他操作来获取输出?
          • 看起来只有“基于 C 核心的实现”支持这些环境变量(例如 Go 不是其中之一)。对于 grpc-go,请参阅EnableGRPCTracinggodoc.org/cloud.google.com/go/trace#pkg-variables
          • 看来我们也可以设置:export GRPC_TRACE=list_tracers 看这里:github.com/grpc/grpc/blob/master/src/core/lib/debug/…
          • 在 python 3.5、Ubuntu 18.04 中仍然对我不起作用 - 我看不到任何输出:(
          猜你喜欢
          • 2017-04-10
          • 2018-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-25
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          相关资源
          最近更新 更多