fbnet/command_runner/global_namespace.py (19 lines of code) (raw):

#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (c) Facebook, Inc. and its affiliates. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. import contextvars from fbnet.command_runner.command_session import CapturedTimeMS class GlobalNamespace: """ This class is not meant to be instantiated. It is a namespace class with only class methods to store and share some info/options throughout the service. You can use this class for 1. Sharing server level context among different threads/coroutines (e.g., is the server running in prod mode or dev mode?) 2. Sharing thread/coroutine level context (e.g., request uuid, as each request will be handled by a separate thread/coroutine) along the function call chains in the same thread/coroutine. Usage: You can import it anywhere you need access to these info as from global_namespace import GlobalNamespace uuid = GlobalNamespace.get_request_uuid() """ # NOTE: contextvars is a module added in Python 3.7, which is compatible for # both async/non-async codes # https://docs.python.org/3/library/contextvars.html#module-contextvars # By using the ContextVar, we can share thread/coroutine level context (e.g., # request uuid, as each request will be handled by a separate thread) # along the function call chains in the same thread. For example, if we # have a function call chain like A->B->C->D->E. If we want to pass, # say, uuid from A to E, instead of add an additional argument for each # method, we can just store the data in thread local so everything along # the call chain can pick it up for free. _request_uuid = contextvars.ContextVar("request_uuid", default="N/A") # API related context variable # This metric captures the various communication/processing times that FCR spends for one API request, # such as external communication time (which includes establishing connection, waiting for device # to feed bytes to stream, etc) _api_captured_time_ms = contextvars.ContextVar( "api_captured_time_ms", default=CapturedTimeMS() ) @classmethod def set_request_uuid(cls, uuid: str) -> None: """Store uuid as thread local data""" cls._request_uuid.set(uuid) @classmethod def get_request_uuid(cls) -> str: return cls._request_uuid.get() @classmethod def set_api_captured_time_ms(cls, api_captured_time_ms: CapturedTimeMS) -> None: cls._api_captured_time_ms.set(api_captured_time_ms) @classmethod def get_api_captured_time_ms(cls) -> CapturedTimeMS: return cls._api_captured_time_ms.get()