issue-ai/scripts/migrate-monitor-data.ts

54 lines
2.4 KiB
TypeScript

// 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<string, ServerData>][]) {
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}`)