def update_cq_stats(project_stats, minutes, begin, end): # pragma: no cover """Ensure CQStats are updated or created as necessary with new stats data.""" assert (end - begin).total_seconds() == 60 * minutes assert (begin - stats_start).total_seconds() % (60 * minutes) == 0, ( 'Interval must be aligned with %s.' % stats_start) for project, stats_list in project_stats.iteritems(): count_stats_dict = {} list_stats_dict = {} for stats in stats_list: if type(stats) == CountStats: count_stats_dict[stats.name] = stats else: assert type(stats) == ListStats list_stats_dict[stats.name] = stats cq_stats = CQStats.query().filter(CQStats.project == project, CQStats.interval_minutes == minutes, CQStats.begin == begin).get() if cq_stats: update_stats_list(cq_stats.count_stats, count_stats_dict) update_stats_list(cq_stats.list_stats, list_stats_dict) cq_stats.put() else: CQStats( project=project, interval_minutes=minutes, begin=begin, end=end, count_stats=count_stats_dict.values(), list_stats=list_stats_dict.values(), ).put() update_last_cq_stats_change_timestamp(minutes)
def test_missing_intervals_matched_cq_stats(self): CQStats(project='', interval_minutes=1440, begin=datetime(2000, 1, 2, 8), end=datetime(2000, 1, 3, 8)).put() self.assertEqual([ (datetime(2000, 1, 3, 8), datetime(2000, 1, 4, 8)), ], missing_intervals(1440, datetime(2000, 1, 4, 8)))
def test_missing_intervals_mismatched_cq_stats(self): CQStats(project='', interval_minutes=60, begin=datetime(2000, 1, 3, 7), end=datetime(2000, 1, 3, 8)).put() self.mock_now(datetime(2000, 1, 2, 0)) Record().put() self.assertEqual([ (datetime(2000, 1, 1, 8), datetime(2000, 1, 2, 8)), (datetime(2000, 1, 2, 8), datetime(2000, 1, 3, 8)), ], missing_intervals(1440, datetime(2000, 1, 4, 0)))
def _add_stats(project, days, begin, stats_list=None): # pragma: no cover minutes = days * minutes_per_day cq_stats = CQStats( project=project, interval_minutes=minutes, begin=datetime.utcfromtimestamp(begin), end=datetime.utcfromtimestamp(begin) + timedelta(minutes=minutes), ) if stats_list: cq_stats.count_stats = [ stats for stats in stats_list if type(stats) == CountStats] cq_stats.list_stats = [ stats for stats in stats_list if type(stats) == ListStats] cq_stats.put() return cq_stats
def _reset_stats(): # pragma: no cover for cq_stats in CQStats.query(): cq_stats.key.delete() assert CQStats.query().count() == 0 cq_stats = CQStats( project='test', interval_minutes=1, begin=datetime.utcfromtimestamp(0), end=datetime.utcfromtimestamp(1), count_stats=[ CountStats( name='test-count', description='Test count description', count=3, highest_100=[ [2, {'data_point': 'c'}], [1, {'data_point': 'b'}], [0, {'data_point': 'a'}], ], lowest_100=[ [0, {'data_point': 'a'}], [1, {'data_point': 'b'}], [2, {'data_point': 'c'}], ], ), ], list_stats=[ ListStats( name='test-list', description='Test list description', unit='test_unit', highest_100=[ [2, {'data_point': 'c'}], [1, {'data_point': 'b'}], [0, {'data_point': 'a'}], ], lowest_100=[ [0, {'data_point': 'a'}], [1, {'data_point': 'b'}], [2, {'data_point': 'c'}], ], ), ], ).put() return cq_stats.id()
def test_update_cq_stats_modify(self): _clear_cq_stats() CQStats( project='test-project', interval_minutes=60, begin=datetime(2000, 1, 1, 1), end=datetime(2000, 1, 1, 2), count_stats=[ CountStats(name='test-count', description='test-count-description', count=123), ], list_stats=[ ListStats(name='test-list', description='test-list-description', unit='test-unit'), ], ).put() self.assertEqual(1, CQStats.query().count()) update_cq_stats( { 'test-project': [ CountStats(name='test-count', description='test-count-description', count=456), ], }, 60, datetime(2000, 1, 1, 1), datetime(2000, 1, 1, 2)) self.assertEqual(1, CQStats.query().count()) cq_stats = CQStats.query().get() self.assertEqual('test-project', cq_stats.project) self.assertEqual(60, cq_stats.interval_minutes) self.assertEqual(datetime(2000, 1, 1, 1), cq_stats.begin) self.assertEqual(datetime(2000, 1, 1, 2), cq_stats.end) self.assertEqual([ CountStats(name='test-count', description='test-count-description', count=456), ], cq_stats.count_stats) self.assertEqual([ ListStats(name='test-list', description='test-list-description', unit='test-unit'), ], cq_stats.list_stats)