1 import time
2 import json
3
4 from collections import defaultdict
5
6 from sqlalchemy.orm.exc import NoResultFound
7
8 from coprs import app
9 from coprs import db
10 from coprs.models import CounterStat
11 from coprs import helpers
12 from coprs.helpers import REPO_DL_STAT_FMT, CHROOT_REPO_MD_DL_STAT_FMT, \
13 CHROOT_RPMS_DL_STAT_FMT, PROJECT_RPMS_DL_STAT_FMT, is_ip_from_builder_net
14 from coprs.helpers import CounterStatType
15 from coprs.rmodels import TimedStatEvents
19
20 @classmethod
27
28 @classmethod
35
36 @classmethod
37 - def add(cls, name, counter_type):
41
42 @classmethod
43 - def incr(cls, name, counter_type):
56
57 @classmethod
79
82 """
83 :param rc: connection to redis
84 :type rc: StrictRedis
85
86 :param stat_data: stats from backend
87 :type stat_data: dict
88 """
89 app.logger.debug('Got stat data: {}'.format(stat_data))
90
91 ts_from = int(stat_data['ts_from'])
92 ts_to = int(stat_data['ts_to'])
93 hits = stat_data['hits']
94
95 if not ts_from or not ts_to or ts_from > ts_to or not hits:
96 raise Exception("Invalid or empty data received.")
97
98 ts_from_stored = int(rc.get('handle_be_stat_message_ts_from') or 0)
99 ts_to_stored = int(rc.get('handle_be_stat_message_ts_to') or 0)
100
101 app.logger.debug('ts_from: {}'.format(ts_from))
102 app.logger.debug('ts_to: {}'.format(ts_to))
103 app.logger.debug('ts_from_stored: {}'.format(ts_from_stored))
104 app.logger.debug('ts_to_stored: {}'.format(ts_to_stored))
105
106 if (ts_from < ts_to_stored and ts_to > ts_from_stored):
107 app.logger.debug('Time overlap with already stored data. Skipping.')
108 return
109
110 hits_formatted = defaultdict(int)
111 for key_str, count in hits.items():
112 key = key_str.split('|')
113 if key[0] == 'chroot_repo_metadata_dl_stat':
114 redis_key = CHROOT_REPO_MD_DL_STAT_FMT.format(
115 copr_user=key[1],
116 copr_project_name=key[2],
117 copr_chroot=key[3])
118 elif key[0] == 'chroot_rpms_dl_stat':
119 redis_key = CHROOT_RPMS_DL_STAT_FMT.format(
120 copr_user=key[1],
121 copr_project_name=key[2],
122 copr_chroot=key[3])
123 elif key[0] == 'project_rpms_dl_stat':
124 redis_key = PROJECT_RPMS_DL_STAT_FMT.format(
125 copr_user=key[1],
126 copr_project_name=key[2])
127 else:
128 raise Exception('Unknown key {}'.format(key[0]))
129
130 hits_formatted[redis_key] += count
131
132 for redis_key, count in hits_formatted.items():
133 TimedStatEvents.add_event(rc, redis_key, count=count, timestamp=ts_to)
134
135 rc.set('handle_be_stat_message_ts_from', ts_from)
136 rc.set('handle_be_stat_message_ts_to', ts_to)
137