// scripts/migrate-monitor-data.ts // 从 zabbix-01 拉取历史数据并迁移到 issue-ai SQLite // 用法: ssh zabbix-01 "cat /opt/scripts/.../server_availability_data.json" | tsx scripts/migrate-monitor-data.ts import { execSync } from 'child_process' import { getDb } from '../src/lib/db' import { initDatabase } from '../src/lib/db-schema' initDatabase() const db = getDb() interface FaultRecord { fault_time: string; fault_type: string; order_number: string; recovery_time: string | null; duration: number | null; status: string } interface ServerData { server_ip: string; fault_records: FaultRecord[]; total_fault_duration: number; ongoing_faults: string[] } // 拉取 server_availability_data.json console.log('从 zabbix-01 拉取数据...') const availData = JSON.parse(execSync('ssh zabbix-01 "cat /opt/scripts/mail_monitor_wechat/data/server_availability_data.json"', { encoding: 'utf-8' })) let migrated = 0, matched = 0, skipped = 0, errors = 0 for (const [monthKey, servers] of Object.entries(availData) as [string, Record][]) { for (const [sn, serverData] of Object.entries(servers)) { for (const record of serverData.fault_records) { try { // 检查工单是否存在 if (record.order_number) { const ticket = db.prepare('SELECT id FROM tickets WHERE id = ?').get(parseInt(record.order_number)) if (!ticket) { skipped++; continue } matched++ } // 检查是否已存在 const existing = db.prepare('SELECT id FROM fault_records WHERE server_sn = ? AND fault_time = ?').get(sn, record.fault_time) if (existing) { skipped++; continue } const status = record.status === 'resolved' ? 'resolved' : 'ongoing' db.prepare(` INSERT INTO fault_records (server_sn, server_ip, order_number, fault_type, fault_time, recovery_time, duration_seconds, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?) `).run(sn, serverData.server_ip, record.order_number, record.fault_type, record.fault_time, record.recovery_time, record.duration, status) migrated++ } catch (e) { errors++ console.error(`迁移失败: ${sn} - ${record.fault_time}: ${e}`) } } } } console.log(`\n迁移完成:`) console.log(` 成功: ${migrated}`) console.log(` 匹配工单: ${matched}`) console.log(` 跳过: ${skipped}`) console.log(` 错误: ${errors}`)