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