Esempio n. 1
0
    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,
            },
        }
Esempio n. 2
0
    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
Esempio n. 3
0
    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