class MetricCollection(UserList):
    """
    MetricCollection aggregates all metrics from config by uve_type.

    For each uve_type a MetricTypeCollection class is created.
    """
    def __init__(self, auth=None):
        super().__init__()
        self.scrapers = Group()
        self.scrape_pool = Pool(size=Config().scraper.pool_size)
        self.session = Session(auth=auth)
        self.session.mount(
            "http://",
            HTTPAdapter(
                max_retries=Retry(
                    total=Config().scraper.max_retry,
                    connect=Config().scraper.max_retry,
                    read=Config().scraper.max_retry,
                    backoff_factor=0.3,
                ),
                pool_connections=10,
            ),
        )
        metric_types = {}
        for metric_config in Config().metrics:
            if metric_config.uve_type not in metric_types:
                metric_types[metric_config.uve_type] = []
            metric_types[metric_config.uve_type].append(metric_config)
        for uve_type, metric_configs in metric_types.items():
            self.append(
                MetricTypeCollection(
                    self.session,
                    uve_type,
                    metric_configs,
                    self.scrapers,
                    self.scrape_pool,
                ))

    def scrape(self):
        for instance in self:
            instance.scrape()
        try:
            self.scrapers.join()
        except KeyboardInterrupt:
            self.scrape_pool.kill(StopScrape)
            self.scrapers.kill(StopScrape)
        return