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')
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)
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")
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
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)
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 ''
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, })
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"), }, )
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()))
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
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)
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)
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)
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
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
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
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)
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
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, })
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)
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'), })
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)
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))
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()
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
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, })
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)
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})
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)))
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}