Beispiel #1
0
    def get(self, request, project):
        try:
            environment_id = self._get_environment_id_from_request(request, project.organization_id)
        except Environment.DoesNotExist:
            tag_keys = []
        else:
            tag_keys = sorted(
                tagstore.get_tag_keys(
                    project.id,
                    environment_id,
                ),
                key=lambda x: x.key)

        data = []
        for tag_key in tag_keys:
            data.append(
                {
                    'id': six.text_type(tag_key.id),
                    'key': tagstore.get_standardized_key(tag_key.key),
                    'name': tagstore.get_tag_key_label(tag_key.key),
                    'uniqueValues': tag_key.values_seen,
                    'canDelete': tag_key.key not in PROTECTED_TAG_KEYS,
                }
            )

        return Response(data)
Beispiel #2
0
    def get_group_tag_keys_and_top_values(self, project_id, group_id, environment_id, user=None):
        from sentry import tagstore
        start, end = self.get_time_range()
        filters = {
            'project_id': [project_id],
            'environment': [environment_id],
            'issue': [group_id],
        }
        aggregations = [
            ['count()', '', 'count'],
            ['topK(10)', 'tags_value', 'top'],
            ['uniq', 'tags_value', 'uniq'],
        ]
        conditions = [
            ['tags_value', 'IS NOT NULL', None],
        ]
        results = snuba.query(start, end, ['tags_key'], conditions, filters, aggregations)

        return [{
            'id': key,
            'name': tagstore.get_tag_key_label(key),
            'key': tagstore.get_standardized_key(key),
            'uniqueValues': res['uniq'],
            'totalValues': res['count'],
            'topValues': [{
                'id': val,
                'name': tagstore.get_tag_value_label(key, val),
                'key': tagstore.get_standardized_key(key),
                'value': val,
            } for val in res['top']],
        } for key, res in six.iteritems(results)]
Beispiel #3
0
    def get(self, request, project):
        try:
            environment_id = self._get_environment_id_from_request(request, project.organization_id)
        except Environment.DoesNotExist:
            tag_keys = []
        else:
            tag_keys = sorted(
                tagstore.get_tag_keys(
                    project.id,
                    environment_id,
                    # We might be able to stop including these values, but this
                    # is a pretty old endpoint, so concerned about breaking
                    # existing api consumers.
                    include_values_seen=True,
                ),
                key=lambda x: x.key)

        data = []
        for tag_key in tag_keys:
            data.append(
                {
                    'key': tagstore.get_standardized_key(tag_key.key),
                    'name': tagstore.get_tag_key_label(tag_key.key),
                    'uniqueValues': tag_key.values_seen,
                    'canDelete': tag_key.key not in PROTECTED_TAG_KEYS,
                }
            )

        return Response(data)
Beispiel #4
0
    def _get_tags(self, event):
        tag_list = event.get_tags()
        if not tag_list:
            return ()

        return ((tagstore.get_tag_key_label(k), tagstore.get_tag_value_label(k, v))
                for k, v in tag_list)
