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())