def get_attrs(self, item_list, user): attrs = super(StreamGroupSerializer, self).get_attrs(item_list, user) if self.stats_period: # we need to compute stats at 1d (1h resolution), and 14d group_ids = [g.id for g in item_list] segments, interval = self.STATS_PERIOD_CHOICES[self.stats_period] now = timezone.now() query_params = { 'start': now - ((segments - 1) * interval), 'end': now, 'rollup': int(interval.total_seconds()), } try: stats = tsdb.get_range( model=tsdb.models.group, keys=group_ids, environment_id=self.environment_id_func(), **query_params) except Environment.DoesNotExist: stats = { key: tsdb.make_series(0, **query_params) for key in group_ids } for item in item_list: attrs[item].update({ 'stats': stats[item.id], }) return attrs
def query_tsdb(self, group_ids, query_params, **kwargs): try: environment = self.environment_func() except Environment.DoesNotExist: stats = {key: tsdb.make_series(0, **query_params) for key in group_ids} else: stats = tsdb.get_range( model=tsdb.models.group, keys=group_ids, environment_ids=environment and [environment.id], **query_params, ) return stats
def query_tsdb(self, group_ids, query_params): try: environment = self.environment_func() except Environment.DoesNotExist: stats = {key: tsdb.make_series(0, **query_params) for key in group_ids} else: stats = tsdb.get_range( model=tsdb.models.group, keys=group_ids, environment_ids=environment and [environment.id], **query_params ) return stats
def get(self, request, group): """ Retrieve an Issue ````````````````` Return details on an individual issue. This returns the basic stats for the issue (title, last seen, first seen), some overall numbers (number of comments, user reports) as well as the summarized event data. :pparam string issue_id: the ID of the issue to retrieve. :auth: required """ # TODO(dcramer): handle unauthenticated/public response data = serialize( group, request.user, GroupSerializer(environment_func=self._get_environment_func( request, group.project.organization_id))) # TODO: these probably should be another endpoint activity = self._get_activity(request, group, num=100) seen_by = self._get_seen_by(request, group) first_release = group.get_first_release() if first_release is not None: last_release = group.get_last_release() else: last_release = None action_list = self._get_actions(request, group) if first_release: first_release = self._get_release_info(request, group, first_release) if last_release: last_release = self._get_release_info(request, group, last_release) try: environment_id = self._get_environment_id_from_request( request, group.project.organization_id) except Environment.DoesNotExist: get_range = lambda model, keys, start, end, **kwargs: \ {k: tsdb.make_series(0, start, end) for k in keys} tags = [] user_reports = UserReport.objects.none() else: get_range = functools.partial(tsdb.get_range, environment_id=environment_id) tags = tagstore.get_group_tag_keys(group.project_id, group.id, environment_id, limit=100) if environment_id is None: user_reports = UserReport.objects.filter(group=group) else: user_reports = UserReport.objects.filter( group=group, environment_id=environment_id) now = timezone.now() hourly_stats = tsdb.rollup( get_range( model=tsdb.models.group, keys=[group.id], end=now, start=now - timedelta(days=1), ), 3600)[group.id] daily_stats = tsdb.rollup( get_range( model=tsdb.models.group, keys=[group.id], end=now, start=now - timedelta(days=30), ), 3600 * 24)[group.id] participants = list( User.objects.filter( groupsubscription__is_active=True, groupsubscription__group=group, )) data.update({ 'firstRelease': first_release, 'lastRelease': last_release, 'activity': serialize(activity, request.user), 'seenBy': seen_by, 'participants': serialize(participants, request.user), 'pluginActions': action_list, 'pluginIssues': self._get_available_issue_plugins(request, group), 'pluginContexts': self._get_context_plugins(request, group), 'userReportCount': user_reports.count(), 'tags': sorted(serialize(tags, request.user), key=lambda x: x['name']), 'stats': { '24h': hourly_stats, '30d': daily_stats, } }) # the current release is the 'latest seen' release within the # environment even if it hasnt affected this issue try: environment = self._get_environment_from_request( request, group.project.organization_id, ) except Environment.DoesNotExist: environment = None if environment is not None: try: current_release = GroupRelease.objects.filter( group_id=group.id, environment=environment.name, release_id=ReleaseEnvironment.objects.filter( release_id__in=ReleaseProject.objects.filter( project_id=group.project_id).values_list( 'release_id', flat=True), organization_id=group.project.organization_id, environment_id=environment.id, ).order_by('-first_seen').values_list('release_id', flat=True)[:1], )[0] except IndexError: current_release = None data.update({ 'currentRelease': serialize(current_release, request.user, GroupReleaseWithStatsSerializer()) }) return Response(data)
def get(self, request, group): """ Retrieve an Issue ````````````````` Return details on an individual issue. This returns the basic stats for the issue (title, last seen, first seen), some overall numbers (number of comments, user reports) as well as the summarized event data. :pparam string issue_id: the ID of the issue to retrieve. :auth: required """ # TODO(dcramer): handle unauthenticated/public response data = serialize( group, request.user, GroupSerializer( environment_id_func=self._get_environment_id_func( request, group.project.organization_id) ) ) # TODO: these probably should be another endpoint activity = self._get_activity(request, group, num=100) seen_by = self._get_seen_by(request, group) first_release = group.get_first_release() if first_release is not None: last_release = group.get_last_release() else: last_release = None action_list = self._get_actions(request, group) if first_release: first_release = self._get_release_info(request, group, first_release) if last_release: last_release = self._get_release_info(request, group, last_release) try: environment_id = self._get_environment_id_from_request( request, group.project.organization_id) except Environment.DoesNotExist: get_range = lambda model, keys, start, end, **kwargs: \ {k: tsdb.make_series(0, start, end) for k in keys} tags = [] else: get_range = functools.partial(tsdb.get_range, environment_id=environment_id) tags = tagstore.get_group_tag_keys( group.project_id, group.id, environment_id, limit=100) now = timezone.now() hourly_stats = tsdb.rollup( get_range( model=tsdb.models.group, keys=[group.id], end=now, start=now - timedelta(days=1), ), 3600 )[group.id] daily_stats = tsdb.rollup( get_range( model=tsdb.models.group, keys=[group.id], end=now, start=now - timedelta(days=30), ), 3600 * 24 )[group.id] participants = list( User.objects.filter( groupsubscription__is_active=True, groupsubscription__group=group, ) ) data.update( { 'firstRelease': first_release, 'lastRelease': last_release, 'activity': serialize(activity, request.user), 'seenBy': seen_by, 'participants': serialize(participants, request.user), 'pluginActions': action_list, 'pluginIssues': self._get_available_issue_plugins(request, group), 'pluginContexts': self._get_context_plugins(request, group), 'userReportCount': UserReport.objects.filter(group=group).count(), 'tags': sorted(serialize(tags, request.user), key=lambda x: x['name']), 'stats': { '24h': hourly_stats, '30d': daily_stats, } } ) return Response(data)