コード例 #1
0
 def test_process_does_clear_buffer(self, process):
     group = Group.objects.create(project=Project(id=1))
     columns = {'times_seen': 1}
     filters = {'pk': group.pk}
     self.buf.conn.set('foo', 2)
     self.buf.process(Group, columns, filters)
     self.assertEquals(self.buf.conn.get('foo'), '0')
コード例 #2
0
    def get(self, request):
        org = Organization(id=1, slug="organization", name="My Company")
        project = Project(id=1,
                          organization=org,
                          slug="project",
                          name="My Project")

        event = create_sample_event(project=project,
                                    platform="python",
                                    event_id="595",
                                    timestamp=1452683305)

        group = event.group
        link = absolute_uri("/{}/{}/issues/{}/feedback/".format(
            project.organization.slug, project.slug, group.id))

        return MailPreview(
            html_template="sentry/emails/activity/new-user-feedback.html",
            text_template="sentry/emails/activity/new-user-feedback.txt",
            context={
                "group": group,
                "report": {
                    "name":
                    "Homer Simpson",
                    "email":
                    "*****@*****.**",
                    "comments":
                    "I hit a bug.\n\nI went to https://example.com, hit the any key, and then it stopped working. DOH!",
                },
                "link": link,
                "reason": "are subscribed to this issue",
                "enhanced_privacy": False,
            },
        ).render(request)
コード例 #3
0
    def test_notify_users_does_email(self, _send_mail):
        project = Project(id=1, name='Project Name')

        group = Group()
        group.first_seen = timezone.now()
        group.last_seen = group.first_seen
        group.project = project
        group.id = 2

        event = Event()
        event.group = group
        event.message = 'hello world'
        event.logger = 'root'
        event.project = project
        event.date = group.last_seen

        with self.Settings(SENTRY_URL_PREFIX='http://example.com'):
            p = MailProcessor(send_to=['*****@*****.**'])
            p.notify_users(group, event)

        _send_mail.assert_called_once()
        args, kwargs = _send_mail.call_args
        self.assertEquals(kwargs.get('fail_silently'), False)
        self.assertEquals(kwargs.get('project'), project)
        self.assertEquals(kwargs.get('subject'), u"[Project Name] ERROR: hello world")
コード例 #4
0
ファイル: tests.py プロジェクト: thepearson/sentry
 def test_process_saves_data(self):
     group = Group.objects.create(project=Project(id=1))
     columns = {'times_seen': 1}
     filters = {'pk': group.pk}
     self.buf.process(Group, columns, filters)
     assert Group.objects.get(
         pk=group.pk).times_seen == group.times_seen + 1
コード例 #5
0
    def get(self, request):
        organization = Organization(slug="myorg")
        project = Project(slug="myproject", organization=organization)

        query = SnubaQuery(
            time_window=60, query="transaction:/some/transaction", aggregate="count()"
        )
        alert_rule = AlertRule(id=1, organization=organization, name="My Alert", snuba_query=query)
        incident = Incident(
            id=2,
            identifier=123,
            organization=organization,
            title="Something broke",
            alert_rule=alert_rule,
            status=IncidentStatus.CRITICAL,
        )
        trigger = AlertRuleTrigger(alert_rule=alert_rule)

        context = generate_incident_trigger_email_context(
            project, incident, trigger, TriggerStatus.ACTIVE
        )

        return MailPreview(
            text_template=u"sentry/emails/incidents/trigger.txt",
            html_template=u"sentry/emails/incidents/trigger.html",
            context=context,
        ).render(request)
