diff --git a/src/api/ops/room-device.ts b/src/api/ops/room-device.ts index 31fe140..cad8a1c 100644 --- a/src/api/ops/room-device.ts +++ b/src/api/ops/room-device.ts @@ -12,6 +12,13 @@ export interface RoomDeviceItem { room_id: string device_category: string agent_config: string + collect_method: 'api' | 'snmp' + snmp_target: string + snmp_port: number + snmp_community: string + snmp_timeout_ms: number + snmp_retries: number + snmp_oids: string enabled: boolean collect_on: boolean collect_interval: number @@ -45,6 +52,13 @@ export interface RoomDeviceCreateData { room_id: string device_category: string agent_config?: string + collect_method?: 'api' | 'snmp' + snmp_target?: string + snmp_port?: number + snmp_community?: string + snmp_timeout_ms?: number + snmp_retries?: number + snmp_oids?: string enabled?: boolean collect_on?: boolean collect_interval?: number @@ -58,6 +72,13 @@ export interface RoomDeviceUpdateData { room_id?: string device_category?: string agent_config?: string + collect_method?: 'api' | 'snmp' + snmp_target?: string + snmp_port?: number + snmp_community?: string + snmp_timeout_ms?: number + snmp_retries?: number + snmp_oids?: string enabled?: boolean collect_on?: boolean collect_interval?: number @@ -66,9 +87,16 @@ export interface RoomDeviceUpdateData { /** 机房设备采集配置数据 */ export interface RoomDeviceCollectData { + collect_method?: 'api' | 'snmp' + agent_config?: string + snmp_target?: string + snmp_port?: number + snmp_community?: string + snmp_timeout_ms?: number + snmp_retries?: number + snmp_oids?: string collect_on?: boolean collect_interval?: number - agent_config?: string } /** 指标数据项 */ diff --git a/src/api/ops/security.ts b/src/api/ops/security.ts index af5aa18..01f9395 100644 --- a/src/api/ops/security.ts +++ b/src/api/ops/security.ts @@ -19,6 +19,13 @@ export interface SecurityServiceItem { tags: string status_url: string agent_config: string + collect_method: 'api' | 'snmp' + snmp_target: string + snmp_port: number + snmp_community: string + snmp_timeout_ms: number + snmp_retries: number + snmp_oids: string collect_on: boolean collect_args: string collect_interval: number @@ -65,6 +72,13 @@ export interface SecurityServiceFormData { tags?: string status_url?: string agent_config?: string + collect_method?: 'api' | 'snmp' + snmp_target?: string + snmp_port?: number + snmp_community?: string + snmp_timeout_ms?: number + snmp_retries?: number + snmp_oids?: string collect_on?: boolean collect_args?: string collect_interval?: number @@ -120,6 +134,14 @@ export const fetchSecurityMetricsLatest = (serviceIdentity: string) => { /** 采集配置补丁参数 */ export interface SecurityServicePatchData { + collect_method?: 'api' | 'snmp' + agent_config?: string + snmp_target?: string + snmp_port?: number + snmp_community?: string + snmp_timeout_ms?: number + snmp_retries?: number + snmp_oids?: string collect_on?: boolean collect_interval?: number } diff --git a/src/api/ops/storage.ts b/src/api/ops/storage.ts index dc5106f..ee39bd5 100644 --- a/src/api/ops/storage.ts +++ b/src/api/ops/storage.ts @@ -19,6 +19,13 @@ export interface StorageItem { tags: string status_url: string agent_config: string + collect_method: 'api' | 'snmp' + snmp_target: string + snmp_port: number + snmp_community: string + snmp_timeout_ms: number + snmp_retries: number + snmp_oids: string collect_on: boolean collect_args: string collect_interval: number @@ -65,6 +72,13 @@ export interface StorageCreateData { tags?: string status_url?: string agent_config?: string + collect_method?: 'api' | 'snmp' + snmp_target?: string + snmp_port?: number + snmp_community?: string + snmp_timeout_ms?: number + snmp_retries?: number + snmp_oids?: string collect_on?: boolean collect_args?: string collect_interval?: number @@ -86,6 +100,13 @@ export interface StorageUpdateData { tags?: string status_url?: string agent_config?: string + collect_method?: 'api' | 'snmp' + snmp_target?: string + snmp_port?: number + snmp_community?: string + snmp_timeout_ms?: number + snmp_retries?: number + snmp_oids?: string collect_on?: boolean collect_args?: string collect_interval?: number @@ -151,6 +172,14 @@ export const fetchStorageMetricsLatest = (serviceIdentity: string) => { /** 采集配置补丁 */ export interface StoragePatchData { + collect_method?: 'api' | 'snmp' + agent_config?: string + snmp_target?: string + snmp_port?: number + snmp_community?: string + snmp_timeout_ms?: number + snmp_retries?: number + snmp_oids?: string collect_on?: boolean collect_interval?: number } diff --git a/src/views/ops/pages/dc/device-collect/components/Detail.vue b/src/views/ops/pages/dc/device-collect/components/Detail.vue index b6bed99..ae5b460 100644 --- a/src/views/ops/pages/dc/device-collect/components/Detail.vue +++ b/src/views/ops/pages/dc/device-collect/components/Detail.vue @@ -10,10 +10,22 @@ {{ record.room_id }} {{ record.description || '-' }} - - {{ record.agent_config }} + + + {{ record.collect_method === 'snmp' ? 'SNMP' : 'API' }} + + + + {{ record.agent_config }} + {{ record.snmp_target || '-' }} - + + {{ (record.snmp_community || '-') + ' @ ' + (record.snmp_port || 161) }} + + + {{ (record.snmp_timeout_ms || 3000) + 'ms / ' + (record.snmp_retries ?? 1) }} + diff --git a/src/views/ops/pages/dc/device-collect/components/FormDialog.vue b/src/views/ops/pages/dc/device-collect/components/FormDialog.vue index cd46da4..a0c98e3 100644 --- a/src/views/ops/pages/dc/device-collect/components/FormDialog.vue +++ b/src/views/ops/pages/dc/device-collect/components/FormDialog.vue @@ -38,10 +38,58 @@ - - + 采集协议与连接 + + + API + SNMP + + + + @@ -110,6 +158,13 @@ const formData = reactive({ room_id: '', device_category: '', agent_config: '', + collect_method: 'api' as 'api' | 'snmp', + snmp_target: '', + snmp_port: 161, + snmp_community: '', + snmp_timeout_ms: 3000, + snmp_retries: 1, + snmp_oids: '', enabled: true, collect_on: true, collect_interval: 60, @@ -149,6 +204,13 @@ watch( room_id: props.record.room_id || '', device_category: props.record.device_category || '', agent_config: props.record.agent_config || '', + collect_method: props.record.collect_method || 'api', + snmp_target: props.record.snmp_target || '', + snmp_port: props.record.snmp_port || 161, + snmp_community: props.record.snmp_community || '', + snmp_timeout_ms: props.record.snmp_timeout_ms || 3000, + snmp_retries: props.record.snmp_retries ?? 1, + snmp_oids: props.record.snmp_oids || '', enabled: props.record.enabled ?? true, collect_on: props.record.collect_on ?? true, collect_interval: props.record.collect_interval || 60, @@ -161,6 +223,13 @@ watch( room_id: '', device_category: '', agent_config: '', + collect_method: 'api', + snmp_target: '', + snmp_port: 161, + snmp_community: '', + snmp_timeout_ms: 3000, + snmp_retries: 1, + snmp_oids: '', enabled: true, collect_on: true, collect_interval: 60, @@ -174,6 +243,24 @@ watch( const handleOk = async () => { try { await formRef.value?.validate() + if (formData.collect_method === 'api' && !formData.agent_config?.trim()) { + Message.warning('API 模式下请填写采集地址') + return + } + if (formData.collect_method === 'snmp') { + if (!formData.snmp_target?.trim() || !formData.snmp_community?.trim()) { + Message.warning('SNMP 模式下请填写目标地址和 community') + return + } + if (formData.snmp_oids?.trim()) { + try { + JSON.parse(formData.snmp_oids) + } catch { + Message.warning('SNMP OID 配置必须是合法 JSON') + return + } + } + } confirmLoading.value = true @@ -184,6 +271,13 @@ const handleOk = async () => { room_id: formData.room_id, device_category: formData.device_category, agent_config: formData.agent_config, + collect_method: formData.collect_method, + snmp_target: formData.snmp_target, + snmp_port: formData.snmp_port, + snmp_community: formData.snmp_community, + snmp_timeout_ms: formData.snmp_timeout_ms, + snmp_retries: formData.snmp_retries, + snmp_oids: formData.snmp_oids, enabled: formData.enabled, collect_on: formData.collect_on, collect_interval: formData.collect_interval, @@ -198,6 +292,13 @@ const handleOk = async () => { room_id: formData.room_id, device_category: formData.device_category, agent_config: formData.agent_config, + collect_method: formData.collect_method, + snmp_target: formData.snmp_target, + snmp_port: formData.snmp_port, + snmp_community: formData.snmp_community, + snmp_timeout_ms: formData.snmp_timeout_ms, + snmp_retries: formData.snmp_retries, + snmp_oids: formData.snmp_oids, enabled: formData.enabled, collect_on: formData.collect_on, collect_interval: formData.collect_interval, diff --git a/src/views/ops/pages/dc/device-collect/components/QuickConfigDialog.vue b/src/views/ops/pages/dc/device-collect/components/QuickConfigDialog.vue index c321cf6..9f8cfab 100644 --- a/src/views/ops/pages/dc/device-collect/components/QuickConfigDialog.vue +++ b/src/views/ops/pages/dc/device-collect/components/QuickConfigDialog.vue @@ -1,6 +1,30 @@ - - - - @@ -38,18 +56,24 @@ const emit = defineEmits(['update:visible', 'success']) const loading = ref(false) const form = ref({ + collect_method: 'api' as 'api' | 'snmp', collect_on: true, collect_interval: 60, agent_config: '', + snmp_target: '', + snmp_community: '', }) watch( () => props.visible, (val) => { if (val && props.record) { + form.value.collect_method = props.record.collect_method || 'api' form.value.collect_on = props.record.collect_on ?? true form.value.collect_interval = props.record.collect_interval || 60 form.value.agent_config = props.record.agent_config || '' + form.value.snmp_target = props.record.snmp_target || '' + form.value.snmp_community = props.record.snmp_community || '' } } ) @@ -58,9 +82,12 @@ const handleSubmit = async () => { loading.value = true try { const data: RoomDeviceCollectData = { + collect_method: form.value.collect_method, collect_on: form.value.collect_on, collect_interval: form.value.collect_interval, - agent_config: form.value.agent_config, + agent_config: form.value.collect_method === 'api' ? form.value.agent_config : undefined, + snmp_target: form.value.collect_method === 'snmp' ? form.value.snmp_target : undefined, + snmp_community: form.value.collect_method === 'snmp' ? form.value.snmp_community : undefined, } await patchRoomDeviceCollect(props.record.id, data) diff --git a/src/views/ops/pages/dc/device-collect/config/columns.ts b/src/views/ops/pages/dc/device-collect/config/columns.ts index 2492c12..0ceb038 100644 --- a/src/views/ops/pages/dc/device-collect/config/columns.ts +++ b/src/views/ops/pages/dc/device-collect/config/columns.ts @@ -38,6 +38,12 @@ export const columns = [ width: 100, slotName: 'enabled', }, + { + dataIndex: 'collect_method', + title: '采集方式', + width: 100, + slotName: 'collect_method', + }, { dataIndex: 'collect_on', title: '数据采集', diff --git a/src/views/ops/pages/dc/device-collect/index.vue b/src/views/ops/pages/dc/device-collect/index.vue index db316e6..806f993 100644 --- a/src/views/ops/pages/dc/device-collect/index.vue +++ b/src/views/ops/pages/dc/device-collect/index.vue @@ -40,6 +40,11 @@ {{ record.collect_on ? '已启用' : '未启用' }} + + +