|
5 | 5 | import zoneinfo
|
6 | 6 | from collections.abc import Sequence
|
7 | 7 | from datetime import datetime
|
8 |
| -from typing import TYPE_CHECKING, Any, ClassVar, Self |
| 8 | +from typing import TYPE_CHECKING, Any, ClassVar, Self, override |
9 | 9 | from uuid import uuid4
|
10 | 10 |
|
11 | 11 | import jsonschema
|
|
34 | 34 | from sentry.db.models.fields.slug import DEFAULT_SLUG_MAX_LENGTH, SentrySlugField
|
35 | 35 | from sentry.db.models.manager.base import BaseManager
|
36 | 36 | from sentry.db.models.utils import slugify_instance
|
| 37 | +from sentry.deletions.base import ModelRelation |
37 | 38 | from sentry.locks import locks
|
38 | 39 | from sentry.models.environment import Environment
|
| 40 | +from sentry.models.organization import Organization |
39 | 41 | from sentry.models.rule import Rule, RuleSource
|
40 |
| -from sentry.monitors.types import CrontabSchedule, IntervalSchedule |
| 42 | +from sentry.monitors.types import DATA_SOURCE_CRON_MONITOR, CrontabSchedule, IntervalSchedule |
41 | 43 | from sentry.types.actor import Actor
|
42 | 44 | from sentry.utils.retries import TimedRetryPolicy
|
| 45 | +from sentry.workflow_engine.models import DataSource |
| 46 | +from sentry.workflow_engine.registry import data_source_type_registry |
| 47 | +from sentry.workflow_engine.types import DataSourceTypeHandler |
43 | 48 |
|
44 | 49 | logger = logging.getLogger(__name__)
|
45 | 50 |
|
@@ -790,3 +795,41 @@ class MonitorEnvBrokenDetection(Model):
|
790 | 795 | class Meta:
|
791 | 796 | app_label = "monitors"
|
792 | 797 | db_table = "sentry_monitorenvbrokendetection"
|
| 798 | + |
| 799 | + |
| 800 | +@data_source_type_registry.register(DATA_SOURCE_CRON_MONITOR) |
| 801 | +class CronMonitorDataSourceHandler(DataSourceTypeHandler[Monitor]): |
| 802 | + @staticmethod |
| 803 | + def bulk_get_query_object( |
| 804 | + data_sources: list[DataSource], |
| 805 | + ) -> dict[int, Monitor | None]: |
| 806 | + monitor_ids: list[int] = [] |
| 807 | + |
| 808 | + for ds in data_sources: |
| 809 | + try: |
| 810 | + monitor_ids.append(int(ds.source_id)) |
| 811 | + except ValueError: |
| 812 | + logger.exception( |
| 813 | + "Invalid DataSource.source_id fetching Monitor", |
| 814 | + extra={"id": ds.id, "source_id": ds.source_id}, |
| 815 | + ) |
| 816 | + |
| 817 | + qs_lookup = { |
| 818 | + str(monitor.id): monitor for monitor in Monitor.objects.filter(id__in=monitor_ids) |
| 819 | + } |
| 820 | + return {ds.id: qs_lookup.get(ds.source_id) for ds in data_sources} |
| 821 | + |
| 822 | + @staticmethod |
| 823 | + def related_model(instance) -> list[ModelRelation]: |
| 824 | + return [ModelRelation(Monitor, {"id": instance.source_id})] |
| 825 | + |
| 826 | + @override |
| 827 | + @staticmethod |
| 828 | + def get_instance_limit(org: Organization) -> int | None: |
| 829 | + return None |
| 830 | + |
| 831 | + @override |
| 832 | + @staticmethod |
| 833 | + def get_current_instance_count(org: Organization) -> int: |
| 834 | + # We don't have a limit at the moment, so no need to count. |
| 835 | + raise NotImplementedError |
0 commit comments