コード例 #6
0
def loaddata():
    with open('initial_data.json') as data_file:
        structure = json.load(data_file)
    organization = Organization.objects.get(pk=1)
    for record in structure:
        try:
            team = Team.objects.get(name=record['team'],
                                    organization=organization)
        except ObjectDoesNotExist:
            team = Team()
            team.name = record['team']
            team.organization = organization
            team.save()
        try:
            project = Project.objects.get(name=record['project'],
                                          team=team,
                                          organization=organization)
        except ObjectDoesNotExist:
            project = Project()
            project.team = team
            project.name = record['project']
            project.organization = organization
            project.save()
        key = ProjectKey.objects.filter(project=project)[0]
        if 'key' in record:
            parts = record['key'].split(':')
            key.public_key = parts[0]
            if len(parts) > 1:
                key.secret_key = parts[1]
            key.save()
        print 'PROJECT_NAME = "%s"' % (project.name, )
        print 'SENTRY_DSN = "%s"' % (key.get_dsn(), )
        print ''
コード例 #7
0
def new_event(request):
    org = Organization(
        id=1,
        slug='example',
        name='Example',
    )
    team = Team(
        id=1,
        slug='example',
        name='Example',
        organization=org,
    )
    project = Project(
        id=1,
        slug='example',
        name='Example',
        team=team,
        organization=org,
    )
    group = Group(
        id=1,
        project=project,
        message='This is an example event.',
        level=logging.ERROR,
    )

    event = Event(
        id=1,
        project=project,
        group=group,
        message=group.message,
        data=load_data('python'),
    )

    rule = Rule(label="An example rule")

    interface_list = []
    for interface in event.interfaces.itervalues():
        body = interface.to_email_html(event)
        if not body:
            continue
        interface_list.append((interface.get_title(), mark_safe(body)))

    preview = MailPreview(
        html_template='sentry/emails/error.html',
        text_template='sentry/emails/error.html',
        context={
            'rule': rule,
            'group': group,
            'event': event,
            'link': 'http://example.com/link',
            'interfaces': interface_list,
            'tags': event.get_tags(),
            'project_label': project.name,
        },
    )

    return render_to_response('sentry/debug/mail/preview.html', {
        'preview': preview,
    })
コード例 #8
0
ファイル: mail.py プロジェクト: lizardkinggg/getsentry
    def get(self, request):
        org = Organization(id=1, slug="organization", name="My Company")
        project = Project(id=1, organization=org, slug="project", name="My Project")

        group = next(make_group_generator(get_random(request), project))

        data = dict(load_data("python"))
        data["message"] = group.message
        data.pop("logentry", None)

        event_manager = EventManager(data)
        event_manager.normalize()
        data = event_manager.get_data()
        event_type = get_event_type(data)

        event = eventstore.create_event(
            event_id="a" * 32, group_id=group.id, project_id=project.id, data=data.data
        )

        group.message = event.search_message
        group.data = {"type": event_type.key, "metadata": event_type.get_metadata(data)}

        activity = Activity(group=group, project=event.project, **self.get_activity(request, event))

        return render_to_response(
            "sentry/debug/mail/preview.html",
            context={
                "preview": ActivityMailPreview(request, activity),
                "format": request.GET.get("format"),
            },
        )
コード例 #9
0
ファイル: tests.py プロジェクト: jacklme/sentry
 def test_should_notify_excluded(self):
     p = MailProcessor(min_level=None, exclude_loggers=['root'])
     group = Mock(spec=Group)
     group.project = Project()
     group.level = 5
     group.logger = 'root'
     self.assertFalse(p.should_notify(group=group, event=Mock()))
コード例 #10
0
ファイル: tests.py プロジェクト: wangjianweiwei/sentry
 def test_process_saves_data(self):
     group = Group.objects.create(project=Project(id=1))
     columns = {"times_seen": 1}
     filters = {"id": group.id, "project_id": 1}
     self.buf.process(Group, columns, filters)
     assert Group.objects.get(
         id=group.id).times_seen == group.times_seen + 1
コード例 #11
0
 def test_process_does_save_call_with_results(self, process):
     group = Group(project=Project(id=1))
     columns = {'times_seen': 1}
     filters = {'pk': group.pk}
     self.buffer._tnt.insert(self.sentry_space, ('foo', 2, 0L))
     self.buffer.process(Group, columns, filters)
     process.assert_called_once_with(Group, {'times_seen': 2}, filters,
                                     None)
