Beispiel #1
0
    def get(self, request: Request, group) -> Response:

        # optional queryparam `key` can be used to get results
        # only for specific keys.
        keys = [
            tagstore.prefix_reserved_key(k)
            for k in request.GET.getlist("key") if k
        ] or None

        # There are 2 use-cases for this method. For the 'Tags' tab we
        # get the top 10 values, for the tag distribution bars we get 9
        # This should ideally just be specified by the client
        if keys:
            value_limit = 9
        else:
            value_limit = 10

        environment_ids = [
            e.id for e in get_environments(request, group.project.organization)
        ]

        tag_keys = tagstore.get_group_tag_keys_and_top_values(
            group.project_id,
            group.id,
            environment_ids,
            keys=keys,
            value_limit=value_limit)

        return Response(serialize(tag_keys, request.user))
    def delete(self, request, project, key):
        """
        Remove all occurrences of the given tag key.

            {method} {path}

        """
        if key in PROTECTED_TAG_KEYS:
            return Response(status=403)

        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            deleted = tagstore.delete_tag_key(project.id, lookup_key)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        for tagkey in deleted:
            self.create_audit_entry(
                request=request,
                organization=project.organization,
                target_object=tagkey.id,
                event=AuditLogEntryEvent.TAGKEY_REMOVE,
                data=tagkey.get_audit_log_data(),
            )

        return Response(status=204)
    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:
            environment_id = self._get_environment_id_from_request(
                request, group.project.organization_id)
        except Environment.DoesNotExist:
            # if the environment doesn't exist then the tag can't possibly exist
            raise ResourceDoesNotExist

        try:
            group_tag_key = tagstore.get_group_tag_key(
                group.project_id, group.id, environment_id, lookup_key)
        except tagstore.GroupTagKeyNotFound:
            raise ResourceDoesNotExist

        if group_tag_key.count is None:
            group_tag_key.count = tagstore.get_group_tag_value_count(
                group.project_id, group.id, environment_id, lookup_key)

        if group_tag_key.top_values is None:
            group_tag_key.top_values = tagstore.get_top_group_tag_values(
                group.project_id, group.id, environment_id, lookup_key)

        return Response(serialize(group_tag_key, request.user))
    def delete(self, request, project, key):
        """
        Remove all occurrences of the given tag key.

            {method} {path}

        """
        if key in PROTECTED_TAG_KEYS:
            return Response(status=403)

        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            deleted = tagstore.delete_tag_key(project.id, lookup_key)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        for tagkey in deleted:
            self.create_audit_entry(
                request=request,
                organization=project.organization,
                target_object=tagkey.id,
                event=AuditLogEntryEvent.TAGKEY_REMOVE,
                data=tagkey.get_audit_log_data(),
            )

        return Response(status=204)
    def get(self, request, project, key):
        """
        List a Tag's Values
        ```````````````````

        Return a list of values associated with this key.  The `query`
        parameter can be used to to perform a "contains" match on
        values.

        :pparam string organization_slug: the slug of the organization.
        :pparam string project_slug: the slug of the project.
        :pparam string key: the tag key to look up.
        :auth: required
        """
        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            tagkey = tagstore.get_tag_key(project.id, lookup_key)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        queryset = tagstore.get_tag_value_qs(project.id, tagkey.key, query=request.GET.get('query'))

        return self.paginate(
            request=request,
            queryset=queryset,
            order_by='-last_seen',
            paginator_cls=DateTimePaginator,
            on_results=lambda x: serialize(x, request.user),
        )
Beispiel #6
0
    def get(self, request, group):

        # optional queryparam `key` can be used to get results
        # only for specific keys.
        keys = [tagstore.prefix_reserved_key(k)
                for k in request.GET.getlist('key') if k] or None

        # There are 2 use-cases for this method. For the 'Tags' tab we
        # get the top 10 values, for the tag distribution bars we get 9
        # This should ideally just be specified by the client
        if keys:
            value_limit = 9
        else:
            value_limit = 10

        try:
            environment_id = self._get_environment_id_from_request(
                request, group.project.organization_id)
        except Environment.DoesNotExist:
            tag_keys = []
        else:
            tag_keys = tagstore.get_group_tag_keys_and_top_values(
                group.project_id, group.id, environment_id, keys=keys,
                value_limit=value_limit)

        return Response(serialize(tag_keys, request.user))
