feat: add passive channel monitoring mode (#5592)
* feat: add passive channel monitoring mode * fix: clarify passive monitor mode copy
This commit is contained in:
@@ -210,6 +210,7 @@ export function ModelMutateDrawer({
|
||||
'100-199,300-399,401-407,409-499,500-503,505-523,525-599',
|
||||
'monitor_setting.auto_test_channel_enabled': false,
|
||||
'monitor_setting.auto_test_channel_minutes': 10,
|
||||
'monitor_setting.channel_test_mode': 'scheduled_all',
|
||||
'channel_affinity_setting.enabled': false,
|
||||
'channel_affinity_setting.switch_on_success': true,
|
||||
'channel_affinity_setting.keep_on_channel_disabled': false,
|
||||
|
||||
@@ -72,6 +72,7 @@ const defaultModelSettings: ModelSettings = {
|
||||
'100-199,300-399,401-407,409-499,500-503,505-523,525-599',
|
||||
'monitor_setting.auto_test_channel_enabled': false,
|
||||
'monitor_setting.auto_test_channel_minutes': 10,
|
||||
'monitor_setting.channel_test_mode': 'scheduled_all',
|
||||
'channel_affinity_setting.enabled': false,
|
||||
'channel_affinity_setting.switch_on_success': true,
|
||||
'channel_affinity_setting.keep_on_channel_disabled': false,
|
||||
|
||||
+77
-1
@@ -33,6 +33,14 @@ import {
|
||||
FormMessage,
|
||||
} from '@/components/ui/form'
|
||||
import { Input } from '@/components/ui/input'
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectGroup,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from '@/components/ui/select'
|
||||
import { Separator } from '@/components/ui/separator'
|
||||
import { Switch } from '@/components/ui/switch'
|
||||
import { Textarea } from '@/components/ui/textarea'
|
||||
@@ -53,6 +61,9 @@ const numericString = z.string().refine((value) => {
|
||||
return !Number.isNaN(Number(trimmed)) && Number(trimmed) >= 0
|
||||
}, 'Enter a non-negative number or leave empty')
|
||||
|
||||
const channelTestModes = ['scheduled_all', 'passive_recovery'] as const
|
||||
type ChannelTestMode = (typeof channelTestModes)[number]
|
||||
|
||||
const routingReliabilitySchema = z
|
||||
.object({
|
||||
RetryTimes: z.coerce.number().min(0).max(10),
|
||||
@@ -68,6 +79,7 @@ const routingReliabilitySchema = z
|
||||
.number()
|
||||
.int()
|
||||
.min(1, 'Interval must be at least 1 minute'),
|
||||
channel_test_mode: z.enum(channelTestModes),
|
||||
}),
|
||||
})
|
||||
.superRefine((values, ctx) => {
|
||||
@@ -112,6 +124,7 @@ type RoutingReliabilitySectionProps = {
|
||||
AutomaticRetryStatusCodes: string
|
||||
'monitor_setting.auto_test_channel_enabled': boolean
|
||||
'monitor_setting.auto_test_channel_minutes': number
|
||||
'monitor_setting.channel_test_mode': ChannelTestMode
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,6 +142,11 @@ type NormalizedRoutingReliabilityValues = {
|
||||
AutomaticRetryStatusCodes: string
|
||||
'monitor_setting.auto_test_channel_enabled': boolean
|
||||
'monitor_setting.auto_test_channel_minutes': number
|
||||
'monitor_setting.channel_test_mode': ChannelTestMode
|
||||
}
|
||||
|
||||
function normalizeChannelTestMode(value?: string): ChannelTestMode {
|
||||
return value === 'passive_recovery' ? 'passive_recovery' : 'scheduled_all'
|
||||
}
|
||||
|
||||
const buildFormDefaults = (
|
||||
@@ -148,6 +166,9 @@ const buildFormDefaults = (
|
||||
defaults['monitor_setting.auto_test_channel_enabled'],
|
||||
auto_test_channel_minutes:
|
||||
defaults['monitor_setting.auto_test_channel_minutes'],
|
||||
channel_test_mode: normalizeChannelTestMode(
|
||||
defaults['monitor_setting.channel_test_mode']
|
||||
),
|
||||
},
|
||||
})
|
||||
|
||||
@@ -171,6 +192,9 @@ const normalizeDefaults = (
|
||||
defaults['monitor_setting.auto_test_channel_enabled'],
|
||||
'monitor_setting.auto_test_channel_minutes':
|
||||
defaults['monitor_setting.auto_test_channel_minutes'],
|
||||
'monitor_setting.channel_test_mode': normalizeChannelTestMode(
|
||||
defaults['monitor_setting.channel_test_mode']
|
||||
),
|
||||
})
|
||||
|
||||
const normalizeFormValues = (
|
||||
@@ -193,6 +217,7 @@ const normalizeFormValues = (
|
||||
values.monitor_setting.auto_test_channel_enabled,
|
||||
'monitor_setting.auto_test_channel_minutes':
|
||||
values.monitor_setting.auto_test_channel_minutes,
|
||||
'monitor_setting.channel_test_mode': values.monitor_setting.channel_test_mode,
|
||||
})
|
||||
|
||||
export function RoutingReliabilitySection({
|
||||
@@ -222,6 +247,7 @@ export function RoutingReliabilitySection({
|
||||
|
||||
const autoDisableStatusCodes = form.watch('AutomaticDisableStatusCodes')
|
||||
const autoRetryStatusCodes = form.watch('AutomaticRetryStatusCodes')
|
||||
const channelTestMode = form.watch('monitor_setting.channel_test_mode')
|
||||
const autoDisableParsed = useMemo(
|
||||
() => parseHttpStatusCodeRules(autoDisableStatusCodes),
|
||||
[autoDisableStatusCodes]
|
||||
@@ -351,6 +377,52 @@ export function RoutingReliabilitySection({
|
||||
)}
|
||||
/>
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='monitor_setting.channel_test_mode'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('Channel test mode')}</FormLabel>
|
||||
<Select
|
||||
items={[
|
||||
{
|
||||
value: 'scheduled_all',
|
||||
label: t('Scheduled full test'),
|
||||
},
|
||||
{
|
||||
value: 'passive_recovery',
|
||||
label: t('Passive recovery only'),
|
||||
},
|
||||
]}
|
||||
value={field.value}
|
||||
onValueChange={field.onChange}
|
||||
>
|
||||
<FormControl>
|
||||
<SelectTrigger>
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
</FormControl>
|
||||
<SelectContent alignItemWithTrigger={false}>
|
||||
<SelectGroup>
|
||||
<SelectItem value='scheduled_all'>
|
||||
{t('Scheduled full test')}
|
||||
</SelectItem>
|
||||
<SelectItem value='passive_recovery'>
|
||||
{t('Passive recovery only')}
|
||||
</SelectItem>
|
||||
</SelectGroup>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<FormDescription>
|
||||
{t(
|
||||
'Scheduled full test probes non-manually-disabled channels; passive recovery only checks auto-disabled channels after real request failures.'
|
||||
)}
|
||||
</FormDescription>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='monitor_setting.auto_test_channel_minutes'
|
||||
@@ -366,7 +438,11 @@ export function RoutingReliabilitySection({
|
||||
/>
|
||||
</FormControl>
|
||||
<FormDescription>
|
||||
{t('How frequently the system tests all channels')}
|
||||
{channelTestMode === 'passive_recovery'
|
||||
? t(
|
||||
'How frequently the system checks auto-disabled channels for recovery'
|
||||
)
|
||||
: t('How frequently the system tests all channels')}
|
||||
</FormDescription>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
|
||||
@@ -83,6 +83,8 @@ const MODELS_SECTIONS = [
|
||||
settings['monitor_setting.auto_test_channel_enabled'],
|
||||
'monitor_setting.auto_test_channel_minutes':
|
||||
settings['monitor_setting.auto_test_channel_minutes'],
|
||||
'monitor_setting.channel_test_mode':
|
||||
settings['monitor_setting.channel_test_mode'],
|
||||
}}
|
||||
/>
|
||||
),
|
||||
|
||||
@@ -183,6 +183,7 @@ export type ModelSettings = {
|
||||
AutomaticRetryStatusCodes: string
|
||||
'monitor_setting.auto_test_channel_enabled': boolean
|
||||
'monitor_setting.auto_test_channel_minutes': number
|
||||
'monitor_setting.channel_test_mode': 'scheduled_all' | 'passive_recovery'
|
||||
'channel_affinity_setting.enabled': boolean
|
||||
'channel_affinity_setting.switch_on_success': boolean
|
||||
'channel_affinity_setting.keep_on_channel_disabled': boolean
|
||||
|
||||
Reference in New Issue
Block a user