コード例 #12
0
 def test_process_does_clear_buffer(self, process):
     group = Group(project=Project(id=1))
     columns = {'times_seen': 1}
     filters = {'pk': group.pk}
     self.buffer._tnt.insert(self.sentry_space, ('foo', 2, 0L))
     self.buffer.process(Group, columns, filters)
     response = self.buffer._tnt.select(self.sentry_space, ['foo'])
     self.assertEquals(int(response[0][1]), 0)
コード例 #13
0
 def test_process_does_save_call_with_results(self, process):
     group = Group.objects.create(project=Project(id=1))
     columns = {'times_seen': 1}
     filters = {'pk': group.pk}
     self.buf.conn.set('foo', 2)
     self.buf.process(Group, columns, filters)
     process.assert_called_once_with(Group, {'times_seen': 2}, filters,
                                     None)
コード例 #14
0
ファイル: tests.py プロジェクト: rahulchhabria/sentry-fork-rc
 def test_signal_only(self, create_or_update):
     group = Group.objects.create(project=Project(id=1))
     columns = {"times_seen": 1}
     filters = {"id": group.id, "project_id": 1}
     the_date = timezone.now() + timedelta(days=5)
     prev_times_seen = group.times_seen
     self.buf.process(Group, columns, filters, {"last_seen": the_date}, signal_only=True)
     group.refresh_from_db()
     assert group.times_seen == prev_times_seen
コード例 #15
0
 def test_process_saves_extra(self):
     group = Group.objects.create(project=Project(id=1))
     columns = {"times_seen": 1}
     filters = {"id": group.id, "project_id": 1}
     the_date = timezone.now() + timedelta(days=5)
     self.buf.process(Group, columns, filters, {"last_seen": the_date})
     group_ = Group.objects.get(id=group.id)
     assert group_.times_seen == group.times_seen + 1
     assert group_.last_seen == the_date
コード例 #16
0
ファイル: tests.py プロジェクト: xssworm/sentry
 def test_process_saves_extra(self):
     group = Group.objects.create(project=Project(id=1))
     columns = {'times_seen': 1}
     filters = {'pk': group.pk}
     # strip micrseconds because MySQL doesnt seem to handle them correctly
     the_date = (timezone.now() + timedelta(days=5)).replace(microsecond=0)
     self.buf.process(Group, columns, filters, {'last_seen': the_date})
     group_ = Group.objects.get(pk=group.pk)
     assert group_.times_seen == group.times_seen + 1
     assert group_.last_seen.replace(microsecond=0) == the_date
コード例 #17
0
 def test_process_saves_extra(self):
     group = Group.objects.create(project=Project(id=1))
     columns = {'times_seen': 1}
     filters = {'pk': group.pk}
     the_date = (timezone.now() + timedelta(days=5)).replace(microsecond=0)
     self.buf.conn.set('foo', 1)
     self.buf.conn.hset('extra', 'last_seen', pickle.dumps(the_date))
     self.buf.process(Group, columns, filters)
     group_ = Group.objects.get(pk=group.pk)
     self.assertEquals(group_.last_seen.replace(microsecond=0), the_date)
コード例 #18
0
ファイル: test_features.py プロジェクト: pasala91/test
def create_event(data, group_id=123):
    mgr = EventManager(data=data, grouping_config=get_default_grouping_config_dict())
    mgr.normalize()
    data = mgr.get_data()

    evt = eventstore.create_event(data=data)
    evt.project = project = Project(id=123)
    evt.group = Group(id=group_id, project=project)

    return evt
