为了为我的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也足以满足这些调试需求。
答案 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.