def read(self):
        quantile_25 = self.params['quantile_25']
        quantile_75 = self.params['quantile_75']
        metrics = self.params['metrics']
        delay = self.params.get('offset', 0)
        maximum_delay = self.params.get('maximum_delay', 600)

        # read metrics from metric_sink
        quantile_25 = [i for i in self.metric_sink.iread(quantile_25)]
        quantile_75 = [i for i in self.metric_sink.iread(quantile_75)]
        metrics = [i for i in self.metric_sink.iread(metrics)]
        if not (len(quantile_25) * len(quantile_75) * len(metrics)):
            self.logger.error(
                'No data found for quantile/to be checked metrics. Exiting')
            return None

        # sort TimeSeriesTuples by timestamp
        quantile_25 = sorted(quantile_25, key=lambda tup: tup.timestamp)
        quantile_75 = sorted(quantile_75, key=lambda tup: tup.timestamp)
        metrics = sorted(metrics, key=lambda tup: (tup.name, tup.timestamp))

        # find closest datapoint to now() (corrected by delay) if not too old
        time_now = time() - delay
        quantile_25 = get_closest_datapoint(quantile_25, time_now)
        if time_now - quantile_25.timestamp > maximum_delay:
            self.logger.error('Quantile25 Value is too old (Timestamp: %d) of: %s. Exiting' % (
                quantile_25.timestamp, quantile_25.name))
            return None
        quantile_25 = quantile_25.value
        quantile_75 = get_closest_datapoint(quantile_75, time_now)
        if time_now - quantile_75.timestamp > maximum_delay:
            self.logger.error('Quantile75 Value is too old (Timestamp: %d) of: %s. Exiting' % (
                quantile_75.timestamp, quantile_75.name))
            return None
        quantile_75 = quantile_75.value
        if quantile_25 > quantile_75:
            self.logger.error('Inconsistent Quantile Values (Q25: %f, Q75: %f). Exiting' % (
                quantile_25, quantile_75))
            return None

        # group by metric (e.g. instance) first and find then closest datapoint
        distribution = {}
        grouped = itertools.groupby(metrics, key=lambda tup: tup.name)
        for key, metrics in grouped:
            closest_datapoint = get_closest_datapoint(
                [metric for metric in metrics], time_now)
            if time_now - closest_datapoint.timestamp < maximum_delay:
                distribution[key] = closest_datapoint.value
        if len(distribution) == 0:
            self.logger.error('No Distribution Values. Exiting')
            return None

        return quantile_25, quantile_75, distribution
dataset/ETHPy150Open trademob/anna-molly/lib/plugins/tukeys_filter.py/TukeysFilter.read/original