コード例 #19
0
def new_note(request):
    org = Organization(
        id=1,
        slug='example',
        name='Example',
    )
    team = Team(
        id=1,
        slug='example',
        name='Example',
        organization=org,
    )
    project = Project(
        id=1,
        slug='example',
        name='Example',
        team=team,
        organization=org,
    )
    group = Group(
        id=1,
        project=project,
        message='This is an example event.',
    )
    event = Event(
        id=1,
        project=project,
        group=group,
        message=group.message,
        data=load_data('python'),
    )
    note = Activity(
        group=event.group,
        event=event,
        project=event.project,
        type=Activity.NOTE,
        user=request.user,
        data={'text': 'This is an example note!'},
    )

    preview = MailPreview(
        html_template='sentry/emails/activity/note.html',
        text_template='sentry/emails/activity/note.txt',
        context={
            'data': note.data,
            'author': note.user,
            'date': note.datetime,
            'group': group,
            'link': group.get_absolute_url(),
        },
    )

    return render_to_response('sentry/debug/mail/preview.html', {
        'preview': preview,
    })
コード例 #20
0
 def get(self, request):
     from sentry.plugins.sentry_mail.activity.new_processing_issues import summarize_issues
     org = Organization(id=1, slug='organization', name='My Company')
     project = Project(
         id=1,
         organization=org,
         slug='project',
         name='My Project',
     )
     return MailPreview(
         html_template='sentry/emails/activity/new_processing_issues.html',
         text_template='sentry/emails/activity/new_processing_issues.txt',
         context={
             'project':
             project,
             'reason':
             GroupSubscriptionReason.descriptions[
                 GroupSubscriptionReason.processing_issue],
             'issues':
             summarize_issues([
                 {
                     'data': {
                         'image_arch': 'arm64',
                         'image_path':
                         '/var/containers/Bundle/Application/FB14D416-DE4E-4224-9789-6B88E9C42601/CrashProbeiOS.app/CrashProbeiOS',
                         'image_uuid':
                         'a2df1794-e0c7-371c-baa4-93eac340a78a'
                     },
                     'object': 'dsym:a2df1794-e0c7-371c-baa4-93eac340a78a',
                     'scope': 'native',
                     'type': 'native_missing_dsym'
                 },
                 {
                     'data': {
                         'image_arch': 'arm64',
                         'image_path':
                         '/var/containers/Bundle/Application/FB14D416-DE4E-4224-9789-6B88E9C42601/CrashProbeiOS.app/libCrashProbeiOS',
                         'image_uuid':
                         '12dc1b4c-a01b-463f-ae88-5cf0c31ae680'
                     },
                     'object': 'dsym:12dc1b4c-a01b-463f-ae88-5cf0c31ae680',
                     'scope': 'native',
                     'type': 'native_bad_dsym'
                 },
             ]),
             'reprocessing_active':
             self.reprocessing_active,
             'info_url':
             absolute_uri(
                 '/settings/{}/projects/{}/processing-issues/'.format(
                     org.slug,
                     project.slug,
                 )),
         },
     ).render(request)
コード例 #21
0
    def get(self, request):
        org = Organization(
            id=1,
            slug='organization',
            name='My Company',
        )
        project = Project(
            id=1,
            organization=org,
            slug='project',
            name='My Project',
        )

        group = next(make_group_generator(
            get_random(request),
            project,
        ), )

        data = dict(load_data('python'))
        data['message'] = group.message
        data.pop('logentry', None)

        event_manager = EventManager(data)
        event_manager.normalize()
        data = event_manager.get_data()
        event_type = event_manager.get_event_type()

        group.message = event_manager.get_search_message()
        group.data = {
            'type': event_type.key,
            'metadata': event_type.get_metadata(data),
        }

        event = Event(id=1,
                      project=project,
                      message=event_manager.get_search_message(),
                      group=group,
                      datetime=datetime(2016,
                                        6,
                                        13,
                                        3,
                                        8,
                                        24,
                                        tzinfo=timezone.utc),
                      data=event_manager.get_data())

        activity = Activity(group=event.group,
                            project=event.project,
                            **self.get_activity(request, event))

        return render_to_response(
            'sentry/debug/mail/preview.html', {
                'preview': ActivityMailPreview(request, activity),
                'format': request.GET.get('format'),
            })
