chore(proxy): guard metrics retention cleanup

This commit is contained in:
fawney19
2026-05-08 22:57:00 +08:00
parent a703acd1fe
commit e21fb58479
16 changed files with 562 additions and 75 deletions

View File

@@ -908,7 +908,10 @@ export const MOCK_SYSTEM_CONFIGS = [
{ key: 'cache_enabled', value: true, description: '是否启用缓存' },
{ key: 'default_cache_ttl', value: 3600, description: '默认缓存 TTL' },
{ key: 'fallback_enabled', value: true, description: '是否启用故障转移' },
{ key: 'max_fallback_attempts', value: 3, description: '最大故障转移次数' }
{ key: 'max_fallback_attempts', value: 3, description: '最大故障转移次数' },
{ key: 'proxy_node_metrics_1m_retention_days', value: 30, description: '代理节点 1m 指标保留天数' },
{ key: 'proxy_node_metrics_1h_retention_days', value: 180, description: '代理节点 1h 指标保留天数' },
{ key: 'proxy_node_metrics_cleanup_batch_size', value: 5000, description: '代理节点指标每批次清理条数' }
]
// ========== API 格式 ==========

View File

@@ -102,6 +102,9 @@
:audit-log-retention-days="systemConfig.audit_log_retention_days"
:request-candidates-retention-days="systemConfig.request_candidates_retention_days"
:request-candidates-cleanup-batch-size="systemConfig.request_candidates_cleanup_batch_size"
:proxy-node-metrics-1m-retention-days="systemConfig.proxy_node_metrics_1m_retention_days"
:proxy-node-metrics-1h-retention-days="systemConfig.proxy_node_metrics_1h_retention_days"
:proxy-node-metrics-cleanup-batch-size="systemConfig.proxy_node_metrics_cleanup_batch_size"
:loading="cleanupConfigLoading"
:has-changes="hasCleanupConfigChanges"
@save="saveCleanupConfig"
@@ -114,6 +117,9 @@
@update:audit-log-retention-days="systemConfig.audit_log_retention_days = $event"
@update:request-candidates-retention-days="systemConfig.request_candidates_retention_days = $event"
@update:request-candidates-cleanup-batch-size="systemConfig.request_candidates_cleanup_batch_size = $event"
@update:proxy-node-metrics-1m-retention-days="systemConfig.proxy_node_metrics_1m_retention_days = $event"
@update:proxy-node-metrics-1h-retention-days="systemConfig.proxy_node_metrics_1h_retention_days = $event"
@update:proxy-node-metrics-cleanup-batch-size="systemConfig.proxy_node_metrics_cleanup_batch_size = $event"
/>
<!-- 定时任务 -->

View File

@@ -192,6 +192,72 @@
独立控制候选记录大表清理节奏不再跟随 Key 删除联动
</p>
</div>
<div>
<Label
for="proxy-node-metrics-1m-retention-days"
class="block text-sm font-medium"
>
代理 1m 指标保留天数
</Label>
<Input
id="proxy-node-metrics-1m-retention-days"
:model-value="proxyNodeMetrics1mRetentionDays"
type="number"
min="1"
max="365"
placeholder="30"
class="mt-1"
@update:model-value="$emit('update:proxyNodeMetrics1mRetentionDays', Number($event))"
/>
<p class="mt-1 text-xs text-muted-foreground">
用于代理节点稳定性分钟级图表后端最少保留 1
</p>
</div>
<div>
<Label
for="proxy-node-metrics-1h-retention-days"
class="block text-sm font-medium"
>
代理 1h 指标保留天数
</Label>
<Input
id="proxy-node-metrics-1h-retention-days"
:model-value="proxyNodeMetrics1hRetentionDays"
type="number"
min="1"
max="1095"
placeholder="180"
class="mt-1"
@update:model-value="$emit('update:proxyNodeMetrics1hRetentionDays', Number($event))"
/>
<p class="mt-1 text-xs text-muted-foreground">
小时级聚合用于长期趋势不能短于 1m 指标保留天数
</p>
</div>
<div>
<Label
for="proxy-node-metrics-cleanup-batch-size"
class="block text-sm font-medium"
>
代理指标清理批次
</Label>
<Input
id="proxy-node-metrics-cleanup-batch-size"
:model-value="proxyNodeMetricsCleanupBatchSize"
type="number"
min="1"
max="50000"
placeholder="5000"
class="mt-1"
@update:model-value="$emit('update:proxyNodeMetricsCleanupBatchSize', Number($event))"
/>
<p class="mt-1 text-xs text-muted-foreground">
独立限制 proxy_node_metrics 表的单批删除数量
</p>
</div>
</div>
<!-- 清理策略说明 -->
@@ -206,6 +272,7 @@
<p>4. <strong>归档删除</strong>: 超过保留期限后完全删除记录</p>
<p>5. <strong>候选记录</strong>: 独立按保留天数清理 request_candidates 审计记录不再跟随 Key 删除联动</p>
<p>6. <strong>审计日志</strong>: 独立清理记录用户登录操作等安全事件</p>
<p>7. <strong>代理指标</strong>: 仅保留 1m/1h 聚合桶清理任务按批次删除过期桶</p>
</div>
</div>
</CardSection>
@@ -228,6 +295,9 @@ defineProps<{
auditLogRetentionDays: number
requestCandidatesRetentionDays: number
requestCandidatesCleanupBatchSize: number
proxyNodeMetrics1mRetentionDays: number
proxyNodeMetrics1hRetentionDays: number
proxyNodeMetricsCleanupBatchSize: number
loading: boolean
hasChanges: boolean
}>()
@@ -243,5 +313,8 @@ defineEmits<{
'update:auditLogRetentionDays': [value: number]
'update:requestCandidatesRetentionDays': [value: number]
'update:requestCandidatesCleanupBatchSize': [value: number]
'update:proxyNodeMetrics1mRetentionDays': [value: number]
'update:proxyNodeMetrics1hRetentionDays': [value: number]
'update:proxyNodeMetricsCleanupBatchSize': [value: number]
}>()
</script>

