Beispiel #1
0
    def get(self, request, group):
        tag_keys = TagKey.objects.filter(
            project=group.project,
            status=TagKeyStatus.VISIBLE,
            key__in=GroupTagKey.objects.filter(group=group, ).values('key'),
        )

        # O(N) db access
        data = []
        for tag_key in tag_keys:
            total_values = GroupTagValue.get_value_count(group.id, tag_key.key)
            top_values = GroupTagValue.get_top_values(group.id,
                                                      tag_key.key,
                                                      limit=10)
            if tag_key.key.startswith('sentry:'):
                key = tag_key.key.split('sentry:', 1)[-1]
            else:
                key = tag_key.key

            data.append({
                'id': str(tag_key.id),
                'key': key,
                'name': tag_key.get_label(),
                'uniqueValues': tag_key.values_seen,
                'totalValues': total_values,
                'topValues': serialize(top_values, request.user),
            })

        return Response(data)
Beispiel #2
0
    def get(self, request, group, key):
        """
        List a tag's details

        Returns details about the given tag key.

            {method} {path}

        """
        try:
            tag_key = TagKey.objects.get(
                project=group.project_id,
                key=key,
                status=TagKeyStatus.VISIBLE,
            )
        except TagKey.DoesNotExist:
            raise ResourceDoesNotExist

        total_values = GroupTagValue.get_value_count(group.id, key)

        top_values = GroupTagValue.get_top_values(group.id, key, limit=3)

        data = {
            'id': str(tag_key.id),
            'key': tag_key.key,
            'name': tag_key.get_label(),
            'uniqueValues': tag_key.values_seen,
            'totalValues': total_values,
            'topValues': serialize(top_values, request.user),
        }

        return Response(data)
Beispiel #3
0
    def get(self, request, group):
        tag_keys = TagKey.objects.filter(
            project=group.project,
            status=TagKeyStatus.VISIBLE,
            key__in=GroupTagKey.objects.filter(group=group).values("key"),
        )

        # O(N) db access
        data = []
        for tag_key in tag_keys:
            total_values = GroupTagValue.get_value_count(group.id, tag_key.key)
            top_values = GroupTagValue.get_top_values(group.id, tag_key.key, limit=10)
            if tag_key.key.startswith("sentry:"):
                key = tag_key.key.split("sentry:", 1)[-1]
            else:
                key = tag_key.key

            data.append(
                {
                    "id": str(tag_key.id),
                    "key": key,
                    "name": tag_key.get_label(),
                    "uniqueValues": tag_key.values_seen,
                    "totalValues": total_values,
                    "topValues": serialize(top_values, request.user),
                }
            )

        return Response(data)
Beispiel #4
0
    def get(self, request, group):
        tag_keys = TagKey.objects.filter(
            project=group.project,
            status=TagKeyStatus.VISIBLE,
            key__in=GroupTagKey.objects.filter(group=group, ).values('key'),
        )

        # O(N) db access
        data = []
        all_top_values = []
        for tag_key in tag_keys:
            total_values = GroupTagValue.get_value_count(group.id, tag_key.key)
            top_values = GroupTagValue.get_top_values(group.id,
                                                      tag_key.key,
                                                      limit=10)

            all_top_values.extend(top_values)

            data.append({
                'id': six.text_type(tag_key.id),
                'key': TagKey.get_standardized_key(tag_key.key),
                'name': tag_key.get_label(),
                'uniqueValues': tag_key.values_seen,
                'totalValues': total_values,
            })

        # Serialize all of the values at once to avoid O(n) serialize/db queries
        top_values_by_key = defaultdict(list)
        for value in serialize(all_top_values, request.user):
            top_values_by_key[value['key']].append(value)

        for d in data:
            d['topValues'] = top_values_by_key[d['key']]

        return Response(data)
