8

为了为我的 GRPC 服务器/客户端设置提供更好的调试信息,我试图找到一个 API grpc.server,以便我检查哪些客户端连接到服务器。

我发现的最有希望的问题是question,它为如何在 Java GRPC 中做到这一点提供了一个起点。但是,Python GRPC 实现中不存在 Java API。

到目前为止,我context.peer()使用grpc.ServicerContext. 如果对等点有一段时间没有发送请求(我设置为 2 秒的超时),我假设客户端已断开连接。

我已经开始查看 python-grpc 源代码,但我没有取得任何进展。

如果有人知道我可以使用的python中类似的API,那将不胜感激!即使是内部 API 也足以满足这些调试需求。

4

3 回答 3

2

我找到了更多有关 channelz 的文档和示例,其他人一直在建议它,这似乎是您想要的。

这是一个拉取请求,它给出了一个使用 channelz 的例子。它仅使用 GetServer channelz API,因此您必须对其进行调整。

这是一个使用 channelz 的单元测试,它测试可能与 GetTopChannels API 相关的 API。

于 2019-08-03T17:46:45.990 回答
1

没有用于此的本机 API,但您拥有所需的所有部分。helloworld这是来自 repo的示例的修改版本。

class PeerSet(object):
    def __init__(self):
        self._peers_lock = threading.RLock()
        self._peers = {}

    def connect(self, peer):
        print("Peer {} connecting".format(peer))
        with self._peers_lock:
            if peer not in self._peers:
                self._peers[peer] = 1
            else:
                self._peers[peer] += 1

    def disconnect(self, peer):
        print("Peer {} disconnecting".format(peer))
        with self._peers_lock:
            if peer not in self._peers:
                raise RuntimeError("Tried to disconnect peer '{}' but it was never connected.".format(peer))
            self._peers[peer] -= 1
            if self._peers[peer] == 0:
                del self._peers[peer]

    def peers(self):
        with self._peers_lock:
            return self._peers.keys()


class Greeter(helloworld_pb2_grpc.GreeterServicer):

    def __init__(self):
        self._peer_set = PeerSet()

    def _record_peer(self, context):
        def _unregister_peer():
            self._peer_set.disconnect(context.peer())
        context.add_callback(_unregister_peer)
        self._peer_set.connect(context.peer())

    def SayHello(self, request, context):
        self._record_peer(context)
        for i in range(10):
            print("[thread {}] Peers: {}".format(threading.currentThread().ident, self._peer_set.peers()))
            time.sleep(1)
        return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)

这将为您提供如下输出:

[thread 139905506195200] Peers: [u'ipv6:[::1]:57940', u'ipv6:[::1]:57930', u'ipv6:[::1]:57926', u'ipv6:[::1]:57920', u'ipv6:[::1]:57934']

正如 Ding 上面评论的那样,channelz可能也很适合你。

于 2019-08-01T21:54:26.190 回答
1

有一个工具grpcdebug,它可以检查连接到 GRPC 服务器的客户端。

grpcdebug 是一个命令行界面,专注于简化 gRPC 应用程序的调试过程。grpcdebug 通过 gRPC 协议从应用程序中获取 gRPC 库的内部状态,并提供人性化的用户体验来浏览它们。目前,它支持 Channelz/健康检查/CSDS(又名管理服务)

grpcdebug is an gRPC service admin CLI

Usage:
  grpcdebug <target address> [flags] <command>

Available Commands:
  channelz    Display gRPC states in human readable way.
  health      Check health status of the target service (default "").
  help        Help about any command
  xds         Fetch xDS related information.
于 2021-07-25T01:54:32.817 回答