'Create a metrics repository with a default config, given metric
reporters and the ability to expire eligible sensors
Arguments:
default_config (MetricConfig, optional): The default config
reporters (list of AbstractMetricsReporter, optional):
The metrics reporters
enable_expiration (bool, optional): true if the metrics instance
can garbage collect inactive sensors, false otherwise'

def __init__(self, default_config=None, reporters=None, enable_expiration=False):

    self._lock = threading.RLock()
    self._config = (default_config or MetricConfig())
    self._sensors = {}
    self._metrics = {}
    self._children_sensors = {}
    self._reporters = (reporters or [])
    for reporter in self._reporters:
        reporter.init([])
    if enable_expiration:
        def expire_loop():
            while True:
                time.sleep(30)
                self.ExpireSensorTask.run(self)
        metrics_scheduler = threading.Thread(target=expire_loop)
        metrics_scheduler.daemon = True
        metrics_scheduler.start()
    self.add_metric(self.metric_name('count', 'kafka-metrics-count', 'total    number    of    registered    metrics'), AnonMeasurable((lambda config, now: len(self._metrics))))