Beispiel #5
0
    def get(self, request, group):
        tag_keys = TagKey.objects.filter(
            project=group.project,
            status=TagKeyStatus.VISIBLE,
            key__in=GroupTagKey.objects.filter(
                group=group,
            ).values('key'),
        )

        # O(N) db access
        data = []
        all_top_values = []
        for tag_key in tag_keys:
            total_values = GroupTagValue.get_value_count(group.id, tag_key.key)
            top_values = GroupTagValue.get_top_values(group.id, tag_key.key, limit=10)

            all_top_values.extend(top_values)

            data.append({
                'id': six.text_type(tag_key.id),
                'key': TagKey.get_standardized_key(tag_key.key),
                'name': tag_key.get_label(),
                'uniqueValues': tag_key.values_seen,
                'totalValues': total_values,
            })

        # Serialize all of the values at once to avoid O(n) serialize/db queries
        top_values_by_key = defaultdict(list)
        for value in serialize(all_top_values, request.user):
            top_values_by_key[value['key']].append(value)

        for d in data:
            d['topValues'] = top_values_by_key[d['key']]

        return Response(data)
    def get(self, request, group, key):
        """
        Retrieve Tag Details
        ````````````````````

        Returns details for given tag key related to an issue.

        :pparam string issue_id: the ID of the issue to retrieve.
        :pparam string key: the tag key to look the values up for.
        :auth: required
        """
        # XXX(dcramer): kill sentry prefix for internal reserved tags
        if TagKey.is_reserved_key(key):
            lookup_key = 'sentry:{0}'.format(key)
        else:
            lookup_key = key

        try:
            tag_key = TagKey.objects.get(
                project=group.project_id,
                key=lookup_key,
                status=TagKeyStatus.VISIBLE,
            )
        except TagKey.DoesNotExist:
            raise ResourceDoesNotExist

        try:
            group_tag_key = GroupTagKey.objects.get(
                group=group,
                key=lookup_key,
            )
        except GroupTagKey.DoesNotExist:
            raise ResourceDoesNotExist

        total_values = GroupTagValue.get_value_count(group.id, lookup_key)

        top_values = GroupTagValue.get_top_values(group.id,
                                                  lookup_key,
                                                  limit=3)

        data = {
            'id': str(tag_key.id),
            'key': key,
            'name': tag_key.get_label(),
            'uniqueValues': group_tag_key.values_seen,
            'totalValues': total_values,
            'topValues': serialize(top_values, request.user),
        }

        return Response(data)
    def get(self, request, group, key):
        """
        Retrieve Tag Details
        ````````````````````

        Returns details for given tag key related to an issue.

        :pparam string issue_id: the ID of the issue to retrieve.
        :pparam string key: the tag key to look the values up for.
        :auth: required
        """
        # XXX(dcramer): kill sentry prefix for internal reserved tags
        if TagKey.is_reserved_key(key):
            lookup_key = 'sentry:{0}'.format(key)
        else:
            lookup_key = key

        try:
            tag_key = TagKey.objects.get(
                project=group.project_id,
                key=lookup_key,
                status=TagKeyStatus.VISIBLE,
            )
        except TagKey.DoesNotExist:
            raise ResourceDoesNotExist

        try:
            group_tag_key = GroupTagKey.objects.get(
                group=group,
                key=lookup_key,
            )
        except GroupTagKey.DoesNotExist:
            raise ResourceDoesNotExist

        total_values = GroupTagValue.get_value_count(group.id, lookup_key)

        top_values = GroupTagValue.get_top_values(group.id, lookup_key, limit=9)

        data = {
            'id': str(tag_key.id),
            'key': key,
            'name': tag_key.get_label(),
            'uniqueValues': group_tag_key.values_seen,
            'totalValues': total_values,
            'topValues': serialize(top_values, request.user),
        }

        return Response(data)
Beispiel #8
0
    def get(self, request, group):
        tag_keys = TagKey.objects.filter(
            project=group.project,
            key__in=GroupTagKey.objects.filter(group=group, ).values('key'),
        )

        # O(N) db access
        data = []
        for tag_key in tag_keys:
            total_values = GroupTagValue.get_value_count(group.id, tag_key.key)
            top_values = self._get_top_values(group.id, tag_key.key)

            data.append({
                'id':
                str(tag_key.id),
                'key':
                tag_key.key,
                'name':
                tag_key.get_label(),
                'uniqueValues':
                tag_key.values_seen,
                'totalValues':
                total_values,
                'topValues': [{
                    'id': tag_value.id,
                    'value': tag_value.value,
                    'count': tag_value.times_seen,
                    'firstSeen': tag_value.first_seen,
                    'lastSeen': tag_value.last_seen,
                } for tag_value in top_values]
            })

        return Response(data)
Beispiel #9
0
    def get(self, request, group):
        tag_keys = TagKey.objects.filter(
            project=group.project,
            key__in=GroupTagKey.objects.filter(
                group=group,
            ).values('key'),
        )

        # O(N) db access
        data = []
        for tag_key in tag_keys:
            total_values = GroupTagValue.get_value_count(group.id, tag_key.key)
            top_values = self._get_top_values(group.id, tag_key.key)

            data.append({
                'id': str(tag_key.id),
                'key': tag_key.key,
                'name': tag_key.get_label(),
                'uniqueValues': tag_key.values_seen,
                'totalValues': total_values,
                'topValues': [
                    {
                        'id': tag_value.id,
                        'value': tag_value.value,
                        'count': tag_value.times_seen,
                        'firstSeen': tag_value.first_seen,
                        'lastSeen': tag_value.last_seen,
                    } for tag_value in top_values
                ]
            })

        return Response(data)