Beispiel #7
0
    def get(self, request, group):

        # optional queryparam `key` can be used to get results
        # only for specific keys.
        keys = [tagstore.prefix_reserved_key(k)
                for k in request.GET.getlist('key') if k] or None

        # There are 2 use-cases for this method. For the 'Tags' tab we
        # get the top 10 values, for the tag distribution bars we get 9
        # This should ideally just be specified by the client
        if keys:
            value_limit = 9
        else:
            value_limit = 10

        use_snuba = request.GET.get('enable_snuba') == '1'

        environment_ids = [e.id for e in get_environments(request, group.project.organization)]

        if not use_snuba:
            # TODO(jess): This is just to ensure we're not breaking the old
            # issue page somehow -- non-snuba tagstore versions will raise
            # if more than one env is passed
            if environment_ids:
                environment_ids = environment_ids[:1]

        tag_keys = tagstore.get_group_tag_keys_and_top_values(
            group.project_id, group.id, environment_ids, keys=keys,
            value_limit=value_limit)

        return Response(serialize(tag_keys, request.user))
    def delete(self, request, project, key):
        """
        Remove all occurrences of the given tag key.

            {method} {path}

        """
        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            environment_id = self._get_environment_id_from_request(
                request, project.organization_id)
        except Environment.DoesNotExist:
            # if the environment doesn't exist then the tag can't possibly exist
            raise ResourceDoesNotExist

        try:
            deleted = tagstore.delete_tag_keys(project.id,
                                               lookup_key,
                                               environment_id=environment_id)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        for tagkey in deleted:
            self.create_audit_entry(
                request=request,
                organization=project.organization,
                target_object=tagkey.id,
                event=AuditLogEntryEvent.TAGKEY_REMOVE,
                data=tagkey.get_audit_log_data(),
            )

        return Response(status=204)
Beispiel #9
0
    def get(self, request, group):

        # optional queryparam `key` can be used to get results
        # only for specific keys.
        keys = [
            tagstore.prefix_reserved_key(k)
            for k in request.GET.getlist('key') if k
        ] or None

        # There are 2 use-cases for this method. For the 'Tags' tab we
        # get the top 10 values, for the tag distribution bars we get 9
        # This should ideally just be specified by the client
        if keys:
            value_limit = 9
        else:
            value_limit = 10

        try:
            environment_id = self._get_environment_id_from_request(
                request, group.project.organization_id)
        except Environment.DoesNotExist:
            tag_keys = []
        else:
            tag_keys = tagstore.get_group_tag_keys_and_top_values(
                group.project_id,
                group.id,
                environment_id and [environment_id],
                keys=keys,
                value_limit=value_limit)

        return Response(serialize(tag_keys, request.user))
Beispiel #10
0
    def get(self, request, project, key):
        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            tagkey = tagstore.get_tag_key(project.id, lookup_key)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        return Response(serialize(tagkey, request.user))
    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:
            environment_id = self._get_environment_id_from_request(
                request, group.project.organization_id)
        except Environment.DoesNotExist:
            # if the environment doesn't exist then the tag can't possibly exist
            raise ResourceDoesNotExist

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

        try:
            group_tag_key = tagstore.get_group_tag_key(group.project_id,
                                                       group.id,
                                                       environment_id,
                                                       lookup_key)
        except tagstore.GroupTagKeyNotFound:
            raise ResourceDoesNotExist

        total_values = tagstore.get_group_tag_value_count(
            group.project_id, group.id, environment_id, lookup_key)
        top_values = tagstore.get_top_group_tag_values(group.project_id,
                                                       group.id,
                                                       environment_id,
                                                       lookup_key,
                                                       limit=9)

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

        return Response(data)
Beispiel #12
0
    def get(self, request, group, key):
        """
        List a Tag's Values
        ```````````````````

        Return a list of values associated with this key for 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:
            environment_id = self._get_environment_id_from_request(
                request, group.project.organization_id)
        except Environment.DoesNotExist:
            # if the environment doesn't exist then the tag can't possibly exist
            raise ResourceDoesNotExist

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

        queryset = tagstore.get_group_tag_value_qs(
            group.project_id, group.id, environment_id, lookup_key)

        sort = request.GET.get('sort')
        if sort == 'date':
            order_by = '-last_seen'
            paginator_cls = DateTimePaginator
        elif sort == 'age':
            order_by = '-first_seen'
            paginator_cls = DateTimePaginator
        else:
            order_by = '-id'
            paginator_cls = Paginator

        if key == 'user':
            serializer_cls = UserTagValueSerializer()
        else:
            serializer_cls = None

        return self.paginate(
            request=request,
            queryset=queryset,
            order_by=order_by,
            paginator_cls=paginator_cls,
            on_results=lambda x: serialize(x, request.user, serializer_cls),
        )
Beispiel #13
0
    def get(self, request: Request, group, key) -> Response:
        """
        List a Tag's Values
        ```````````````````

        Return a list of values associated with this key for an issue.
        When paginated can return at most 1000 values.

        :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)

        environment_ids = [
            e.id for e in get_environments(request, group.project.organization)
        ]

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

        sort = request.GET.get("sort")
        if sort == "date":
            order_by = "-last_seen"
        elif sort == "age":
            order_by = "-first_seen"
        elif sort == "count":
            order_by = "-times_seen"
        else:
            order_by = "-id"

        if key == "user":
            serializer_cls = UserTagValueSerializer(group.project_id)
        else:
            serializer_cls = None

        paginator = tagstore.get_group_tag_value_paginator(group.project_id,
                                                           group.id,
                                                           environment_ids,
                                                           lookup_key,
                                                           order_by=order_by)

        return self.paginate(
            request=request,
            paginator=paginator,
            on_results=lambda results: serialize(results, request.user,
                                                 serializer_cls),
        )
Beispiel #14
0
    def get(self, request, group, key):
        """
        List a Tag's Values
        ```````````````````

        Return a list of values associated with this key for 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:
            environment_id = self._get_environment_id_from_request(
                request, group.project.organization_id)
        except Environment.DoesNotExist:
            # if the environment doesn't exist then the tag can't possibly exist
            raise ResourceDoesNotExist

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

        sort = request.GET.get("sort")
        if sort == "date":
            order_by = "-last_seen"
        elif sort == "age":
            order_by = "-first_seen"
        else:
            order_by = "-id"

        if key == "user":
            serializer_cls = UserTagValueSerializer(group.project_id)
        else:
            serializer_cls = None

        paginator = tagstore.get_group_tag_value_paginator(group.project_id,
                                                           group.id,
                                                           environment_id,
                                                           lookup_key,
                                                           order_by=order_by)

        return self.paginate(
            request=request,
            paginator=paginator,
            on_results=lambda results: serialize(results, request.user,
                                                 serializer_cls),
        )