コード例 #22
0
    def get(self, request: Request) -> Response:
        org = Organization(id=1, slug="petal", name="Petal")
        project = Project(id=1,
                          slug="nodejs",
                          name="Node.js",
                          organization=org)
        user = User(name="Nisanthan")
        OrganizationMember(organization=org, user=user, role="admin")
        notification = AutoSyncNotification(project)

        return render_preview_email_for_notification(notification, user)
コード例 #23
0
ファイル: tests.py プロジェクト: jacklme/sentry
    def test_should_notify_match(self):
        p = MailProcessor(min_level=None)
        group = Mock(spec=Group)
        group.level = 5
        group.project = Project()
        group.logger = 'root'
        event = Mock()
        event.data = {}
        self.assertTrue

        (p.should_notify(group=group, event=event))
コード例 #24
0
def assigned(request):

    org = Organization(
        id=1,
        slug='example',
        name='Example',
    )
    team = Team(
        id=1,
        slug='example',
        name='Example',
        organization=org,
    )
    project = Project(
        id=1,
        slug='example',
        name='Example',
        team=team,
        organization=org,
    )
    group = Group(
        id=1,
        project=project,
        message='This is an example event.',
    )
    event = Event(
        id=1,
        project=project,
        group=group,
        message=group.message,
        data=load_data('python'),
    )
    assigned = Activity(
        group=event.group,
        project=event.project,
        type=Activity.ASSIGNED,
        user=request.user,
        data={
            'text': 'This is an example note!',
            'assignee': '*****@*****.**'
        },
    )

    return MailPreview(
        html_template='sentry/emails/activity/assigned.html',
        text_template='sentry/emails/activity/assigned.txt',
        context={
            'data': assigned.data,
            'author': assigned.user,
            'date': assigned.datetime,
            'group': group,
            'link': group.get_absolute_url(),
        },
    ).render()
コード例 #25
0
def sentry_create_project(team, name):
    model = sentry_find_project(team, name)
    existing = model is not None
    if not existing:
        model = Project()
        model.name = name
        model.team = team
        model.organization = team.organization
        model.save()

    return model, existing
コード例 #26
0
    def get(self, request):
        org = Organization(
            id=1,
            slug='organization',
            name='My Company',
        )
        team = Team(
            id=1,
            slug='team',
            name='My Team',
            organization=org,
        )
        project = Project(
            id=1,
            organization=org,
            team=team,
            slug='project',
            name='My Project',
        )
        release = Release(
            project=project,
            version=sha1(uuid4().hex).hexdigest(),
        )

        release_link = absolute_uri(
            reverse('sentry-release-details',
                    kwargs={
                        'organization_slug': org.slug,
                        'project_id': project.slug,
                        'version': release.version,
                    }))

        project_link = absolute_uri(
            reverse('sentry-stream',
                    kwargs={
                        'organization_slug': org.slug,
                        'project_id': project.slug,
                    }))

        preview = MailPreview(
            html_template='sentry/emails/activity/release.html',
            text_template='sentry/emails/activity/release.txt',
            context={
                'release': release,
                'project': project,
                'release_link': release_link,
                'project_link': project_link,
            },
        )

        return render_to_response('sentry/debug/mail/preview.html', {
            'preview': preview,
        })