Beispiel #5
0
    def get(self, request, group):
        group_tag_keys = tagstore.get_group_tag_keys(group.id)

        # O(N) db access
        data = []
        all_top_values = []
        for group_tag_key in group_tag_keys:
            total_values = tagstore.get_group_tag_value_count(group.id, group_tag_key.key)
            top_values = tagstore.get_top_group_tag_values(group.id, group_tag_key.key, limit=10)

            all_top_values.extend(top_values)

            data.append(
                {
                    'id': six.text_type(group_tag_key.id),
                    'key': tagstore.get_standardized_key(group_tag_key.key),
                    'name': tagstore.get_tag_key_label(group_tag_key.key),
                    'uniqueValues': group_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 #6
0
    def serialize(self, obj, attrs, user):
        from sentry import tagstore

        return {
            'key': tagstore.get_standardized_key(obj.key),
            'name': tagstore.get_tag_key_label(obj.key),
            'uniqueValues': obj.values_seen,
        }
Beispiel #7
0
    def get_attrs(self, item_list, user):
        from sentry import tagstore

        result = {}
        for item in item_list:
            key = tagstore.get_standardized_key(item.key)
            result[item] = {
                'name': tagstore.get_tag_key_label(item.key),
                'key': key,
            }

        return result
Beispiel #8
0
    def serialize(self, obj, attrs, user):
        from sentry import tagstore

        output = {
            'key': tagstore.get_standardized_key(obj.key),
            'name': tagstore.get_tag_key_label(obj.key),
            'uniqueValues': obj.values_seen,
        }
        if obj.count is not None:
            output['totalValues'] = obj.count
        if obj.top_values is not None:
            output['topValues'] = serialize(obj.top_values, user)
        return output
Beispiel #9
0
    def get_tags(self):
        if not hasattr(self, '_tag_cache'):
            group_tags = [gtk.key for gtk in tagstore.get_group_tag_keys(self.id)]

            results = []
            for key in group_tags:
                results.append({
                    'key': key,
                    'label': tagstore.get_tag_key_label(key),
                })

            self._tag_cache = sorted(results, key=lambda x: x['label'])

        return self._tag_cache
Beispiel #10
0
    def get(self, request, project):
        tag_keys = sorted(tagstore.get_tag_keys(project.id), key=lambda x: x.key)

        data = []
        for tag_key in tag_keys:
            data.append(
                {
                    'id': six.text_type(tag_key.id),
                    'key': tagstore.get_standardized_key(tag_key.key),
                    'name': tagstore.get_tag_key_label(tag_key.key),
                    'uniqueValues': tag_key.values_seen,
                }
            )

        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:
            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)
Beispiel #12
0
    def get_group_tag_keys_and_top_values(self,
                                          project_id,
                                          group_id,
                                          environment_id,
                                          user=None):
        from sentry import tagstore
        start, end = self.get_time_range()
        filters = {
            'project_id': [project_id],
            'environment': [environment_id],
            'issue': [group_id],
        }
        aggregations = [
            ['count()', '', 'count'],
            ['topK(10)', 'tags_value', 'top'],
            ['uniq', 'tags_value', 'uniq'],
        ]
        conditions = [
            ['tags_value', 'IS NOT NULL', None],
        ]
        results = snuba.query(start, end, ['tags_key'], conditions, filters,
                              aggregations)

        return [{
            'id':
            key,
            'name':
            tagstore.get_tag_key_label(key),
            'key':
            tagstore.get_standardized_key(key),
            'uniqueValues':
            res['uniq'],
            'totalValues':
            res['count'],
            'topValues': [{
                'id': val,
                'name': tagstore.get_tag_value_label(key, val),
                'key': tagstore.get_standardized_key(key),
                'value': val,
            } for val in res['top']],
        } for key, res in six.iteritems(results)]
Beispiel #13
0
    def get(self, request, group):
        try:
            environment_id = self._get_environment_id_from_request(
                request, group.project.organization_id)
        except Environment.DoesNotExist:
            group_tag_keys = []
        else:
            group_tag_keys = tagstore.get_group_tag_keys(
                group.id, environment_id)

        # O(N) db access
        data = []
        all_top_values = []
        for group_tag_key in group_tag_keys:
            total_values = tagstore.get_group_tag_value_count(
                group.id, environment_id, group_tag_key.key)
            top_values = tagstore.get_top_group_tag_values(group.id,
                                                           environment_id,
                                                           group_tag_key.key,
                                                           limit=10)

            all_top_values.extend(top_values)

            data.append({
                'id': six.text_type(group_tag_key.id),
                'key': tagstore.get_standardized_key(group_tag_key.key),
                'name': tagstore.get_tag_key_label(group_tag_key.key),
                'uniqueValues': group_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 #14
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 = 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 #15
0
    def get(self, request, project):
        try:
            environment_id = self._get_environment_id_from_request(
                request, project.organization_id)
        except Environment.DoesNotExist:
            tag_keys = []
        else:
            tag_keys = sorted(tagstore.get_tag_keys(
                project.id,
                environment_id,
            ),
                              key=lambda x: x.key)

        data = []
        for tag_key in tag_keys:
            data.append({
                'id': six.text_type(tag_key.id),
                'key': tagstore.get_standardized_key(tag_key.key),
                'name': tagstore.get_tag_key_label(tag_key.key),
                'uniqueValues': tag_key.values_seen,
            })

        return Response(data)
Beispiel #16
0
    def get(self, request, group):
        grouptagkeys = [
            gtk.key for gtk in tagstore.get_group_tag_keys(group.id)
        ]

        tag_keys = tagstore.get_tag_keys(group.project_id, grouptagkeys)

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

            all_top_values.extend(top_values)

            data.append({
                'id': six.text_type(tag_key.id),
                'key': tagstore.get_standardized_key(tag_key.key),
                'name': tagstore.get_tag_key_label(tag_key.key),
                '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
        """
        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 #18
0
    def get_label(self):
        from sentry import tagstore

        return tagstore.get_tag_key_label(self.key)
Beispiel #19
0
    def notify(self, notification, raise_exception=None):
        """
        notify
        Send Event Notifications
        """
        event = notification.event
        group = event.group
        project = group.project

        # Make sure we're configured
        if not self.is_configured(project):
            return

        webhook_url = self.get_option('webhook_url', project)
        project_name = project.get_full_name().encode('utf-8')
        notification_link = self.create_markdown_link(
            'Click Here',
            self.add_notification_referrer_param(group.get_absolute_url()))

        try:
            # Sentry 9
            title = event.message_short.encode('utf-8')
            error_message = event.error().encode('utf-8')
        except AttributeError:
            # Sentry 10
            title = event.title.encode('utf-8')
            error_message = event.message.encode('utf-8')

        message_facts = []

        message_facts.append({'name': 'Project', 'value': project_name})

        if error_message:
            message_facts.append({'name': 'Error', 'value': error_message})

        if group.times_seen:
            message_facts.append({
                'name': 'Times Seen',
                'value': 'Seen %s Times' % group.times_seen
            })

        if group.culprit and title != group.culprit:
            message_facts.append({
                'name': 'Culprit',
                'value': group.culprit.encode('utf-8')
            })

        message_object = {
            'sections': [{
                'activityTitle': '[%s] %s' % (project_name, title),
                'activityText':
                '%s to View this Event in Sentry' % notification_link,
                'facts': message_facts
            }],
            '@type':
            'MessageCard',
            'summary':
            '[%s] %s' % (project_name, title)
        }

        if self.get_option('show_tags', project):
            tags = []
            try:
                # Sentry 9
                sentry_tags = event.get_tags()
            except AttributeError:
                # Sentry 10
                sentry_tags = event.tags
            if sentry_tags:
                sentry_tag_tuples = ((tagstore.get_tag_key_label(tagname),
                                      tagstore.get_tag_value_label(
                                          tagname, tagvalue))
                                     for tagname, tagvalue in sentry_tags)
                for tag_name, tag_value in sentry_tag_tuples:
                    tags.append({
                        'name': tag_name.encode('utf-8'),
                        'value': tag_value.encode('utf-8')
                    })
                section = {
                    'activityTitle': 'Tags on Event',
                    'activityText':
                    'The following Tags were attached to the Event',
                    'facts': tags
                }
                message_object['sections'].append(section)

        return http.safe_urlopen(webhook_url,
                                 method='POST',
                                 data=json.dumps(message_object))
Beispiel #20
0
    def get_label(self):
        from sentry import tagstore

        return tagstore.get_tag_key_label(self.key)