Beispiel #10
0
    def get(self, request, group, key):
        """
        Retrieve Tag Details
        ````````````````````

        Returns details for given tag key related to an issue.

        :pparam string issue_id: the ID of the issue to retrieve.
        :pparam string key: the tag key to look the values up for.
        :auth: required
        """
        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            tag_key = tagstore.get_tag_key(group.project_id, lookup_key)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        try:
            group_tag_key = GroupTagKey.objects.get(
                group_id=group.id,
                key=lookup_key,
            )
        except GroupTagKey.DoesNotExist:
            raise ResourceDoesNotExist

        total_values = GroupTagValue.get_value_count(group.id, lookup_key)

        top_values = GroupTagValue.get_top_values(group.id, lookup_key, limit=9)

        data = {
            'id': six.text_type(tag_key.id),
            'key': key,
            'name': tag_key.get_label(),
            'uniqueValues': group_tag_key.values_seen,
            'totalValues': total_values,
            'topValues': serialize(top_values, request.user),
        }

        return Response(data)
    def get(self, request, group, key):
        """
        List Tag Details
        ````````````````

        Returns a list of details about the given tag key.

        :pparam string group_id: the ID of the group to retrieve.
        :pparam string key: the tag key to look the values up for.
        :auth: required
        """
        # XXX(dcramer): kill sentry prefix for internal reserved tags
        if key in ('release', 'user', 'filename', 'function'):
            lookup_key = 'sentry:{0}'.format(key)
        else:
            lookup_key = key

        try:
            tag_key = TagKey.objects.get(
                project=group.project_id,
                key=lookup_key,
                status=TagKeyStatus.VISIBLE,
            )
        except TagKey.DoesNotExist:
            raise ResourceDoesNotExist

        total_values = GroupTagValue.get_value_count(group.id, key)

        top_values = GroupTagValue.get_top_values(group.id, key, limit=3)

        data = {
            'key': key,
            'name': tag_key.get_label(),
            'uniqueValues': tag_key.values_seen,
            'totalValues': total_values,
            'topValues': serialize(top_values, request.user),
        }

        return Response(data)
    def get(self, request, group):
        tag_keys = TagKey.objects.filter(
            project=group.project,
            key__in=GroupTagKey.objects.filter(group=group, ).values('key'),
        )

        # O(N) db access
        data = []
        for tag_key in tag_keys:
            total_values = GroupTagValue.get_value_count(group.id, tag_key.key)
            top_values = GroupTagValue.get_top_values(group.id,
                                                      tag_key.key,
                                                      limit=10)

            data.append({
                'id': str(tag_key.id),
                'key': tag_key.key,
                'name': tag_key.get_label(),
                'uniqueValues': tag_key.values_seen,
                'totalValues': total_values,
                'topValues': serialize(top_values, request.user),
            })

        return Response(data)
Beispiel #13
0
    def get(self, request, group):
        tag_keys = TagKey.objects.filter(
            project=group.project,
            key__in=GroupTagKey.objects.filter(
                group=group,
            ).values('key'),
        )

        # O(N) db access
        data = []
        for tag_key in tag_keys:
            total_values = GroupTagValue.get_value_count(group.id, tag_key.key)
            top_values = GroupTagValue.get_top_values(group.id, tag_key.key, limit=10)

            data.append({
                'id': str(tag_key.id),
                'key': tag_key.key,
                'name': tag_key.get_label(),
                'uniqueValues': tag_key.values_seen,
                'totalValues': total_values,
                'topValues': serialize(top_values, request.user),
            })

        return Response(data)
Beispiel #14
0
    def test_merge_updates_tag_values_seen(self):
        project = self.create_project()
        target, other = [self.create_group(project) for _ in range(0, 2)]

        data = {
            'sentry:user': {
                'id:1': {
                    target: 2,
                },
                'id:2': {
                    other: 3,
                },
                'id:3': {
                    target: 1,
                    other: 2,
                },
            },
            'key': {
                'foo': {
                    other: 3,
                },
            },
        }

        input_group_tag_keys = defaultdict(int)  # [(group, key)] = values_seen
        input_group_tag_values = defaultdict(int)  # [(group, key, value)] = times_seen
        output_group_tag_keys = defaultdict(int)  # [key] = values_seen
        output_group_tag_values = defaultdict(int)  # [(key, value)] = times_seen

        for key, values in data.items():
            output_group_tag_keys[key] = len(values)

            for value, groups in values.items():
                for group, count in groups.items():
                    input_group_tag_keys[(group, key)] += 1
                    input_group_tag_values[(group, key, value)] += count
                    output_group_tag_values[(key, value)] += count

        GroupTagKey.objects.bulk_create(
            [
                GroupTagKey(
                    project_id=project.id,
                    group_id=group.id,
                    key=key,
                    values_seen=values_seen,
                ) for ((group, key), values_seen) in input_group_tag_keys.items()
            ]
        )

        GroupTagValue.objects.bulk_create(
            [
                GroupTagValue(
                    project_id=project.id,
                    group_id=group.id,
                    key=key,
                    value=value,
                    times_seen=times_seen,
                ) for ((group, key, value), times_seen) in input_group_tag_values.items()
            ]
        )

        with self.tasks():
            merge_group(other.id, target.id)

        assert not Group.objects.filter(id=other.id).exists()
        assert not GroupTagKey.objects.filter(group_id=other.id).exists()
        assert not GroupTagValue.objects.filter(group_id=other.id).exists()

        for key, values_seen in output_group_tag_keys.items():
            assert GroupTagKey.objects.get(
                project_id=project.id, group_id=target.id, key=key
            ).values_seen == values_seen

        for (key, value), times_seen in output_group_tag_values.items():
            assert GroupTagValue.objects.get(
                project_id=project.id,
                group_id=target.id,
                key=key,
                value=value,
            ).times_seen == times_seen