コード例 #27
0
    def get(self, request):
        from sentry.notifications.activity.new_processing_issues import summarize_issues

        org = Organization(id=1, slug="organization", name="My Company")
        project = Project(id=1,
                          organization=org,
                          slug="project",
                          name="My Project")
        return MailPreview(
            html_template="sentry/emails/activity/new_processing_issues.html",
            text_template="sentry/emails/activity/new_processing_issues.txt",
            context={
                "project":
                project,
                "reason":
                GroupSubscriptionReason.descriptions[
                    GroupSubscriptionReason.processing_issue],
                "issues":
                summarize_issues([
                    {
                        "data": {
                            "image_arch": "arm64",
                            "image_path":
                            "/var/containers/Bundle/Application/FB14D416-DE4E-4224-9789-6B88E9C42601/CrashProbeiOS.app/CrashProbeiOS",
                            "image_uuid":
                            "a2df1794-e0c7-371c-baa4-93eac340a78a",
                        },
                        "object": "dsym:a2df1794-e0c7-371c-baa4-93eac340a78a",
                        "scope": "native",
                        "type": "native_missing_dsym",
                    },
                    {
                        "data": {
                            "image_arch": "arm64",
                            "image_path":
                            "/var/containers/Bundle/Application/FB14D416-DE4E-4224-9789-6B88E9C42601/CrashProbeiOS.app/libCrashProbeiOS",
                            "image_uuid":
                            "12dc1b4c-a01b-463f-ae88-5cf0c31ae680",
                        },
                        "object": "dsym:12dc1b4c-a01b-463f-ae88-5cf0c31ae680",
                        "scope": "native",
                        "type": "native_bad_dsym",
                    },
                ]),
                "reprocessing_active":
                self.reprocessing_active,
                "info_url":
                absolute_uri(
                    f"/settings/{org.slug}/projects/{project.slug}/processing-issues/"
                ),
            },
        ).render(request)
コード例 #28
0
    def get(self, request: Request) -> Response:
        requester_name = request.GET.get("requester_name", "Requester")
        recipient_name = request.GET.get("recipient_name", "Recipient")

        org = Organization(id=1, slug="petal", name="Petal")
        project = Project(id=1, slug="nodejs", name="Node.js", organization=org)
        user = User(name=recipient_name)
        member = OrganizationMember(organization=org, user=user, role="admin")
        preview = MailPreviewAdapter(
            **get_codeowners_request_builder_args(project, member, requester_name)
        )

        return render_to_response("sentry/debug/mail/preview.html", {"preview": preview})
コード例 #29
0
ファイル: test_features.py プロジェクト: pasala91/test
def test_similarity_extract_fingerprinting(fingerprint_input, insta_snapshot):
    similarity = sentry.similarity.features2

    _, evt = fingerprint_input.create_event(get_default_grouping_config_dict())
    evt.project = project = Project(id=123)
    evt.group = Group(id=123, project=project)

    snapshot = []
    for label, features in similarity.extract(evt).items():
        for feature in features:
            snapshot.append("{}: {}".format(":".join(label), json.dumps(feature, sort_keys=True)))

    insta_snapshot("\n".join(sorted(snapshot)))
コード例 #30
0
    def test_get_groups_for_query(self):
        organization = Organization(id=1,
                                    slug="organization",
                                    name="My Company")
        project_0 = Project(id=100, organization=organization)
        project_1 = Project(id=101, organization=organization)
        project_2 = Project(id=102, organization=organization)

        groups_by_project = {
            project_0:
            {Group(id=10, project=project_0),
             Group(id=11, project=project_0)},
            project_1: {Group(id=12, project=project_0)},
            project_2: {Group(id=13, project=project_0)},
        }

        notification_settings_by_scope = {
            NotificationScopeType.PROJECT: {
                project_0.id: {
                    ExternalProviders.SLACK:
                    NotificationSettingOptionValues.NEVER,
                    ExternalProviders.EMAIL:
                    NotificationSettingOptionValues.ALWAYS,
                },
                project_1.id: {
                    ExternalProviders.SLACK:
                    NotificationSettingOptionValues.NEVER,
                    ExternalProviders.EMAIL:
                    NotificationSettingOptionValues.NEVER,
                },
            }
        }
        query_groups = get_groups_for_query(groups_by_project,
                                            notification_settings_by_scope,
                                            user=self.user)
        assert {group.id for group in query_groups} == {10, 11, 13}