def get_attrs(self, item_list, user): if not self._collapse("base"): attrs = super(StreamGroupSerializerSnuba, self).get_attrs(item_list, user) else: seen_stats = self._get_seen_stats(item_list, user) if seen_stats: attrs = {item: seen_stats.get(item, {}) for item in item_list} else: attrs = {item: {} for item in item_list} if self.stats_period and not self._collapse("stats"): partial_get_stats = functools.partial( self.get_stats, item_list=item_list, user=user, environment_ids=self.environment_ids) stats = partial_get_stats() filtered_stats = (partial_get_stats( conditions=self.conditions) if self.conditions and not self._collapse("filtered") else None) for item in item_list: if filtered_stats: attrs[item].update( {"filtered_stats": filtered_stats[item.id]}) attrs[item].update({"stats": stats[item.id]}) if self._expand("inbox"): inbox_stats = get_inbox_details(item_list) for item in item_list: attrs[item].update({"inbox": inbox_stats.get(item.id)}) if self._expand("owners"): owner_details = get_owner_details(item_list) for item in item_list: attrs[item].update({"owners": owner_details.get(item.id)}) return attrs
def get_attrs(self, item_list, user): if not self._collapse("base"): attrs = super().get_attrs(item_list, user) else: seen_stats = self._get_seen_stats(item_list, user) if seen_stats: attrs = {item: seen_stats.get(item, {}) for item in item_list} else: attrs = {item: {} for item in item_list} if self.stats_period and not self._collapse("stats"): partial_get_stats = functools.partial( self.get_stats, item_list=item_list, user=user, environment_ids=self.environment_ids ) stats = partial_get_stats() filtered_stats = ( partial_get_stats(conditions=self.conditions) if self.conditions and not self._collapse("filtered") else None ) for item in item_list: if filtered_stats: attrs[item].update({"filtered_stats": filtered_stats[item.id]}) attrs[item].update({"stats": stats[item.id]}) if self._expand("sessions"): uniq_project_ids = list({item.project_id for item in item_list}) cache_keys = {pid: self._build_session_cache_key(pid) for pid in uniq_project_ids} cache_data = cache.get_many(cache_keys.values()) missed_items = [] for item in item_list: num_sessions = cache_data.get(cache_keys[item.project_id]) if num_sessions is None: found = "miss" missed_items.append(item) else: found = "hit" attrs[item].update( { "sessionCount": num_sessions, } ) metrics.incr(f"group.get_session_counts.{found}") if missed_items: filters = {"project_id": list({item.project_id for item in missed_items})} if self.environment_ids: filters["environment"] = self.environment_ids result_totals = raw_query( selected_columns=["sessions"], dataset=Dataset.Sessions, start=self.start, end=self.end, filter_keys=filters, groupby=["project_id"], referrer="serializers.GroupSerializerSnuba.session_totals", ) results = {} for data in result_totals["data"]: cache_key = self._build_session_cache_key(data["project_id"]) results[data["project_id"]] = data["sessions"] cache.set(cache_key, data["sessions"], 3600) for item in missed_items: if item.project_id in results.keys(): attrs[item].update( { "sessionCount": results[item.project_id], } ) else: attrs[item].update({"sessionCount": None}) if self._expand("inbox"): inbox_stats = get_inbox_details(item_list) for item in item_list: attrs[item].update({"inbox": inbox_stats.get(item.id)}) if self._expand("owners"): owner_details = get_owner_details(item_list) for item in item_list: attrs[item].update({"owners": owner_details.get(item.id)}) return attrs
def get_attrs(self, item_list, user): if not self._collapse("base"): attrs = super().get_attrs(item_list, user) else: seen_stats = self._get_seen_stats(item_list, user) if seen_stats: attrs = {item: seen_stats.get(item, {}) for item in item_list} else: attrs = {item: {} for item in item_list} if self.stats_period and not self._collapse("stats"): partial_get_stats = functools.partial( self.get_stats, item_list=item_list, user=user, environment_ids=self.environment_ids) stats = partial_get_stats() filtered_stats = (partial_get_stats( conditions=self.conditions) if self.conditions and not self._collapse("filtered") else None) for item in item_list: if filtered_stats: attrs[item].update( {"filtered_stats": filtered_stats[item.id]}) attrs[item].update({"stats": stats[item.id]}) if self._expand("sessions"): uniq_project_ids = list( {item.project_id for item in item_list}) cache_keys = { pid: self._build_session_cache_key(pid) for pid in uniq_project_ids } cache_data = cache.get_many(cache_keys.values()) missed_items = [] for item in item_list: num_sessions = cache_data.get(cache_keys[item.project_id]) if num_sessions is None: found = "miss" missed_items.append(item) else: found = "hit" attrs[item].update({ "sessionCount": num_sessions, }) metrics.incr(f"group.get_session_counts.{found}") if missed_items: project_ids = list( {item.project_id for item in missed_items}) project_sessions = release_health.get_num_sessions_per_project( project_ids, self.start, self.end, self.environment_ids, ) results = {} for project_id, count in project_sessions: cache_key = self._build_session_cache_key(project_id) results[project_id] = count cache.set(cache_key, count, 3600) for item in missed_items: if item.project_id in results.keys(): attrs[item].update({ "sessionCount": results[item.project_id], }) else: attrs[item].update({"sessionCount": None}) if self._expand("inbox"): inbox_stats = get_inbox_details(item_list) for item in item_list: attrs[item].update({"inbox": inbox_stats.get(item.id)}) if self._expand("owners"): owner_details = get_owner_details(item_list) for item in item_list: attrs[item].update({"owners": owner_details.get(item.id)}) return attrs