如何检查连接到GRPC服务器的客户端

时间:2019-07-27 03:23:00

标签: python-3.x grpc grpc-python

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

我发现的最有希望的问题是question, which gives a starting point on how to do this in Java GRPC。但是,Python GRPC实现中不存在Java API。

到目前为止,我在context.peer()中使用grpc.ServicerContext方法跟踪唯一的对等项。如果对等端在一段时间内未发送请求(超时设置为2秒),则认为客户端已断开连接。

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

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

3 个答案:

答案 0 :(得分:1)

没有用于此的本机API,但是您拥有所需的所有内容。这是仓库中helloworld示例的修改版本。

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']

如丁先生上面所述,channelz也可能很适合您。

答案 1 :(得分:1)

我发现了更多有关channelz的文档和示例,其他人一直在建议它,而且看起来像您想要的。

这里是pull request that gives an example of channelz being used。它仅使用GetServer channelz API,因此您必须对其进行调整。

这是unit test that uses channelz, 测试可能与GetTopChannels API相关的API。

答案 2 :(得分:1)

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

<块引用>

grpcdebug 是一个命令行界面,专注于简化 gRPC 应用程序的调试过程。 grpcdebug 通过 gRPC 协议从应用程序中获取 gRPC 库的内部状态,并提供一个人性化的 UX 来浏览它们。目前,它支持 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.