View File

@@ -34,6 +34,9 @@ export interface SystemConfig {
audit_log_retention_days: number
request_candidates_retention_days: number
request_candidates_cleanup_batch_size: number
proxy_node_metrics_1m_retention_days: number
proxy_node_metrics_1h_retention_days: number
proxy_node_metrics_cleanup_batch_size: number
// 定时任务
enable_provider_checkin: boolean
provider_checkin_time: string
@@ -70,6 +73,9 @@ const CONFIG_KEYS = [
'audit_log_retention_days',
'request_candidates_retention_days',
'request_candidates_cleanup_batch_size',
'proxy_node_metrics_1m_retention_days',
'proxy_node_metrics_1h_retention_days',
'proxy_node_metrics_cleanup_batch_size',
// 定时任务
'enable_provider_checkin',
'provider_checkin_time',
@@ -107,6 +113,9 @@ function createDefaultConfig(): SystemConfig {
audit_log_retention_days: 30,
request_candidates_retention_days: 30,
request_candidates_cleanup_batch_size: 5000,
proxy_node_metrics_1m_retention_days: 30,
proxy_node_metrics_1h_retention_days: 180,
proxy_node_metrics_cleanup_batch_size: 5000,
// 定时任务
enable_provider_checkin: true,
provider_checkin_time: '01:05',
@@ -181,7 +190,13 @@ export function useSystemConfig() {
systemConfig.value.request_candidates_retention_days !==
originalConfig.value.request_candidates_retention_days ||
systemConfig.value.request_candidates_cleanup_batch_size !==
originalConfig.value.request_candidates_cleanup_batch_size
originalConfig.value.request_candidates_cleanup_batch_size ||
systemConfig.value.proxy_node_metrics_1m_retention_days !==
originalConfig.value.proxy_node_metrics_1m_retention_days ||
systemConfig.value.proxy_node_metrics_1h_retention_days !==
originalConfig.value.proxy_node_metrics_1h_retention_days ||
systemConfig.value.proxy_node_metrics_cleanup_batch_size !==
originalConfig.value.proxy_node_metrics_cleanup_batch_size
)
})
@@ -441,6 +456,21 @@ export function useSystemConfig() {
value: systemConfig.value.request_candidates_cleanup_batch_size,
description: '请求候选记录每批次清理条数',
},
{
key: 'proxy_node_metrics_1m_retention_days',
value: systemConfig.value.proxy_node_metrics_1m_retention_days,
description: '代理节点 1m 指标保留天数',
},
{
key: 'proxy_node_metrics_1h_retention_days',
value: systemConfig.value.proxy_node_metrics_1h_retention_days,
description: '代理节点 1h 指标保留天数',
},
{
key: 'proxy_node_metrics_cleanup_batch_size',
value: systemConfig.value.proxy_node_metrics_cleanup_batch_size,
description: '代理节点指标每批次清理条数',
},
]
await Promise.all(
@@ -462,6 +492,12 @@ export function useSystemConfig() {
systemConfig.value.request_candidates_retention_days
originalConfig.value.request_candidates_cleanup_batch_size =
systemConfig.value.request_candidates_cleanup_batch_size
originalConfig.value.proxy_node_metrics_1m_retention_days =
systemConfig.value.proxy_node_metrics_1m_retention_days
originalConfig.value.proxy_node_metrics_1h_retention_days =
systemConfig.value.proxy_node_metrics_1h_retention_days
originalConfig.value.proxy_node_metrics_cleanup_batch_size =
systemConfig.value.proxy_node_metrics_cleanup_batch_size
}
success('请求记录清理配置已保存')
} catch (err) {