from vcsserver.lib._vendor.statsd import client_from_config class StatsdClientNotInitialised(Exception): pass class _Singleton(type): """A metaclass that creates a Singleton base class when called.""" _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(_Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] class Singleton(_Singleton("SingletonMeta", (object,), {})): pass class StatsdClientClass(Singleton): setup_run = False statsd_client = None statsd = None strict_mode_init = False def __getattribute__(self, name): if name.startswith("statsd"): if self.setup_run: return super(StatsdClientClass, self).__getattribute__(name) else: if self.strict_mode_init: raise StatsdClientNotInitialised(f"requested key was {name}") return None return super(StatsdClientClass, self).__getattribute__(name) def setup(self, settings): """ Initialize the client """ strict_init_mode = settings.pop('statsd_strict_init', False) statsd = client_from_config(settings) self.statsd = statsd self.statsd_client = statsd self.setup_run = True StatsdClient = StatsdClientClass()