Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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"), )
Exemplo n.º 5
0
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"), )
Exemplo n.º 6
0
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"
Exemplo n.º 7
0
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")
Exemplo n.º 8
0
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"), )
Exemplo n.º 9
0
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"
Exemplo n.º 10
0
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}