github.com/renbou/grpcbridge@v0.0.2-0.20240416012907-bcbd8b12648a/examples/pytestapi/scripts/server.py (about) 1 import asyncio 2 import logging 3 import os 4 import sys 5 6 import structlog 7 from grpclib.events import RecvRequest, SendTrailingMetadata, listen 8 from grpclib.reflection.service import ServerReflection 9 from grpclib.server import Server 10 from grpclib.utils import graceful_exit 11 from structlog.stdlib import BoundLogger 12 13 from pytestapi import IOTEventsService 14 15 logger: BoundLogger 16 17 18 async def recv_request(event: RecvRequest): 19 logger.info("started call", method=event.method_name, peer=event.peer.addr()) 20 21 22 async def send_trailing_metadata(event: SendTrailingMetadata): 23 logger.info( 24 "finished call", 25 status_code=event.status, 26 status_message=event.status_message, 27 ) 28 29 30 async def run(): 31 logging.basicConfig( 32 format="%(message)s", 33 stream=sys.stdout, 34 level=logging.INFO, 35 ) 36 37 structlog.configure( 38 processors=[ 39 structlog.stdlib.add_logger_name, 40 structlog.stdlib.add_log_level, 41 structlog.processors.TimeStamper(fmt="iso"), 42 structlog.processors.StackInfoRenderer(), 43 structlog.processors.EventRenamer("msg"), 44 structlog.processors.JSONRenderer(), 45 ], 46 wrapper_class=structlog.stdlib.BoundLogger, 47 logger_factory=structlog.stdlib.LoggerFactory(), 48 ) 49 50 global logger 51 logger = structlog.stdlib.get_logger("pytestapi-server").bind(app="pytestapi") 52 53 listen_addr = ":50052" 54 if os.getenv("LISTEN_ADDR") is not None: 55 listen_addr = os.getenv("LISTEN_ADDR") 56 57 host, port = listen_addr.split(":") 58 host = host or None 59 port = port or None 60 61 services = [IOTEventsService()] 62 services = ServerReflection.extend(services) 63 64 server = Server(services) 65 listen(server, RecvRequest, recv_request) 66 listen(server, SendTrailingMetadata, send_trailing_metadata) 67 68 with graceful_exit([server]): 69 await server.start(host=host, port=port) 70 logger.info("serving test gRPC", listen_addr=listen_addr) 71 await server.wait_closed() 72 73 74 def main(): 75 asyncio.run(run())