def calculate_throughputs(taskname, timerange, interval=1): """ Calculates the throughputs for a given task for each interval over the given timerange. timerange = Range over which to calculate throughputs. Must be a tuple of two datetime.datetime or datetime.date objects. interval = How often (in seconds) to calculate throughputs. Returns a list of throughputs. Each throughput is calculated over the given interval. The throughputs collectively span the given time range. """ qargs = { 'state': 'SUCCESS', 'tstamp__range': timerange } if taskname: qargs['name'] = taskname states_in_range = DispatchedTask.objects.filter(**qargs) def rate_aggregator(seconds_span): def _rate_aggregator(seg): return seg.count() / seconds_span return _rate_aggregator interval_secs = datetime.timedelta(seconds=interval) segmentizer = Segmentizer(range_query_sequence('tstamp', timerange, interval_secs)) aggregator = rate_aggregator(float(interval)) segments = make_segments(states_in_range, segmentizer, aggregator) # segments contains tuple pairs: (label, value). We only want the value... return map(operator.itemgetter(1), segments)
def test_basic(self): from celerymanagementapp.segmentize import make_segments, Segmentizer from celerymanagementapp.segmentize import basic_query_sequence from celerymanagementapp.segmentize import avg_aggregator seq_fieldname = 'enumval' agg_fieldname = 'floatval' labels = ['A','B','C','D'] qs = TestModel.objects.all() segmentizer = Segmentizer( basic_query_sequence(seq_fieldname, labels) ) aggregator = avg_aggregator(agg_fieldname) segs = make_segments(qs, segmentizer, aggregator) self.assertEquals(len(segs), 4) self.assertEquals(segs[0], ('A',5.0)) self.assertEquals(segs[1], ('B',4.0)) self.assertEquals(segs[2], ('C',88.)) self.assertEquals(segs[3], ('D',None))
def test_daterange(self): from celerymanagementapp.segmentize import make_segments, Segmentizer from celerymanagementapp.segmentize import range_query_sequence from celerymanagementapp.segmentize import count_aggregator d = datetime.date seq_fieldname = 'date' range = (d(2010,1,1),d(2010,1,25)) interval_size = datetime.timedelta(days=5) qs = TestModel.objects.all() segmentizer = Segmentizer( range_query_sequence(seq_fieldname, range, interval_size) ) aggregator = count_aggregator() segs = make_segments(qs, segmentizer, aggregator) self.assertEquals(len(segs), 5) self.assertEquals(segs[0], (d(2010,1,3), 2)) self.assertEquals(segs[1], (d(2010,1,8), 0)) self.assertEquals(segs[2], (d(2010,1,13), 2)) self.assertEquals(segs[3], (d(2010,1,18), 1)) self.assertEquals(segs[4], (d(2010,1,23), 1))
def build_json_result(self, queryset): seg = self._build_segmentizer() agg = self._build_aggregator() data = segmentize.make_segments(queryset, seg, agg) return { 'data': data }