Skip to content

Commit e196f9b

Browse files
author
Louis Opter
committed
Add an "inspect_error" middleware hook
This middleware will be called when an exception is raised server side. It receives the context of the call and the exception informations in parameters. For example, this can be used to integrate Sentry and ZeroRPC.
1 parent 44b7543 commit e196f9b

File tree

3 files changed

+56
-6
lines changed

3 files changed

+56
-6
lines changed

tests/test_middleware.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,3 +524,43 @@ def echo(self, msg):
524524
assert subscriber_tracer._log == [
525525
('load', publisher_tracer.trace_id),
526526
]
527+
528+
def test_inspect_error_middleware():
529+
530+
class InspectErrorMiddleware(Tracer):
531+
def __init__(self):
532+
self.called = False
533+
Tracer.__init__(self, identity='[server]')
534+
535+
def inspect_error(self, task_context, exc_info):
536+
assert 'trace_id' in task_context
537+
exc_type, exc_value, exc_traceback = exc_info
538+
self.called = True
539+
540+
class Srv(object):
541+
def echo(self, msg):
542+
raise RuntimeError(msg)
543+
544+
endpoint = random_ipc_endpoint()
545+
546+
middleware = InspectErrorMiddleware()
547+
ctx = zerorpc.Context()
548+
ctx.register_middleware(middleware)
549+
550+
module = Srv()
551+
server = zerorpc.Server(module, context=ctx)
552+
server.bind(endpoint)
553+
gevent.spawn(server.run)
554+
555+
client = zerorpc.Client()
556+
client.connect(endpoint)
557+
558+
try:
559+
client.echo('This is a test which should call the InspectErrorMiddleware')
560+
except zerorpc.exceptions.RemoteError as ex:
561+
assert ex.name == 'RuntimeError'
562+
563+
client.close()
564+
server.close()
565+
566+
assert middleware.called is True

zerorpc/context.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,13 @@ class Context(zmq.Context):
3535
def __init__(self):
3636
self._middlewares = []
3737
self._middlewares_hooks = {
38-
'resolve_endpoint': [],
39-
'raise_error': [],
40-
'call_procedure': [],
41-
'load_task_context': [],
42-
'get_task_context': [],
43-
}
38+
'resolve_endpoint': [],
39+
'raise_error': [],
40+
'call_procedure': [],
41+
'load_task_context': [],
42+
'get_task_context': [],
43+
'inspect_error': []
44+
}
4445

4546
@staticmethod
4647
def get_instance():
@@ -71,6 +72,12 @@ def middleware_resolve_endpoint(self, endpoint):
7172
endpoint = functor(endpoint)
7273
return endpoint
7374

75+
def middleware_inspect_error(self, exc_type, exc_value, exc_traceback):
76+
exc_info = exc_type, exc_value, exc_traceback
77+
task_context = self.middleware_get_task_context()
78+
for functor in self._middlewares_hooks['inspect_error']:
79+
functor(task_context, exc_info)
80+
7481
def middleware_raise_error(self, event):
7582
for functor in self._middlewares_hooks['raise_error']:
7683
functor(event)

zerorpc/core.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ def _print_traceback(self, protocol_v1):
113113
traceback.print_exception(exc_type, exc_value, exc_traceback,
114114
file=sys.stderr)
115115

116+
self._context.middleware_inspect_error(exc_type, exc_value,
117+
exc_traceback)
118+
116119
if protocol_v1:
117120
return (repr(exc_value),)
118121

0 commit comments

Comments
 (0)