class AlertRule(Model): __core__ = True objects = AlertRuleManager() objects_with_snapshots = BaseManager() organization = FlexibleForeignKey("sentry.Organization", null=True) snuba_query = FlexibleForeignKey("sentry.SnubaQuery", null=True, unique=True) excluded_projects = models.ManyToManyField( "sentry.Project", related_name="alert_rule_exclusions", through=AlertRuleExcludedProjects) name = models.TextField() status = models.SmallIntegerField(default=AlertRuleStatus.PENDING.value) # Determines whether we include all current and future projects from this # organization in this rule. include_all_projects = models.BooleanField(default=False) threshold_type = models.SmallIntegerField(null=True) resolve_threshold = models.FloatField(null=True) threshold_period = models.IntegerField() date_modified = models.DateTimeField(default=timezone.now) date_added = models.DateTimeField(default=timezone.now) class Meta: app_label = "sentry" db_table = "sentry_alertrule" base_manager_name = "objects_with_snapshots" default_manager_name = "objects_with_snapshots" # This constraint does not match what is in migration 0061, since there is no # way to declare an index on an expression. Therefore, tests would break depending # on whether we run migrations - to work around this, we skip some tests if # migrations have not been run. In migration 0061, this index is set to # a partial index where status=0 unique_together = (("organization", "name", "status"), ) __repr__ = sane_repr("id", "name", "date_added") @property def created_by(self): try: created_activity = AlertRuleActivity.objects.get( alert_rule=self, type=AlertRuleActivityType.CREATED.value) return created_activity.user except AlertRuleActivity.DoesNotExist: pass return None
class Rule(Model): __core__ = True project = FlexibleForeignKey('sentry.Project') label = models.CharField(max_length=64) data = GzippedDictField() status = BoundedPositiveIntegerField(default=RuleStatus.ACTIVE, choices=( (RuleStatus.ACTIVE, 'Active'), (RuleStatus.INACTIVE, 'Inactive'), ), db_index=True) date_added = models.DateTimeField(default=timezone.now) objects = BaseManager(cache_fields=('pk', )) class Meta: db_table = 'sentry_rule' app_label = 'sentry' __repr__ = sane_repr('project_id', 'label') @classmethod def get_for_project(cls, project_id): cache_key = 'project:{}:rules'.format(project_id) rules_list = cache.get(cache_key) if rules_list is None: rules_list = list( cls.objects.filter( project=project_id, status=RuleStatus.ACTIVE, )) cache.set(cache_key, rules_list, 60) return rules_list def delete(self, *args, **kwargs): rv = super(Rule, self).delete(*args, **kwargs) cache_key = 'project:{}:rules'.format(self.project_id) cache.delete(cache_key) return rv def save(self, *args, **kwargs): rv = super(Rule, self).save(*args, **kwargs) cache_key = 'project:{}:rules'.format(self.project_id) cache.delete(cache_key) return rv
class AlertRule(Model): __include_in_export__ = True objects = AlertRuleManager() objects_with_snapshots = BaseManager() organization = FlexibleForeignKey("sentry.Organization", null=True) snuba_query = FlexibleForeignKey("sentry.SnubaQuery", null=True, unique=True) owner = FlexibleForeignKey("sentry.Actor", null=True) excluded_projects = models.ManyToManyField( "sentry.Project", related_name="alert_rule_exclusions", through=AlertRuleExcludedProjects) name = models.TextField() status = models.SmallIntegerField(default=AlertRuleStatus.PENDING.value) # Determines whether we include all current and future projects from this # organization in this rule. include_all_projects = models.BooleanField(default=False) threshold_type = models.SmallIntegerField(null=True) resolve_threshold = models.FloatField(null=True) # How many times an alert value must exceed the threshold to fire/resolve the alert threshold_period = models.IntegerField() # This represents a time delta, in seconds. If not null, this is used to determine which time # window to query to compare the result from the current time_window to. comparison_delta = models.IntegerField(null=True) date_modified = models.DateTimeField(default=timezone.now) date_added = models.DateTimeField(default=timezone.now) class Meta: app_label = "sentry" db_table = "sentry_alertrule" base_manager_name = "objects_with_snapshots" default_manager_name = "objects_with_snapshots" __repr__ = sane_repr("id", "name", "date_added") @property def created_by(self): try: created_activity = AlertRuleActivity.objects.get( alert_rule=self, type=AlertRuleActivityType.CREATED.value) return created_activity.user except AlertRuleActivity.DoesNotExist: pass return None
class AlertRule(Model): __core__ = True objects = AlertRuleManager() objects_with_snapshots = BaseManager() organization = FlexibleForeignKey("sentry.Organization", null=True) query_subscriptions = models.ManyToManyField( "sentry.QuerySubscription", related_name="alert_rules", through=AlertRuleQuerySubscription) excluded_projects = models.ManyToManyField( "sentry.Project", related_name="alert_rule_exclusions", through=AlertRuleExcludedProjects) name = models.TextField() status = models.SmallIntegerField(default=AlertRuleStatus.PENDING.value) dataset = models.TextField() query = models.TextField() environment = models.ManyToManyField("sentry.Environment", related_name="alert_rule_environment", through=AlertRuleEnvironment) # Determines whether we include all current and future projects from this # organization in this rule. include_all_projects = models.BooleanField(default=False) # TODO: Remove this default after we migrate aggregation = models.IntegerField(default=QueryAggregations.TOTAL.value) time_window = models.IntegerField() resolution = models.IntegerField() threshold_period = models.IntegerField() date_modified = models.DateTimeField(default=timezone.now) date_added = models.DateTimeField(default=timezone.now) class Meta: app_label = "sentry" db_table = "sentry_alertrule" base_manager_name = "objects_with_snapshots" default_manager_name = "objects_with_snapshots" # This constraint does not match what is in migration 0061, since there is no # way to declare an index on an expression. Therefore, tests would break depending # on whether we run migrations - to work around this, we skip some tests if # migrations have not been run. In migration 0061, this index is set to # a partial index where status=0 unique_together = (("organization", "name", "status"), )
class AlertRule(Model): __core__ = True objects = AlertRuleManager() objects_with_deleted = BaseManager() organization = FlexibleForeignKey("sentry.Organization", db_index=False, null=True) query_subscriptions = models.ManyToManyField( "sentry.QuerySubscription", related_name="query_subscriptions", through=AlertRuleQuerySubscription, ) name = models.TextField() status = models.SmallIntegerField(default=AlertRuleStatus.PENDING.value) dataset = models.TextField() query = models.TextField() # TODO: Remove this default after we migrate aggregation = models.IntegerField(default=QueryAggregations.TOTAL.value) time_window = models.IntegerField() resolution = models.IntegerField() threshold_type = models.SmallIntegerField() alert_threshold = models.IntegerField() resolve_threshold = models.IntegerField() threshold_period = models.IntegerField() date_modified = models.DateTimeField(default=timezone.now) date_added = models.DateTimeField(default=timezone.now) # These will be removed after we've made these columns nullable. Moving to # QuerySubscription subscription_id = models.UUIDField(db_index=True, null=True) aggregations = ArrayField(of=models.IntegerField) query_subscription = FlexibleForeignKey("sentry.QuerySubscription", unique=True, null=True) project = FlexibleForeignKey("sentry.Project", db_index=False, db_constraint=False, null=True) class Meta: app_label = "sentry" db_table = "sentry_alertrule" unique_together = (("organization", "name"), )
class QuerySubscription(Model): __core__ = True project = FlexibleForeignKey("sentry.Project", db_constraint=False) type = models.TextField() subscription_id = models.TextField(unique=True) dataset = models.TextField() query = models.TextField() # TODO: Remove this default after we migrate aggregation = models.IntegerField(default=0) time_window = models.IntegerField() resolution = models.IntegerField() date_added = models.DateTimeField(default=timezone.now) objects = BaseManager(cache_fields=("pk", "subscription_id"), cache_ttl=int(timedelta(hours=1).total_seconds())) class Meta: app_label = "sentry" db_table = "sentry_querysubscription"
class RawEvent(Model): __include_in_export__ = False project = FlexibleForeignKey("sentry.Project") event_id = models.CharField(max_length=32, null=True) datetime = models.DateTimeField(default=timezone.now) data = NodeField(blank=True, null=True, ref_func=ref_func, ref_version=1, wrapper=CanonicalKeyView) objects = BaseManager() class Meta: app_label = "sentry" db_table = "sentry_rawevent" unique_together = (("project", "event_id"), ) __repr__ = sane_repr("project_id")
class AlertRule(Model): __core__ = True objects = AlertRuleManager() objects_with_deleted = BaseManager() organization = FlexibleForeignKey("sentry.Organization", db_index=False, null=True) query_subscriptions = models.ManyToManyField( "sentry.QuerySubscription", related_name="alert_rules", through=AlertRuleQuerySubscription) excluded_projects = models.ManyToManyField( "sentry.Project", related_name="alert_rule_exclusions", through=AlertRuleExcludedProjects) name = models.TextField() status = models.SmallIntegerField(default=AlertRuleStatus.PENDING.value) dataset = models.TextField() query = models.TextField() # Determines whether we include all current and future projects from this # organization in this rule. include_all_projects = models.BooleanField(default=False) # TODO: Remove this default after we migrate aggregation = models.IntegerField(default=QueryAggregations.TOTAL.value) time_window = models.IntegerField() resolution = models.IntegerField() threshold_type = models.SmallIntegerField(null=True) alert_threshold = models.IntegerField(null=True) resolve_threshold = models.IntegerField(null=True) threshold_period = models.IntegerField() date_modified = models.DateTimeField(default=timezone.now) date_added = models.DateTimeField(default=timezone.now) class Meta: app_label = "sentry" db_table = "sentry_alertrule" unique_together = (("organization", "name"), )
class QuerySubscription(Model): __core__ = True class Status(Enum): ACTIVE = 0 CREATING = 1 UPDATING = 2 DELETING = 3 project = FlexibleForeignKey("sentry.Project", db_constraint=False) snuba_query = FlexibleForeignKey("sentry.SnubaQuery", null=True, related_name="subscriptions") type = models.TextField() status = models.SmallIntegerField(default=Status.ACTIVE.value) subscription_id = models.TextField(unique=True, null=True) date_added = models.DateTimeField(default=timezone.now) objects = BaseManager( cache_fields=("pk", "subscription_id"), cache_ttl=int(timedelta(hours=1).total_seconds()) ) class Meta: app_label = "sentry" db_table = "sentry_querysubscription"
class Rule(Model): __core__ = True DEFAULT_CONDITION_MATCH = "all" # any, all DEFAULT_FILTER_MATCH = "all" # match to apply on filters DEFAULT_FREQUENCY = 30 # minutes project = FlexibleForeignKey("sentry.Project") environment_id = BoundedPositiveIntegerField(null=True) label = models.CharField(max_length=64) data = GzippedDictField() status = BoundedPositiveIntegerField( default=RuleStatus.ACTIVE, choices=((RuleStatus.ACTIVE, u"Active"), (RuleStatus.INACTIVE, u"Inactive")), db_index=True, ) date_added = models.DateTimeField(default=timezone.now) objects = BaseManager(cache_fields=("pk",)) class Meta: db_table = "sentry_rule" app_label = "sentry" __repr__ = sane_repr("project_id", "label") @classmethod def get_for_project(cls, project_id): cache_key = u"project:{}:rules".format(project_id) rules_list = cache.get(cache_key) if rules_list is None: rules_list = list(cls.objects.filter(project=project_id, status=RuleStatus.ACTIVE)) cache.set(cache_key, rules_list, 60) return rules_list @property def created_by(self): try: created_activity = RuleActivity.objects.get( rule=self, type=RuleActivityType.CREATED.value ) return created_activity.user except RuleActivity.DoesNotExist: pass return None def delete(self, *args, **kwargs): rv = super(Rule, self).delete(*args, **kwargs) cache_key = u"project:{}:rules".format(self.project_id) cache.delete(cache_key) return rv def save(self, *args, **kwargs): rv = super(Rule, self).save(*args, **kwargs) cache_key = u"project:{}:rules".format(self.project_id) cache.delete(cache_key) return rv def get_audit_log_data(self): return {"label": self.label, "data": self.data, "status": self.status}