def setup_prometheus_multiproc(async_mode): """Setup prometheus_client multiprocess support. This involves setting up locking and a temporary directory if needed. Note: if we can't create the lock (e.g. inside a strictly confined snap package) then multiprocess cleanup is *not* enabled. """ global _lock, registry, try_prometheus_lock if not prometheus_installed: return if 'prometheus_multiproc_dir' not in os.environ: prefix = 'prometheus_multiproc_{}_'.format(os.getpid()) tmp = tempfile.mkdtemp(prefix=prefix) os.environ['prometheus_multiproc_dir'] = tmp # try enable multiprocess cleanup try: _lock = Lock() except OSError as exc: if exc.errno != errno.EACCES: raise early_log( __name__, 'warning', 'Unable to create lock for prometheus, cleanup disabled', ) else: if async_mode: try_prometheus_lock = try_prometheus_lock_patched_async else: try_prometheus_lock = try_prometheus_lock_normal # signal to others that clean up is enabled talisker.prometheus_multiproc_cleanup = True early_log(__name__, 'info', 'prometheus_client is in multiprocess mode', extra={ 'multiproc_dir': os.environ['prometheus_multiproc_dir'], 'cleanup_enabled': talisker.prometheus_multiproc_cleanup, })
if future.utils.PY3: import contextvars # enable asyncio aware contextvars in 3.5.3+/3.6 if pkg_is_installed('aiocontextvars'): import asyncio # aiocontextvars only supports python 3.5.3+ if hasattr(asyncio, '_get_running_loop'): import aiocontextvars # NOQA else: early_log( __name__, 'warning', 'aiocontextvars is installed, but it does not function with ' 'python {}. Please use python >= 3.5.3 if you wish to use ' 'talisker with asyncio.'.format( '.'.join(str(v) for v in sys.version_info[:3]) ) ) ContextId = contextvars.ContextVar('talisker') CONTEXT_OBJ = contextvars CONTEXT_ATTR = '_state' else: _NONE = object() class Python2ContextVar(): """Tiny python2 implementation of ContextVar, enough for our purposes. It is not immutable, and it does not support the reset(token) API. But