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