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_from_stored and ts_from < ts_to_stored) or\
107 (ts_to > ts_from_stored and ts_to <= ts_to_stored) or\
108 (ts_from <= ts_from_stored and ts_to >= ts_to_stored):
109 app.logger.debug('Time overlap with already stored data. Skipping.')
110 return
111
112 hits_formatted = defaultdict(int)
113 for key_str, count in hits.items():
114 key = key_str.split('|')
115 if key[0] == 'chroot_repo_metadata_dl_stat':
116 redis_key = CHROOT_REPO_MD_DL_STAT_FMT.format(
117 copr_user=key[1],
118 copr_project_name=key[2],
119 copr_chroot=key[3])
120 elif key[0] == 'chroot_rpms_dl_stat':
121 redis_key = CHROOT_RPMS_DL_STAT_FMT.format(
122 copr_user=key[1],
123 copr_project_name=key[2],
124 copr_chroot=key[3])
125 elif key[0] == 'project_rpms_dl_stat':
126 redis_key = PROJECT_RPMS_DL_STAT_FMT.format(
127 copr_user=key[1],
128 copr_project_name=key[2])
129 else:
130 raise Exception('Unknown key {}'.format(key[0]))
131
132 hits_formatted[redis_key] += 1
133
134 for redis_key, count in hits_formatted.items():
135 TimedStatEvents.add_event(rc, redis_key, count=count, timestamp=ts_to)
136
137 rc.set('handle_be_stat_message_ts_from', ts_from)
138 rc.set('handle_be_stat_message_ts_to', ts_to)
139