def test_integration(self, has_feature): Project.objects.all().delete() now = datetime(2016, 9, 12, tzinfo=pytz.utc) has_feature.side_effect = lambda name, *a, **k: { 'organizations:reports:deliver': True, 'organizations:reports:prepare': True, }.get(name, False) project = self.create_project( organization=self.organization, team=self.team, ) tsdb.incr( tsdb.models.project, project.id, now - timedelta(days=1), ) member_set = set(project.team.member_set.all()) with self.tasks(): prepare_reports(timestamp=to_timestamp(now)) assert len(mail.outbox) == len(member_set) == 1 message = mail.outbox[0] assert self.organization.name in message.subject
def test_simple(self): self.login_as(user=self.user) project = self.create_project() group1 = self.create_group(project=project) group2 = self.create_group(project=project) url = u'/api/0/projects/{}/{}/issues/stats/'.format( project.organization.slug, project.slug, ) response = self.client.get('%s?id=%s&id=%s' % (url, group1.id, group2.id), format='json') tsdb.incr(tsdb.models.group, group1.id, count=3) response = self.client.get('%s?id=%s&id=%s' % (url, group1.id, group2.id), format='json') assert response.status_code == 200, response.content assert len(response.data) == 2 assert six.text_type(group1.id) in response.data assert six.text_type(group2.id) in response.data group_data = response.data[six.text_type(group1.id)] assert group_data[-1][1] == 3, response.data for point in group_data[:-1]: assert point[1] == 0 assert len(group_data) == 24
def test_integration(self): Project.objects.all().delete() now = datetime(2016, 9, 12, tzinfo=pytz.utc) project = self.create_project( organization=self.organization, team=self.team, date_added=now - timedelta(days=90), ) tsdb.incr( tsdb.models.project, project.id, now - timedelta(days=1), ) member_set = set(project.team.member_set.all()) with self.tasks(): prepare_reports(timestamp=to_timestamp(now)) assert len(mail.outbox) == len(member_set) == 1 message = mail.outbox[0] assert self.organization.name in message.subject
def _incr_internal(key, amount): from sentry.app import tsdb sample_rate = settings.SENTRY_METRICS_SAMPLE_RATE if _should_sample(): amount = _sampled_value(amount) tsdb.incr(tsdb.models.internal, key, count=amount)
def test_simple(self): self.login_as(user=self.user) project = self.create_project() group1 = self.create_group(project=project) group2 = self.create_group(project=project) url = reverse('sentry-api-0-project-group-stats', kwargs={ 'organization_slug': project.organization.slug, 'project_slug': project.slug, }) response = self.client.get('%s?id=%s&id=%s' % (url, group1.id, group2.id), format='json') tsdb.incr(tsdb.models.group, group1.id, count=3) response = self.client.get('%s?id=%s&id=%s' % (url, group1.id, group2.id), format='json') assert response.status_code == 200, response.content assert len(response.data) == 2 assert str(group1.id) in response.data assert str(group2.id) in response.data group_data = response.data[str(group1.id)] assert group_data[-1][1] == 3, response.data for point in group_data[:-1]: assert point[1] == 0 assert len(group_data) == 24
def test_integration(self): Project.objects.all().delete() now = datetime(2016, 9, 12, tzinfo=pytz.utc) project = self.create_project( organization=self.organization, team=self.team, date_added=now - timedelta(days=90), ) tsdb.incr( tsdb.models.project, project.id, now - timedelta(days=1), ) member_set = set(project.team.member_set.all()) with self.tasks(), \ mock.patch.object(tsdb, 'get_earliest_timestamp') as get_earliest_timestamp: # Ensure ``get_earliest_timestamp`` is relative to the fixed # "current" timestamp -- this prevents filtering out data points # that would be considered expired relative to the *actual* current # timestamp. get_earliest_timestamp.return_value = to_timestamp(now - timedelta(days=60)) prepare_reports(timestamp=to_timestamp(now)) assert len(mail.outbox) == len(member_set) == 1 message = mail.outbox[0] assert self.organization.name in message.subject
def test_simple(self): self.login_as(user=self.user) group1 = self.create_group() group2 = self.create_group() url = reverse('sentry-api-0-group-stats', kwargs={ 'group_id': group1.id, }) response = self.client.get(url, format='json') assert response.status_code == 200, response.content for point in response.data: assert point[1] == 0 assert len(response.data) == 24 tsdb.incr(tsdb.models.group, group1.id, count=3) tsdb.incr(tsdb.models.group, group2.id, count=5) response = self.client.get(url, format='json') assert response.status_code == 200, response.content assert response.data[-1][1] == 3, response.data for point in response.data[:-1]: assert point[1] == 0 assert len(response.data) == 24
def _incr_internal(key, instance=None, tags=None, amount=1): from sentry.app import tsdb if _should_sample(): amount = _sampled_value(amount) if instance: full_key = '{}.{}'.format(key, instance) else: full_key = key tsdb.incr(tsdb.models.internal, full_key, count=amount)
def _incr_internal(key, instance=None, tags=None, amount=1): from sentry.app import tsdb sample_rate = settings.SENTRY_METRICS_SAMPLE_RATE if _should_sample(): amount = _sampled_value(amount) if instance: full_key = '{}.{}'.format(key, instance) else: full_key = key tsdb.incr(tsdb.models.internal, full_key, count=amount)
def test_more_than_zero(self): event = self.get_event() rule = self.get_rule({ 'interval': Interval.ONE_MINUTE, 'value': '0', }) self.assertDoesNotPass(rule, event) rule.clear_cache(event) tsdb.incr(tsdb.models.group, event.group_id, count=1) self.assertPasses(rule, event)
def incr(key, amount=1): from sentry.app import tsdb sample_rate = settings.SENTRY_METRICS_SAMPLE_RATE statsd.incr(_get_key(key), amount, rate=sample_rate) if sample_rate >= 1 or random() >= sample_rate: if sample_rate < 1: amount = int(amount * (1.0 / sample_rate)) tsdb.incr(tsdb.models.internal, key, count=amount)
def test_doesnt_send_consecutive(self): event = self.get_event() value = 10 rule = self.get_rule({ 'interval': Interval.ONE_HOUR, 'value': six.text_type(value), }) self.assertDoesNotPass(rule, event) rule.clear_cache(event) tsdb.incr(tsdb.models.group, event.group_id, count=value + 1) self.assertPasses(rule, event) self.assertDoesNotPass(rule, event, rule_last_active=timezone.now())
def test_simple(self): self.login_as(user=self.user) org = self.create_organization(owner=self.user, name='baz') tsdb.incr(tsdb.models.organization_total_received, org.id, count=3) url = reverse('sentry-api-0-organization-stats', args=[org.slug]) response = self.client.get(url, format='json') assert response.status_code == 200, response.content assert response.data[-1][1] == 3, response.data for point in response.data[:-1]: assert point[1] == 0 assert len(response.data) == 24
def _incr_internal(key, instance=None, tags=None, amount=1): from sentry.app import tsdb if _should_sample(): amount = _sampled_value(amount) if instance: full_key = '{}.{}'.format(key, instance) else: full_key = key try: tsdb.incr(tsdb.models.internal, full_key, count=amount) except Exception: logger = logging.getLogger('sentry.errors') logger.exception('Unable to incr internal metric')
def repair_tsdb_data(caches, project, events): counters, sets, frequencies = collect_tsdb_data(caches, project, events) for timestamp, data in counters.items(): for model, keys in data.items(): for (key, environment_id), value in keys.items(): tsdb.incr(model, key, timestamp, value, environment_id=environment_id) for timestamp, data in sets.items(): for model, keys in data.items(): for (key, environment_id), values in keys.items(): # TODO: This should use `record_multi` rather than `record`. tsdb.record(model, key, values, timestamp, environment_id=environment_id) for timestamp, data in frequencies.items(): tsdb.record_frequency_multi(data.items(), timestamp)
def test_doesnt_send_consecutive(self): event = self.get_event() rule = self.get_rule({ 'interval': Interval.ONE_HOUR, 'value': '10', }) tsdb.incr(tsdb.models.group, event.group_id, count=11) rule = self.get_rule({ 'interval': Interval.ONE_HOUR, 'value': '10', }) self.assertPasses(rule, event) self.assertDoesNotPass(rule, event, rule_last_active=timezone.now())
def test_one_hour(self): event = self.get_event() rule = self.get_rule({ 'interval': Interval.ONE_HOUR, 'value': '10', }) self.assertDoesNotPass(rule, event) tsdb.incr(tsdb.models.group, event.group_id, count=11) rule.clear_cache(event) rule = self.get_rule({ 'interval': Interval.ONE_HOUR, 'value': '10', }) self.assertPasses(rule, event)
def test_simple(self): self.login_as(user=self.user) group1 = self.create_group() group2 = self.create_group() tsdb.incr(tsdb.models.group, group1.id, count=3) tsdb.incr(tsdb.models.group, group2.id, count=5) url = reverse('sentry-api-0-group-stats', kwargs={ 'group_id': group1.id, }) response = self.client.get(url, format='json') assert response.status_code == 200, response.content assert response.data[-1][1] == 3, response.data for point in response.data[:-1]: assert point[1] == 0 assert len(response.data) == 24
def test_simple(self): self.login_as(user=self.user) project1 = self.create_project(owner=self.user, name='foo') project2 = self.create_project(owner=self.user, name='bar') tsdb.incr(tsdb.models.project, project1.id, count=3) tsdb.incr(tsdb.models.project, project2.id, count=5) url = reverse('sentry-api-0-project-stats', kwargs={ 'project_id': project1.id, }) response = self.client.get(url, format='json') assert response.status_code == 200, response.content assert response.data[-1][1] == 3, response.data for point in response.data[:-1]: assert point[1] == 0 assert len(response.data) == 24
def test_simple(self): self.login_as(user=self.user) project1 = self.create_project(name="foo") project2 = self.create_project(name="bar") tsdb.incr(tsdb.models.project_total_received, project1.id, count=3) tsdb.incr(tsdb.models.project_total_received, project2.id, count=5) url = reverse( "sentry-api-0-project-stats", kwargs={"organization_slug": project1.organization.slug, "project_slug": project1.slug}, ) response = self.client.get(url, format="json") assert response.status_code == 200, response.content assert response.data[-1][1] == 3, response.data for point in response.data[:-1]: assert point[1] == 0 assert len(response.data) == 24
def test_simple(self): self.login_as(user=self.user) project1 = self.create_project(name='foo') project2 = self.create_project(name='bar') tsdb.incr(tsdb.models.project, project1.id, count=3) tsdb.incr(tsdb.models.project, project2.id, count=5) url = reverse('sentry-api-0-project-stats', kwargs={ 'organization_slug': project1.organization.slug, 'project_slug': project1.slug, }) response = self.client.get(url, format='json') assert response.status_code == 200, response.content assert response.data[-1][1] == 3, response.data for point in response.data[:-1]: assert point[1] == 0 assert len(response.data) == 24
def test_simple(self): self.login_as(user=self.user) team = self.create_team(owner=self.user, name='foo') project_1 = self.create_project(team=team, name='a') project_2 = self.create_project(team=team, name='b') team_2 = self.create_team(owner=self.user, name='bar') project_3 = self.create_project(team=team_2, name='c') tsdb.incr(tsdb.models.project, project_1.id, count=3) tsdb.incr(tsdb.models.project, project_2.id, count=5) tsdb.incr(tsdb.models.project, project_3.id, count=10) url = reverse('sentry-api-0-team-stats', kwargs={ 'organization_slug': team.organization.slug, 'team_slug': team.slug, }) response = self.client.get(url, format='json') assert response.status_code == 200, response.content assert response.data[-1][1] == 8, response.data for point in response.data[:-1]: assert point[1] == 0 assert len(response.data) == 24
def test_simple(self): self.login_as(user=self.user) group1 = self.create_group() group2 = self.create_group() url = '/api/0/issues/{}/stats/'.format(group1.id) response = self.client.get(url, format='json') assert response.status_code == 200, response.content for point in response.data: assert point[1] == 0 assert len(response.data) == 24 tsdb.incr(tsdb.models.group, group1.id, count=3) tsdb.incr(tsdb.models.group, group2.id, count=5) response = self.client.get(url, format='json') assert response.status_code == 200, response.content assert response.data[-1][1] == 3, response.data for point in response.data[:-1]: assert point[1] == 0 assert len(response.data) == 24
def test_simple(self): self.login_as(user=self.user) project = self.create_project() group1 = self.create_group(project=project) group2 = self.create_group(project=project) url = f"/api/0/projects/{project.organization.slug}/{project.slug}/issues/stats/" response = self.client.get(f"{url}?id={group1.id}&id={group2.id}", format="json") tsdb.incr(tsdb.models.group, group1.id, count=3) response = self.client.get(f"{url}?id={group1.id}&id={group2.id}", format="json") assert response.status_code == 200, response.content assert len(response.data) == 2 assert str(group1.id) in response.data assert str(group2.id) in response.data group_data = response.data[str(group1.id)] assert group_data[-1][1] == 3, response.data for point in group_data[:-1]: assert point[1] == 0 assert len(group_data) == 24
def test_simple(self): self.login_as(user=self.user) team = self.create_team(owner=self.user, name='foo') project_1 = self.create_project(team=team, name='a') project_2 = self.create_project(team=team, name='b') team_2 = self.create_team(owner=self.user, name='bar') project_3 = self.create_project(team=team_2, name='b') tsdb.incr(tsdb.models.project, project_1.id, count=3) tsdb.incr(tsdb.models.project, project_2.id, count=5) tsdb.incr(tsdb.models.project, project_3.id, count=10) url = reverse('sentry-api-0-team-stats', kwargs={ 'team_id': team.id, }) response = self.client.get(url, format='json') assert response.status_code == 200, response.content assert response.data[-1][1] == 8, response.data for point in response.data[:-1]: assert point[1] == 0 assert len(response.data) == 24
def test_one_day(self): event = self.get_event() value = 10 rule = self.get_rule({ 'interval': Interval.ONE_DAY, 'value': str(value), }) tsdb.incr( tsdb.models.group, event.group_id, count=value + 1, timestamp=timezone.now() - timedelta(hours=36), ) self.assertDoesNotPass(rule, event) rule.clear_cache(event) tsdb.incr(tsdb.models.group, event.group_id, count=value) self.assertDoesNotPass(rule, event) rule.clear_cache(event) tsdb.incr(tsdb.models.group, event.group_id, count=1) self.assertPasses(rule, event)
def test_one_hour(self): event = self.get_event() value = 10 rule = self.get_rule({ 'interval': Interval.ONE_HOUR, 'value': str(value), }) tsdb.incr( tsdb.models.group, event.group_id, count=value + 1, timestamp=timezone.now() - timedelta(minutes=90), ) self.assertDoesNotPass(rule, event) rule.clear_cache(event) tsdb.incr(tsdb.models.group, event.group_id, count=value) self.assertDoesNotPass(rule, event) rule.clear_cache(event) tsdb.incr(tsdb.models.group, event.group_id, count=1) self.assertPasses(rule, event)
def test_one_day(self): event = self.get_event() value = 10 rule = self.get_rule({ 'interval': Interval.ONE_DAY, 'value': six.text_type(value), }) tsdb.incr( tsdb.models.group, event.group_id, count=value + 1, timestamp=timezone.now() - timedelta(hours=36), ) self.assertDoesNotPass(rule, event) rule.clear_cache(event) tsdb.incr(tsdb.models.group, event.group_id, count=value) self.assertDoesNotPass(rule, event) rule.clear_cache(event) tsdb.incr(tsdb.models.group, event.group_id, count=1) self.assertPasses(rule, event)
def create_counts(self, project, when, amount, offset=0): date = when - timedelta(seconds=offset) tsdb.incr(tsdb.models.project, project.id, date, amount)
def increment(self, event, count, timestamp=None): tsdb.incr(tsdb.models.group, event.group_id, count=count, timestamp=timestamp)