1from __future__ import absolute_import
2
3from graphite.intervals import Interval, IntervalSet
4from graphite.readers.utils import merge_with_carbonlink, BaseReader
5
6try:
7    import ceres
8except ImportError:
9    ceres = False
10
11
12class CeresReader(BaseReader):
13    __slots__ = ('ceres_node', 'real_metric_path')
14    supported = bool(ceres)
15
16    def __init__(self, ceres_node, real_metric_path):
17        self.ceres_node = ceres_node
18        self.real_metric_path = real_metric_path
19
20    def get_intervals(self):
21        intervals = []
22        for info in self.ceres_node.slice_info:
23            (start, end, step) = info
24            intervals.append(Interval(start, end))
25
26        return IntervalSet(intervals)
27
28    def fetch(self, startTime, endTime):
29        data = self.ceres_node.read(startTime, endTime)
30        time_info = (data.startTime, data.endTime, data.timeStep)
31        values = list(data.values)
32
33        values = merge_with_carbonlink(
34            self.real_metric_path, data.startTime, data.timeStep, values)
35
36        return time_info, values
37