### Description Fix https://github.com/grpc/grpc/issues/24470. Adding one example which demonstrate the following use cases: * Generate RPC ID on client side and propagate to server. * Context propagation from client to server. * Context propagation between different server interceptors and the server handler. ## Use: 1. Start server: `python3 -m async_greeter_server_with_interceptor` 2. Start client: `python3 -m async_greeter_client` ### Expected Logs: * On client side: ``` Sending request with rpc id: 73bb98beff10c2dd7b9f2252a1e2039e Greeter client received: Hello, you! ``` * On server side: ``` INFO:root:Starting server on [::]:50051 INFO:root:Interceptor1 called with rpc_id: default INFO:root:Interceptor2 called with rpc_id: Interceptor1-default INFO:root:Handle rpc with id Interceptor2-Interceptor1-73bb98beff10c2dd7b9f2252a1e2039e in server handler. ``` |
||
|---|---|---|
| .. | ||
| README.md | ||
| async_greeter_client.py | ||
| async_greeter_server_with_interceptor.py | ||
| helloworld_pb2.py | ||
| helloworld_pb2.pyi | ||
| helloworld_pb2_grpc.py | ||
README.md
gRPC Python Async Interceptor Example
This example demonstrate the usage of Async interceptors and context propagation using contextvars.
When to use contextvars
Contextvars can be used to propagate context in a same thread or coroutine, some example usage include:
- Propagate from interceptor to another interceptor.
- Propagate from interceptor to the server handler.
- Propagate from client to server.
How does this example works
This example have the following steps:
- Generate RPC ID on client side and propagate to server using
metadata.contextvarscan be used here if client and server is running in a same coroutine (or same thead for Sync).
- Server interceptor1 intercept the request, it checks
rpc_id_varand decorate it with it's tagInterceptor1. - Server interceptor2 intercept the request, it checks
rpc_id_varand decorate it with it's tagInterceptor2. - Server handler receives the request with
rpc_id_vardecorated by both interceptor1 and interceptor2.
How to run this example
- Start server:
python3 -m async_greeter_server_with_interceptor - Start client:
python3 -m async_greeter_client
Expected outcome
- On client side, you should see logs similar to:
Sending request with rpc id: 59ac966558b3d7d11a06bd45f1a0f89d
Greeter client received: Hello, you!
- On server side, you should see logs similar to:
INFO:root:Starting server on [::]:50051
INFO:root:Interceptor1 called with rpc_id: default
INFO:root:Interceptor2 called with rpc_id: Interceptor1-59ac966558b3d7d11a06bd45f1a0f89d
INFO:root:Handle rpc with id Interceptor2-Interceptor1-59ac966558b3d7d11a06bd45f1a0f89d in server handler.