def test_get_release_health_data_overview_sessions(self): data = get_release_health_data_overview( [ (self.project.id, self.session_release), (self.project.id, self.session_crashed_release), ], summary_stats_period="24h", health_stats_period="24h", stat="sessions", ) stats = make_24h_stats(self.received - (24 * 3600)) stats_ok = stats[:-1] + [[stats[-1][0], 2]] stats_crash = stats[:-1] + [[stats[-1][0], 1]] assert data == { (self.project.id, self.session_crashed_release): { "total_sessions": 1, "sessions_errored": 0, "total_sessions_24h": 1, "total_users": 1, "duration_p90": None, "sessions_crashed": 1, "total_users_24h": 1, "stats": { "24h": stats_crash }, "crash_free_users": 0.0, "adoption": 100.0, "sessions_adoption": 33.33333333333333, "has_health_data": True, "crash_free_sessions": 0.0, "duration_p50": None, "total_project_sessions_24h": 3, "total_project_users_24h": 1, }, (self.project.id, self.session_release): { "total_sessions": 2, "sessions_errored": 0, "total_sessions_24h": 2, "total_users": 1, "duration_p90": 57.0, "sessions_crashed": 0, "total_users_24h": 1, "stats": { "24h": stats_ok }, "crash_free_users": 100.0, "sessions_adoption": 66.66666666666666, "adoption": 100.0, "has_health_data": True, "crash_free_sessions": 100.0, "duration_p50": 45.0, "total_project_sessions_24h": 3, "total_project_users_24h": 1, }, }
def get_attrs(self, item_list, user, **kwargs): project = kwargs.get("project") environment = kwargs.get("environment") with_health_data = kwargs.get("with_health_data", False) health_stat = kwargs.get("health_stat", None) health_stats_period = kwargs.get("health_stats_period") summary_stats_period = kwargs.get("summary_stats_period") if environment is None: first_seen, last_seen, issue_counts_by_release = self.__get_release_data_no_environment( project, item_list) else: first_seen, last_seen, issue_counts_by_release = self.__get_release_data_with_environment( project, item_list, environment) owners = { d["id"]: d for d in serialize(set( i.owner for i in item_list if i.owner_id), user) } release_metadata_attrs = self._get_commit_metadata(item_list, user) deploy_metadata_attrs = self._get_deploy_metadata(item_list, user) release_projects = defaultdict(list) project_releases = ReleaseProject.objects.filter( release__in=item_list).values( "release_id", "release__version", "project__slug", "project__name", "project__id", "project__platform", ) platforms = ProjectPlatform.objects.filter(project_id__in=set( x["project__id"] for x in project_releases)).values_list("project_id", "platform") platforms_by_project = defaultdict(list) for project_id, platform in platforms: platforms_by_project[project_id].append(platform) if with_health_data: health_data = get_release_health_data_overview( [(pr["project__id"], pr["release__version"]) for pr in project_releases], health_stats_period=health_stats_period, summary_stats_period=summary_stats_period, stat=health_stat, ) else: health_data = None for pr in project_releases: pr_rv = { "id": pr["project__id"], "slug": pr["project__slug"], "name": pr["project__name"], "platform": pr["project__platform"], "platforms": platforms_by_project.get(pr["project__id"]) or [], } if health_data is not None: pr_rv["health_data"] = health_data.get( (pr["project__id"], pr["release__version"])) release_projects[pr["release_id"]].append(pr_rv) result = {} for item in item_list: single_release_projects = release_projects.get(item.id, []) if item._for_project_id is not None: single_release_projects = [ x for x in single_release_projects if x["id"] == item._for_project_id ] release_new_groups = (issue_counts_by_release.get(item.id) or {}).get(item._for_project_id) or 0 else: release_new_groups = sum((issue_counts_by_release.get(item.id) or {}).values()) p = { "owner": owners[six.text_type(item.owner_id)] if item.owner_id else None, "new_groups": release_new_groups, "projects": single_release_projects, "first_seen": first_seen.get(item.version), "last_seen": last_seen.get(item.version), } p.update(release_metadata_attrs[item]) p.update(deploy_metadata_attrs[item]) result[item] = p return result
def get_attrs(self, item_list, user, **kwargs): project = kwargs.get("project") # Some code paths pass an environment object, other pass a list of # environment names. environment = kwargs.get("environment") environments = kwargs.get("environments") if not environments: if environment: environments = [environment.name] else: environments = None with_health_data = kwargs.get("with_health_data", False) health_stat = kwargs.get("health_stat", None) health_stats_period = kwargs.get("health_stats_period") summary_stats_period = kwargs.get("summary_stats_period") no_snuba = kwargs.get("no_snuba") if with_health_data and no_snuba: raise TypeError("health data requires snuba") if environments is None: first_seen, last_seen, issue_counts_by_release = self.__get_release_data_no_environment( project, item_list) else: ( first_seen, last_seen, issue_counts_by_release, ) = self.__get_release_data_with_environments( project, item_list, environments) owners = { d["id"]: d for d in serialize({i.owner for i in item_list if i.owner_id}, user) } release_metadata_attrs = self._get_commit_metadata(item_list, user) deploy_metadata_attrs = self._get_deploy_metadata(item_list, user) release_projects = defaultdict(list) project_releases = ReleaseProject.objects.filter( release__in=item_list).values( "new_groups", "release_id", "release__version", "project__slug", "project__name", "project__id", "project__platform", ) platforms = ProjectPlatform.objects.filter( project_id__in={x["project__id"] for x in project_releases}).values_list( "project_id", "platform") platforms_by_project = defaultdict(list) for project_id, platform in platforms: platforms_by_project[project_id].append(platform) if with_health_data: health_data = get_release_health_data_overview( [(pr["project__id"], pr["release__version"]) for pr in project_releases], health_stats_period=health_stats_period, summary_stats_period=summary_stats_period, environments=environments, stat=health_stat, ) has_health_data = None else: health_data = None if no_snuba: has_health_data = {} else: has_health_data = check_has_health_data([ (pr["project__id"], pr["release__version"]) for pr in project_releases ]) for pr in project_releases: pr_rv = { "id": pr["project__id"], "slug": pr["project__slug"], "name": pr["project__name"], "new_groups": pr["new_groups"], "platform": pr["project__platform"], "platforms": platforms_by_project.get(pr["project__id"]) or [], } if health_data is not None: pr_rv["health_data"] = health_data.get( (pr["project__id"], pr["release__version"])) pr_rv["has_health_data"] = (pr_rv["health_data"] or {}).get("has_health_data", False) else: pr_rv["has_health_data"] = ( pr["project__id"], pr["release__version"], ) in has_health_data release_projects[pr["release_id"]].append(pr_rv) result = {} for item in item_list: single_release_projects = release_projects.get(item.id, []) if item._for_project_id is not None: single_release_projects = [ x for x in single_release_projects if x["id"] == item._for_project_id ] release_new_groups = (issue_counts_by_release.get(item.id) or {}).get(item._for_project_id) or 0 else: release_new_groups = sum((issue_counts_by_release.get(item.id) or {}).values()) p = { "owner": owners[str(item.owner_id)] if item.owner_id else None, "new_groups": release_new_groups, "projects": single_release_projects, "first_seen": first_seen.get(item.version), "last_seen": last_seen.get(item.version), } p.update(release_metadata_attrs[item]) p.update(deploy_metadata_attrs[item]) result[item] = p return result