diff --git a/src/sentry/monitors/models.py b/src/sentry/monitors/models.py index cf985cfd112787..02d6560c8cb194 100644 --- a/src/sentry/monitors/models.py +++ b/src/sentry/monitors/models.py @@ -370,9 +370,11 @@ def update_config(self, config_payload, validated_config): def get_validated_config(self): try: jsonschema.validate(self.config, MONITOR_CONFIG) - return self.config except jsonschema.ValidationError: - logging.exception("Monitor: %s invalid config: %s", self.id, self.config) + logging.warning("Monitor: %s invalid config: %s", self.id, self.config, exc_info=True) + # We should always return the config here - just log an error if we detect that it doesn't + # match the schema + return self.config def get_issue_alert_rule(self): issue_alert_rule_id = self.config.get("alert_rule_id") diff --git a/tests/sentry/incidents/endpoints/validators/test_validators.py b/tests/sentry/incidents/endpoints/validators/test_validators.py index 7737ab17bbd0da..efc30a8e6068c6 100644 --- a/tests/sentry/incidents/endpoints/validators/test_validators.py +++ b/tests/sentry/incidents/endpoints/validators/test_validators.py @@ -23,6 +23,7 @@ SnubaQuery, SnubaQueryEventType, ) +from sentry.workflow_engine.endpoints.validators.utils import get_unknown_detector_type_error from sentry.workflow_engine.models import DataCondition, DataConditionGroup, DataSource, Detector from sentry.workflow_engine.models.data_condition import Condition from sentry.workflow_engine.registry import data_source_type_registry @@ -320,7 +321,8 @@ def test_invalid_detector_type(self) -> None: assert not validator.is_valid() assert validator.errors.get("type") == [ ErrorDetail( - string="Unknown detector type 'invalid_type'. Must be one of: error", code="invalid" + string=get_unknown_detector_type_error("invalid_type", self.organization), + code="invalid", ) ] diff --git a/tests/sentry/monitors/test_models.py b/tests/sentry/monitors/test_models.py index 4c1432b87ea9fd..a5b08205a43eac 100644 --- a/tests/sentry/monitors/test_models.py +++ b/tests/sentry/monitors/test_models.py @@ -1,3 +1,4 @@ +import logging from datetime import datetime, timezone from unittest import mock @@ -254,26 +255,33 @@ def test_update_config(self) -> None: } def test_config_validator(self) -> None: + config = { + "checkin_margin": None, + "max_runtime": None, + "schedule": [1, "month"], + "schedule_type": ScheduleType.INTERVAL, + "alert_rule_id": 1, + } monitor = Monitor.objects.create( organization_id=self.organization.id, project_id=self.project.id, name="Unicron", slug="unicron", - config={ - "checkin_margin": None, - "max_runtime": None, - "schedule": [1, "month"], - "schedule_type": ScheduleType.INTERVAL, - "alert_rule_id": 1, - }, + config=config, ) validated_config = monitor.get_validated_config() - assert validated_config is not None + assert validated_config == config - # Check to make sure bad config fails validation validated_config["bad_key"] = 100 monitor.config = validated_config - assert monitor.get_validated_config() is None + + with self.assertLogs(logger="root", level=logging.WARNING) as cm: + bad_config = monitor.get_validated_config() + assert bad_config == validated_config + assert bad_config["bad_key"] == 100 + + assert len(cm.records) == 1 + assert "invalid config" in cm.records[0].message class CronMonitorDataSourceHandlerTest(TestCase): diff --git a/tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py b/tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py index f2a93426e84c93..715d617095d630 100644 --- a/tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py +++ b/tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py @@ -30,6 +30,7 @@ from sentry.uptime.grouptype import UptimeDomainCheckFailure from sentry.uptime.types import DATA_SOURCE_UPTIME_SUBSCRIPTION from sentry.workflow_engine.endpoints.organization_detector_index import convert_assignee_values +from sentry.workflow_engine.endpoints.validators.utils import get_unknown_detector_type_error from sentry.workflow_engine.models import DataCondition, DataConditionGroup, DataSource, Detector from sentry.workflow_engine.models.data_condition import Condition from sentry.workflow_engine.models.detector_group import DetectorGroup @@ -682,7 +683,7 @@ def test_invalid_group_type(self) -> None: status_code=400, ) assert response.data == { - "type": ["Unknown detector type 'invalid_type'. Must be one of: error"] + "type": [get_unknown_detector_type_error("invalid_type", self.organization)] } def test_incompatible_group_type(self) -> None: