From a86f435cc386e04671198ca960268fd5a45196f0 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 7 Nov 2025 16:30:28 -0800 Subject: [PATCH 1/7] feat(aci): Add missing anomaly detection conditions Apparently we were missing these entirely. Also fixes some issues when editing an existing anomaly detector --- .../types/workflowEngine/dataConditions.tsx | 1 + .../components/forms/metric/metric.tsx | 12 ++-- .../forms/metric/metricFormData.tsx | 60 +++++++++++++++--- static/app/views/detectors/edit.spec.tsx | 61 ++++++++++++++++++- .../app/views/detectors/new-setting.spec.tsx | 14 ++++- 5 files changed, 133 insertions(+), 15 deletions(-) diff --git a/static/app/types/workflowEngine/dataConditions.tsx b/static/app/types/workflowEngine/dataConditions.tsx index 69fcdf001d1fa1..783e19aa3a57dc 100644 --- a/static/app/types/workflowEngine/dataConditions.tsx +++ b/static/app/types/workflowEngine/dataConditions.tsx @@ -50,6 +50,7 @@ export enum DataConditionType { EVENT_FREQUENCY = 'event_frequency', EVENT_UNIQUE_USER_FREQUENCY = 'event_unique_user_frequency', PERCENT_SESSIONS = 'percent_sessions', + ANOMALY_DETECTION = 'anomaly_detection', } export enum DataConditionGroupLogicType { diff --git a/static/app/views/detectors/components/forms/metric/metric.tsx b/static/app/views/detectors/components/forms/metric/metric.tsx index 16ae23de66714b..05daadd16bb89d 100644 --- a/static/app/views/detectors/components/forms/metric/metric.tsx +++ b/static/app/views/detectors/components/forms/metric/metric.tsx @@ -584,10 +584,14 @@ function DetectSection() { )} - - {t('Resolve')} - - + {detectionType !== 'dynamic' && ( + + + {t('Resolve')} + + + + )} ); diff --git a/static/app/views/detectors/components/forms/metric/metricFormData.tsx b/static/app/views/detectors/components/forms/metric/metricFormData.tsx index 0f1e404ddd7b70..30ae4195b0d2f3 100644 --- a/static/app/views/detectors/components/forms/metric/metricFormData.tsx +++ b/static/app/views/detectors/components/forms/metric/metricFormData.tsx @@ -183,6 +183,22 @@ interface NewDataSource { timeWindow: number; } +function createAnomalyDetectionCondition( + data: Pick +): NewConditionGroup['conditions'] { + return [ + { + type: DataConditionType.ANOMALY_DETECTION, + comparison: { + sensitivity: data.sensitivity, + seasonality: 'auto' as const, + threshold_type: data.thresholdType, + }, + conditionResult: DetectorPriorityLevel.HIGH, + }, + ]; +} + /** * Creates escalation conditions based on priority level and available thresholds */ @@ -303,7 +319,11 @@ function createDataSource(data: MetricDetectorFormData): NewDataSource { export function metricDetectorFormDataToEndpointPayload( data: MetricDetectorFormData ): MetricDetectorUpdatePayload { - const conditions = createConditions(data); + const conditions = + data.detectionType === 'dynamic' + ? createAnomalyDetectionCondition(data) + : createConditions(data); + const dataSource = createDataSource(data); // Create config based on detection type @@ -423,6 +443,30 @@ function processDetectorConditions( }; } +/** + * Extracts thresholdType from anomaly detection condition + * Backend serializes threshold_type as thresholdType (camelCase) + */ +function extractThresholdTypeFromAnomalyCondition( + detector: MetricDetector +): AlertRuleThresholdType | undefined { + const anomalyCondition = detector.conditionGroup?.conditions?.find( + condition => condition.type === DataConditionType.ANOMALY_DETECTION + ); + + const comparison = anomalyCondition?.comparison; + if ( + comparison && + typeof comparison === 'object' && + 'thresholdType' in comparison && + typeof comparison.thresholdType === 'number' + ) { + return comparison.thresholdType as AlertRuleThresholdType; + } + + return undefined; +} + /** * Converts a Detector to MetricDetectorFormData for editing */ @@ -438,6 +482,7 @@ export function metricSavedDetectorToFormData( const snubaQuery = dataSource.queryObj?.snubaQuery; const conditionData = processDetectorConditions(detector); + const isDynamic = detector.config.detectionType === 'dynamic'; const dataset = snubaQuery?.dataset ? getDetectorDataset(snubaQuery.dataset, snubaQuery.eventTypes) @@ -471,15 +516,14 @@ export function metricSavedDetectorToFormData( ? detector.config.comparisonDelta : DEFAULT_THRESHOLD_METRIC_FORM_DATA.conditionComparisonAgo, - // Dynamic fields - extract from config for dynamic detectors + // Dynamic fields - extract from anomaly detection condition for dynamic detectors sensitivity: - detector.config.detectionType === 'dynamic' && defined(detector.config.sensitivity) + isDynamic && defined(detector.config.sensitivity) ? detector.config.sensitivity : DEFAULT_THRESHOLD_METRIC_FORM_DATA.sensitivity, - thresholdType: - detector.config.detectionType === 'dynamic' && - defined(detector.config.thresholdType) - ? detector.config.thresholdType - : DEFAULT_THRESHOLD_METRIC_FORM_DATA.thresholdType, + thresholdType: isDynamic + ? (extractThresholdTypeFromAnomalyCondition(detector) ?? + DEFAULT_THRESHOLD_METRIC_FORM_DATA.thresholdType) + : DEFAULT_THRESHOLD_METRIC_FORM_DATA.thresholdType, }; } diff --git a/static/app/views/detectors/edit.spec.tsx b/static/app/views/detectors/edit.spec.tsx index a7064c6f6e18c0..88ca7c05206586 100644 --- a/static/app/views/detectors/edit.spec.tsx +++ b/static/app/views/detectors/edit.spec.tsx @@ -24,7 +24,12 @@ import { DataConditionType, DetectorPriorityLevel, } from 'sentry/types/workflowEngine/dataConditions'; -import {Dataset, EventTypes} from 'sentry/views/alerts/rules/metric/types'; +import { + AlertRuleSensitivity, + AlertRuleThresholdType, + Dataset, + EventTypes, +} from 'sentry/views/alerts/rules/metric/types'; import {SnubaQueryType} from 'sentry/views/detectors/components/forms/metric/metricFormData'; import DetectorEdit from 'sentry/views/detectors/edit'; @@ -627,6 +632,60 @@ describe('DetectorEdit', () => { expect(await screen.findByText('15 minutes')).toBeInTheDocument(); }); + it('prefills thresholdType from anomaly detection condition when editing dynamic detector', async () => { + const dynamicDetector = MetricDetectorFixture({ + name: 'Dynamic Detector', + projectId: project.id, + config: { + detectionType: 'dynamic', + thresholdPeriod: 1, + sensitivity: AlertRuleSensitivity.HIGH, + }, + conditionGroup: { + id: 'cg-dynamic', + logicType: DataConditionGroupLogicType.ANY, + conditions: [ + { + id: 'c-anomaly', + type: DataConditionType.ANOMALY_DETECTION, + comparison: { + sensitivity: 'high', + seasonality: 'auto', + threshold_type: AlertRuleThresholdType.BELOW, + }, + conditionResult: DetectorPriorityLevel.HIGH, + }, + ], + }, + }); + + MockApiClient.addMockResponse({ + url: `/organizations/${organization.slug}/detectors/${dynamicDetector.id}/`, + body: dynamicDetector, + }); + + render(, { + organization, + initialRouterConfig: { + route: '/organizations/:orgId/monitors/:detectorId/edit/', + location: { + pathname: `/organizations/${organization.slug}/monitors/${dynamicDetector.id}/edit/`, + }, + }, + }); + + expect( + await screen.findByRole('link', {name: 'Dynamic Detector'}) + ).toBeInTheDocument(); + + expect(screen.getByRole('radio', {name: 'Dynamic'})).toBeChecked(); + + // Verify thresholdType field is prefilled with "Below" + const thresholdTypeField = screen.getByLabelText('Direction of anomaly movement'); + expect(thresholdTypeField).toHaveValue('1'); // BELOW = 1 + expect(screen.getByText('Below')).toBeInTheDocument(); + }); + it('calls anomaly API when using dynamic detection', async () => { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/detectors/${mockDetector.id}/`, diff --git a/static/app/views/detectors/new-setting.spec.tsx b/static/app/views/detectors/new-setting.spec.tsx index ebd72ccd4bc029..800eb688ee8f3e 100644 --- a/static/app/views/detectors/new-setting.spec.tsx +++ b/static/app/views/detectors/new-setting.spec.tsx @@ -570,9 +570,19 @@ describe('DetectorEdit', () => { projectId: project.id, owner: null, workflowIds: [], - // Dynamic detection should have empty conditions (no resolution thresholds) + // Dynamic detection should have anomaly detection condition conditionGroup: { - conditions: [], + conditions: [ + { + type: 'anomaly_detection', + comparison: { + sensitivity: 'high', + seasonality: 'auto', + threshold_type: 0, + }, + conditionResult: 75, + }, + ], logicType: 'any', }, config: { From d1ff1b6cf106b49831b76f8cb98def44784f56bb Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 10 Nov 2025 10:52:01 -0800 Subject: [PATCH 2/7] update payload casing, remove unused values --- static/app/types/workflowEngine/detectors.tsx | 12 +++--- .../forms/metric/metricFormData.tsx | 42 +++++++------------ static/app/views/detectors/edit.spec.tsx | 12 +++--- .../views/detectors/list/allMonitors.spec.tsx | 1 - .../app/views/detectors/new-setting.spec.tsx | 8 ++-- tests/js/fixtures/detectors.ts | 1 - 6 files changed, 27 insertions(+), 49 deletions(-) diff --git a/static/app/types/workflowEngine/detectors.tsx b/static/app/types/workflowEngine/detectors.tsx index 755e84bcdbf7c3..bcb4a55d4ff6c1 100644 --- a/static/app/types/workflowEngine/detectors.tsx +++ b/static/app/types/workflowEngine/detectors.tsx @@ -80,9 +80,7 @@ export type DetectorType = | 'uptime_domain_failure' | 'issue_stream'; -interface BaseMetricDetectorConfig { - thresholdPeriod: number; -} +interface BaseMetricDetectorConfig {} /** * Configuration for static/threshold-based detection @@ -105,7 +103,7 @@ interface MetricDetectorConfigPercent extends BaseMetricDetectorConfig { interface MetricDetectorConfigDynamic extends BaseMetricDetectorConfig { detectionType: 'dynamic'; seasonality?: 'auto' | 'daily' | 'weekly' | 'monthly'; - sensitivity?: AlertRuleSensitivity; + sensitivity?: 'low' | 'medium' | 'high'; thresholdType?: AlertRuleThresholdType; } @@ -233,7 +231,7 @@ export interface MetricCondition { /** * See AnomalyDetectionHandler */ -interface AnomalyDetectionComparison { +export interface AnomalyDetectionComparison { seasonality: | 'auto' | 'hourly' @@ -243,8 +241,8 @@ interface AnomalyDetectionComparison { | 'hourly_weekly' | 'hourly_daily_weekly' | 'daily_weekly'; - sensitivity: 'low' | 'medium' | 'high'; - threshold_type: 0 | 1 | 2; + sensitivity: AlertRuleSensitivity; + thresholdType: AlertRuleThresholdType; } type MetricDataCondition = AnomalyDetectionComparison | number; diff --git a/static/app/views/detectors/components/forms/metric/metricFormData.tsx b/static/app/views/detectors/components/forms/metric/metricFormData.tsx index 30ae4195b0d2f3..d020c92a9ccedf 100644 --- a/static/app/views/detectors/components/forms/metric/metricFormData.tsx +++ b/static/app/views/detectors/components/forms/metric/metricFormData.tsx @@ -5,6 +5,7 @@ import { DetectorPriorityLevel, } from 'sentry/types/workflowEngine/dataConditions'; import type { + AnomalyDetectionComparison, Detector, MetricCondition, MetricConditionGroup, @@ -192,7 +193,7 @@ function createAnomalyDetectionCondition( comparison: { sensitivity: data.sensitivity, seasonality: 'auto' as const, - threshold_type: data.thresholdType, + thresholdType: data.thresholdType, }, conditionResult: DetectorPriorityLevel.HIGH, }, @@ -331,14 +332,12 @@ export function metricDetectorFormDataToEndpointPayload( switch (data.detectionType) { case 'percent': config = { - thresholdPeriod: 1, detectionType: 'percent', comparisonDelta: data.conditionComparisonAgo || 3600, }; break; case 'dynamic': config = { - thresholdPeriod: 1, detectionType: 'dynamic', sensitivity: data.sensitivity, }; @@ -346,7 +345,6 @@ export function metricDetectorFormDataToEndpointPayload( case 'static': default: config = { - thresholdPeriod: 1, detectionType: 'static', }; break; @@ -443,28 +441,22 @@ function processDetectorConditions( }; } -/** - * Extracts thresholdType from anomaly detection condition - * Backend serializes threshold_type as thresholdType (camelCase) - */ -function extractThresholdTypeFromAnomalyCondition( - detector: MetricDetector -): AlertRuleThresholdType | undefined { +function getAnomalyCondition(detector: MetricDetector): AnomalyDetectionComparison { const anomalyCondition = detector.conditionGroup?.conditions?.find( condition => condition.type === DataConditionType.ANOMALY_DETECTION ); const comparison = anomalyCondition?.comparison; - if ( - comparison && - typeof comparison === 'object' && - 'thresholdType' in comparison && - typeof comparison.thresholdType === 'number' - ) { - return comparison.thresholdType as AlertRuleThresholdType; + if (typeof comparison === 'object') { + return comparison; } - return undefined; + // Fallback to default values + return { + sensitivity: AlertRuleSensitivity.MEDIUM, + seasonality: 'auto', + thresholdType: AlertRuleThresholdType.ABOVE_AND_BELOW, + }; } /** @@ -482,13 +474,13 @@ export function metricSavedDetectorToFormData( const snubaQuery = dataSource.queryObj?.snubaQuery; const conditionData = processDetectorConditions(detector); - const isDynamic = detector.config.detectionType === 'dynamic'; const dataset = snubaQuery?.dataset ? getDetectorDataset(snubaQuery.dataset, snubaQuery.eventTypes) : DetectorDataset.SPANS; const datasetConfig = getDatasetConfig(dataset); + const anomalyCondition = getAnomalyCondition(detector); return { // Core detector fields @@ -517,13 +509,7 @@ export function metricSavedDetectorToFormData( : DEFAULT_THRESHOLD_METRIC_FORM_DATA.conditionComparisonAgo, // Dynamic fields - extract from anomaly detection condition for dynamic detectors - sensitivity: - isDynamic && defined(detector.config.sensitivity) - ? detector.config.sensitivity - : DEFAULT_THRESHOLD_METRIC_FORM_DATA.sensitivity, - thresholdType: isDynamic - ? (extractThresholdTypeFromAnomalyCondition(detector) ?? - DEFAULT_THRESHOLD_METRIC_FORM_DATA.thresholdType) - : DEFAULT_THRESHOLD_METRIC_FORM_DATA.thresholdType, + sensitivity: anomalyCondition.sensitivity, + thresholdType: anomalyCondition.thresholdType, }; } diff --git a/static/app/views/detectors/edit.spec.tsx b/static/app/views/detectors/edit.spec.tsx index 88ca7c05206586..3aee57abd96c0a 100644 --- a/static/app/views/detectors/edit.spec.tsx +++ b/static/app/views/detectors/edit.spec.tsx @@ -317,6 +317,9 @@ describe('DetectorEdit', () => { projectId: project.id, type: 'metric_issue', workflowIds: mockDetector.workflowIds, + config: { + detectionType: 'static', + }, dataSources: [ { environment: 'production', @@ -335,7 +338,6 @@ describe('DetectorEdit', () => { ], logicType: 'any', }, - config: {detectionType: 'static', thresholdPeriod: 1}, }, }) ); @@ -638,8 +640,6 @@ describe('DetectorEdit', () => { projectId: project.id, config: { detectionType: 'dynamic', - thresholdPeriod: 1, - sensitivity: AlertRuleSensitivity.HIGH, }, conditionGroup: { id: 'cg-dynamic', @@ -649,9 +649,9 @@ describe('DetectorEdit', () => { id: 'c-anomaly', type: DataConditionType.ANOMALY_DETECTION, comparison: { - sensitivity: 'high', + sensitivity: AlertRuleSensitivity.HIGH, seasonality: 'auto', - threshold_type: AlertRuleThresholdType.BELOW, + thresholdType: AlertRuleThresholdType.BELOW, }, conditionResult: DetectorPriorityLevel.HIGH, }, @@ -681,8 +681,6 @@ describe('DetectorEdit', () => { expect(screen.getByRole('radio', {name: 'Dynamic'})).toBeChecked(); // Verify thresholdType field is prefilled with "Below" - const thresholdTypeField = screen.getByLabelText('Direction of anomaly movement'); - expect(thresholdTypeField).toHaveValue('1'); // BELOW = 1 expect(screen.getByText('Below')).toBeInTheDocument(); }); diff --git a/static/app/views/detectors/list/allMonitors.spec.tsx b/static/app/views/detectors/list/allMonitors.spec.tsx index 97fda38969a583..4192369a965a22 100644 --- a/static/app/views/detectors/list/allMonitors.spec.tsx +++ b/static/app/views/detectors/list/allMonitors.spec.tsx @@ -53,7 +53,6 @@ describe('DetectorsList', () => { config: { detectionType: 'percent', comparisonDelta: 10, - thresholdPeriod: 10, }, conditionGroup: { id: '1', diff --git a/static/app/views/detectors/new-setting.spec.tsx b/static/app/views/detectors/new-setting.spec.tsx index 800eb688ee8f3e..7768299eae4384 100644 --- a/static/app/views/detectors/new-setting.spec.tsx +++ b/static/app/views/detectors/new-setting.spec.tsx @@ -197,7 +197,6 @@ describe('DetectorEdit', () => { }, config: { detectionType: 'static', - thresholdPeriod: 1, }, dataSources: [ { @@ -282,7 +281,7 @@ describe('DetectorEdit', () => { ], logicType: 'any', }, - config: {detectionType: 'static', thresholdPeriod: 1}, + config: {detectionType: 'static'}, dataSources: [ { aggregate: 'count_unique(tags[sentry:user])', @@ -352,7 +351,7 @@ describe('DetectorEdit', () => { ], logicType: 'any', }, - config: {detectionType: 'static', thresholdPeriod: 1}, + config: {detectionType: 'static'}, dataSources: [ { aggregate: 'count()', @@ -578,7 +577,7 @@ describe('DetectorEdit', () => { comparison: { sensitivity: 'high', seasonality: 'auto', - threshold_type: 0, + thresholdType: 0, }, conditionResult: 75, }, @@ -588,7 +587,6 @@ describe('DetectorEdit', () => { config: { detectionType: 'dynamic', sensitivity: 'high', - thresholdPeriod: 1, }, dataSources: [ { diff --git a/tests/js/fixtures/detectors.ts b/tests/js/fixtures/detectors.ts index d3585daaddebec..5f1d61f71cdf06 100644 --- a/tests/js/fixtures/detectors.ts +++ b/tests/js/fixtures/detectors.ts @@ -78,7 +78,6 @@ export function MetricDetectorFixture( name: 'detector', config: { detectionType: 'static', - thresholdPeriod: 1, }, type: 'metric_issue', enabled: true, From fc3473dcf38cf378954503cab50b60eb1d5466ac Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 10 Nov 2025 10:52:31 -0800 Subject: [PATCH 3/7] cleanup --- static/app/types/workflowEngine/detectors.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/static/app/types/workflowEngine/detectors.tsx b/static/app/types/workflowEngine/detectors.tsx index bcb4a55d4ff6c1..7d437dac2850a5 100644 --- a/static/app/types/workflowEngine/detectors.tsx +++ b/static/app/types/workflowEngine/detectors.tsx @@ -80,19 +80,17 @@ export type DetectorType = | 'uptime_domain_failure' | 'issue_stream'; -interface BaseMetricDetectorConfig {} - /** * Configuration for static/threshold-based detection */ -interface MetricDetectorConfigStatic extends BaseMetricDetectorConfig { +interface MetricDetectorConfigStatic { detectionType: 'static'; } /** * Configuration for percentage-based change detection */ -interface MetricDetectorConfigPercent extends BaseMetricDetectorConfig { +interface MetricDetectorConfigPercent { comparisonDelta: number; detectionType: 'percent'; } @@ -100,7 +98,7 @@ interface MetricDetectorConfigPercent extends BaseMetricDetectorConfig { /** * Configuration for dynamic/anomaly detection */ -interface MetricDetectorConfigDynamic extends BaseMetricDetectorConfig { +interface MetricDetectorConfigDynamic { detectionType: 'dynamic'; seasonality?: 'auto' | 'daily' | 'weekly' | 'monthly'; sensitivity?: 'low' | 'medium' | 'high'; From 25cf1dcb57d5996cc3a3545aad7b18e76a8b5d5b Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 10 Nov 2025 14:52:19 -0800 Subject: [PATCH 4/7] remove seasonality --- static/app/types/workflowEngine/detectors.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/static/app/types/workflowEngine/detectors.tsx b/static/app/types/workflowEngine/detectors.tsx index 7d437dac2850a5..504617cb01281a 100644 --- a/static/app/types/workflowEngine/detectors.tsx +++ b/static/app/types/workflowEngine/detectors.tsx @@ -100,7 +100,6 @@ interface MetricDetectorConfigPercent { */ interface MetricDetectorConfigDynamic { detectionType: 'dynamic'; - seasonality?: 'auto' | 'daily' | 'weekly' | 'monthly'; sensitivity?: 'low' | 'medium' | 'high'; thresholdType?: AlertRuleThresholdType; } From 4295ec040fb94bf09e07acbdc5e9a102edb540d8 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 10 Nov 2025 15:17:37 -0800 Subject: [PATCH 5/7] remove unused config fields --- static/app/types/workflowEngine/detectors.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/static/app/types/workflowEngine/detectors.tsx b/static/app/types/workflowEngine/detectors.tsx index 504617cb01281a..7b21b748b94efc 100644 --- a/static/app/types/workflowEngine/detectors.tsx +++ b/static/app/types/workflowEngine/detectors.tsx @@ -100,8 +100,6 @@ interface MetricDetectorConfigPercent { */ interface MetricDetectorConfigDynamic { detectionType: 'dynamic'; - sensitivity?: 'low' | 'medium' | 'high'; - thresholdType?: AlertRuleThresholdType; } export type MetricDetectorConfig = From c4f6690d82786102bbe1b1d6db766afd1ba84dd9 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 10 Nov 2025 15:18:46 -0800 Subject: [PATCH 6/7] last usage --- .../views/detectors/components/forms/metric/metricFormData.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/static/app/views/detectors/components/forms/metric/metricFormData.tsx b/static/app/views/detectors/components/forms/metric/metricFormData.tsx index d020c92a9ccedf..bc622b7dfff406 100644 --- a/static/app/views/detectors/components/forms/metric/metricFormData.tsx +++ b/static/app/views/detectors/components/forms/metric/metricFormData.tsx @@ -339,7 +339,6 @@ export function metricDetectorFormDataToEndpointPayload( case 'dynamic': config = { detectionType: 'dynamic', - sensitivity: data.sensitivity, }; break; case 'static': From 81647e2e7588c073418bf561f3c6d04763b77d5a Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 10 Nov 2025 15:27:44 -0800 Subject: [PATCH 7/7] cleanup sensitivity --- static/app/views/detectors/new-setting.spec.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/static/app/views/detectors/new-setting.spec.tsx b/static/app/views/detectors/new-setting.spec.tsx index 7768299eae4384..2fbc48cf2ad6e5 100644 --- a/static/app/views/detectors/new-setting.spec.tsx +++ b/static/app/views/detectors/new-setting.spec.tsx @@ -586,7 +586,6 @@ describe('DetectorEdit', () => { }, config: { detectionType: 'dynamic', - sensitivity: 'high', }, dataSources: [ {