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