Beispiel #15
0
    def get(self, request, group, key):
        """
        List a Tag's Values
        ```````````````````

        Return a list of values associated with this key for 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:
            tagstore.get_tag_key(group.project_id, lookup_key)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        queryset = GroupTagValue.objects.filter(
            group_id=group.id,
            key=lookup_key,
        )

        sort = request.GET.get('sort')
        if sort == 'date':
            order_by = '-last_seen'
            paginator_cls = DateTimePaginator
        elif sort == 'age':
            order_by = '-first_seen'
            paginator_cls = DateTimePaginator
        elif sort == 'freq':
            order_by = '-times_seen'
            paginator_cls = OffsetPaginator
        else:
            order_by = '-id'
            paginator_cls = Paginator

        if key == 'user':
            serializer_cls = UserTagValueSerializer()
        else:
            serializer_cls = None

        return self.paginate(
            request=request,
            queryset=queryset,
            order_by=order_by,
            paginator_cls=paginator_cls,
            on_results=lambda x: serialize(x, request.user, serializer_cls),
        )
    def get(self, request, project, key):
        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            environment_id = self._get_environment_id_from_request(request, project.organization_id)
        except Environment.DoesNotExist:
            # if the environment doesn't exist then the tag can't possibly exist
            raise ResourceDoesNotExist

        try:
            tagkey = tagstore.get_tag_key(project.id, environment_id, lookup_key)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        return Response(serialize(tagkey, request.user))
Beispiel #17
0
    def get(self, request, project, key):
        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            environment_id = self._get_environment_id_from_request(request, project.organization_id)
        except Environment.DoesNotExist:
            # if the environment doesn't exist then the tag can't possibly exist
            raise ResourceDoesNotExist

        try:
            tagkey = tagstore.get_tag_key(project.id, environment_id, lookup_key)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        return Response(serialize(tagkey, request.user))
Beispiel #18
0
    def get(self, request, organization):
        try:
            snuba_args = self.get_snuba_query_args(request, organization)
        except OrganizationEventsError as exc:
            return Response({'detail': exc.message}, status=400)
        except NoProjects:
            return Response({'detail': 'A valid project must be included.'},
                            status=400)

        lookup_keys = []
        non_tag_lookup_keys = []
        for key in request.GET.getlist('keys'):
            if key in self.NON_TAG_KEYS:
                non_tag_lookup_keys.append(key)
            lookup_keys.append(tagstore.prefix_reserved_key(key))

        if not lookup_keys:
            return Response({'detail': 'Tag keys must be specified.'},
                            status=400)
        project_ids = snuba_args['filter_keys']['project_id']
        environment_ids = snuba_args['filter_keys'].get('environment_id')

        has_global_views = features.has('organizations:global-views',
                                        organization,
                                        actor=request.user)

        if not has_global_views and len(project_ids) > 1:
            return Response(
                {'detail': 'You cannot view events from multiple projects.'},
                status=400)

        try:
            tag_keys = tagstore.get_group_tag_keys_and_top_values(
                project_ids,
                None,
                environment_ids,
                keys=lookup_keys,
                get_excluded_tags=True,
                **snuba_args)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        if non_tag_lookup_keys:
            tag_keys.update(
                self.handle_non_tag_keys(non_tag_lookup_keys, snuba_args))

        return Response(serialize(tag_keys, request.user))
Beispiel #19
0
    def get(self, request, project, key):
        """
        List a Tag's Values
        ```````````````````

        Return a list of values associated with this key.  The `query`
        parameter can be used to to perform a "contains" match on
        values.
        When paginated can return at most 1000 values.

        :pparam string organization_slug: the slug of the organization.
        :pparam string project_slug: the slug of the project.
        :pparam string key: the tag key to look up.
        :auth: required
        """
        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            environment_id = self._get_environment_id_from_request(
                request, project.organization_id)
        except Environment.DoesNotExist:
            # if the environment doesn't exist then the tag can't possibly exist
            raise ResourceDoesNotExist

        try:
            tagkey = tagstore.get_tag_key(project.id, environment_id,
                                          lookup_key)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        start, end = get_date_range_from_params(request.GET)

        paginator = tagstore.get_tag_value_paginator(
            project.id,
            environment_id,
            tagkey.key,
            start=start,
            end=end,
            query=request.GET.get("query"),
            order_by="-last_seen",
        )

        return self.paginate(
            request=request,
            paginator=paginator,
            on_results=lambda results: serialize(results, request.user),
        )
    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:
            environment_id = self._get_environment_id_from_request(
                request, group.project.organization_id)
        except Environment.DoesNotExist:
            # if the environment doesn't exist then the tag can't possibly exist
            raise ResourceDoesNotExist

        try:
            group_tag_key = tagstore.get_group_tag_key(
                group.project_id, group.id, environment_id, lookup_key)
        except tagstore.GroupTagKeyNotFound:
            raise ResourceDoesNotExist

        if group_tag_key.count is None:
            total_values = tagstore.get_group_tag_value_count(
                group.project_id, group.id, environment_id, lookup_key)
        else:
            total_values = group_tag_key.count

        if group_tag_key.top_values is None:
            top_values = tagstore.get_top_group_tag_values(
                group.project_id, group.id, environment_id, lookup_key, limit=9)
        else:
            top_values = group_tag_key.top_values

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

        return Response(data)
    def get(self, request, project, key):
        """
        List a Tag's Values
        ```````````````````

        Return a list of values associated with this key.  The `query`
        parameter can be used to to perform a "contains" match on
        values.

        :pparam string organization_slug: the slug of the organization.
        :pparam string project_slug: the slug of the project.
        :pparam string key: the tag key to look up.
        :auth: required
        """
        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            environment_id = self._get_environment_id_from_request(request, project.organization_id)
        except Environment.DoesNotExist:
            # if the environment doesn't exist then the tag can't possibly exist
            raise ResourceDoesNotExist

        try:
            tagkey = tagstore.get_tag_key(project.id, environment_id, lookup_key)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        paginator = tagstore.get_tag_value_paginator(
            project.id,
            environment_id,
            tagkey.key,
            query=request.GET.get('query'),
            order_by='-last_seen',
        )

        return self.paginate(
            request=request,
            paginator=paginator,
            on_results=lambda results: serialize(results, request.user),
        )
Beispiel #22
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)
Beispiel #23
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:
            environment_id = self._get_environment_id_from_request(
                request, group.project.organization_id
            )
        except Environment.DoesNotExist:
            # if the environment doesn't exist then the tag can't possibly exist
            raise ResourceDoesNotExist

        try:
            group_tag_key = tagstore.get_group_tag_key(
                group.project_id, group.id, environment_id, lookup_key
            )
        except tagstore.GroupTagKeyNotFound:
            raise ResourceDoesNotExist

        if group_tag_key.count is None:
            group_tag_key.count = tagstore.get_group_tag_value_count(
                group.project_id, group.id, environment_id, lookup_key
            )

        if group_tag_key.top_values is None:
            group_tag_key.top_values = tagstore.get_top_group_tag_values(
                group.project_id, group.id, environment_id, lookup_key
            )

        return Response(serialize(group_tag_key, request.user))
Beispiel #24
0
    def delete(self, request, project, key):
        """
        Remove all occurrences of the given tag key.

            {method} {path}

        """
        if key in PROTECTED_TAG_KEYS:
            return Response(status=403)

        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            from sentry import eventstream

            eventstream_state = eventstream.start_delete_tag(project.id, key)

            deleted = self.get_tag_keys_for_deletion(project.id, lookup_key)

            # NOTE: By sending the `end_delete_tag` message here we are making
            # the assumption that the `delete_tag_key` does its work
            # synchronously. As of this writing the Snuba `delete_tag_key` method
            # is a no-op and this message itself is what causes the deletion to
            # be done downstream.
            eventstream.end_delete_tag(eventstream_state)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        for tagkey in deleted:
            self.create_audit_entry(
                request=request,
                organization=project.organization,
                target_object=getattr(tagkey, "id", None),
                event=AuditLogEntryEvent.TAGKEY_REMOVE,
                data=tagkey.get_audit_log_data(),
            )

        return Response(status=204)
    def delete(self, request, project, key):
        """
        Remove all occurrences of the given tag key.

            {method} {path}

        """
        if key in PROTECTED_TAG_KEYS:
            return Response(status=403)

        lookup_key = tagstore.prefix_reserved_key(key)

        try:
            from sentry import eventstream
            eventstream_state = eventstream.start_delete_tag(project.id, key)

            deleted = tagstore.delete_tag_key(project.id, lookup_key)

            # NOTE: By sending the `end_delete_tag` message here we are making
            # the assumption that the `tagstore.delete_tag_key` does its work
            # synchronously. As of this writing the Snuba `delete_tag_key` method
            # is a no-op and this message itself is what causes the deletion to
            # be done downstream.
            eventstream.end_delete_tag(eventstream_state)
        except tagstore.TagKeyNotFound:
            raise ResourceDoesNotExist

        for tagkey in deleted:
            self.create_audit_entry(
                request=request,
                organization=project.organization,
                target_object=getattr(tagkey, 'id', None),
                event=AuditLogEntryEvent.TAGKEY_REMOVE,
                data=tagkey.get_audit_log_data(),
            )

        return Response(status=204)
    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 = tagstore.get_group_tag_key(group.id, lookup_key)
        except tagstore.GroupTagKeyNotFound:
            raise ResourceDoesNotExist

        total_values = tagstore.get_group_tag_value_count(group.id, lookup_key)
        top_values = tagstore.get_top_group_tag_values(group.id, lookup_key, limit=9)

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

        return Response(data)
Beispiel #27
0
def lookup_tags(keys, **snuba_args):
    tag_keys = []
    non_tag_keys = []

    for key in keys:
        if key in NON_TAG_KEYS:
            non_tag_keys.append(key)
        else:
            tag_keys.append(tagstore.prefix_reserved_key(key))

    if tag_keys:
        top_values = get_top_values(keys=tag_keys, **snuba_args)
    else:
        top_values = []

    if non_tag_keys:
        handle_non_tag_keys(non_tag_keys, top_values, **snuba_args)

    total_count = get_total_value_count(**snuba_args)
    tag_keys = create_tag_objects(keys, total_count, top_values)

    # sort heatmap categories in the same order requested.
    tag_keys = sorted(tag_keys, key=lambda x: keys.index(x.key))
    return tag_keys