Files
makemd/server/src/services/ServiceHealthCheck.ts

276 lines
7.5 KiB
TypeScript
Raw Normal View History

/**
* [OP-MV002]
* @description
* @version 1.0
*/
export class ServiceHealthCheck {
/**
*
* @param params
* @param traceInfo
* @returns
*/
public static async checkMerchantServiceHealth(params: {
merchantId?: string;
services?: string[];
}, traceInfo: {
tenantId: string;
shopId: string;
taskId: string;
traceId: string;
businessType: 'TOC' | 'TOB';
}): Promise<{
overallStatus: 'healthy' | 'degraded' | 'unhealthy';
services: Array<{
serviceName: string;
status: 'healthy' | 'degraded' | 'unhealthy';
responseTime: number;
errorCount: number;
lastChecked: string;
}>;
recommendations: string[];
}> {
// 模拟服务列表
const servicesToCheck = params.services || [
'inventory',
'order',
'payment',
'shipping',
'notification'
];
// 模拟健康检查结果
const services = servicesToCheck.map(service => {
// 生成随机响应时间和错误数
const responseTime = Math.floor(Math.random() * 500) + 50;
const errorCount = Math.floor(Math.random() * 5);
// 计算服务状态
let status: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';
if (errorCount > 3 || responseTime > 400) {
status = 'unhealthy';
} else if (errorCount > 1 || responseTime > 200) {
status = 'degraded';
}
return {
serviceName: service,
status,
responseTime,
errorCount,
lastChecked: new Date().toISOString()
};
});
// 计算整体状态
const unhealthyCount = services.filter(s => s.status === 'unhealthy').length;
const degradedCount = services.filter(s => s.status === 'degraded').length;
let overallStatus: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';
if (unhealthyCount > 0) {
overallStatus = 'unhealthy';
} else if (degradedCount > 0) {
overallStatus = 'degraded';
}
// 生成建议
const recommendations: string[] = [];
if (overallStatus === 'unhealthy') {
recommendations.push('立即检查不健康的服务');
recommendations.push('考虑重启相关服务');
} else if (overallStatus === 'degraded') {
recommendations.push('检查性能瓶颈');
recommendations.push('优化响应时间');
} else {
recommendations.push('保持当前状态');
recommendations.push('定期进行健康检查');
}
// 记录健康检查日志
console.log(`[ServiceHealthCheck] 健康检查完成 - 整体状态: ${overallStatus}`, {
...traceInfo,
servicesCount: services.length,
unhealthyCount,
degradedCount
});
return {
overallStatus,
services,
recommendations
};
}
/**
*
* @param merchantId ID
* @param traceInfo
* @returns
*/
public static async generateHealthReport(merchantId: string, traceInfo: {
tenantId: string;
shopId: string;
taskId: string;
traceId: string;
businessType: 'TOC' | 'TOB';
}): Promise<{
reportId: string;
merchantId: string;
timestamp: string;
overallStatus: string;
serviceDetails: any;
performanceMetrics: any;
recommendations: string[];
}> {
// 生成报告ID
const reportId = `HR-${Date.now()}`;
const timestamp = new Date().toISOString();
// 模拟服务健康数据
const serviceDetails = {
inventory: {
status: 'healthy',
responseTime: 120,
errorRate: 0.01
},
order: {
status: 'degraded',
responseTime: 250,
errorRate: 0.05
},
payment: {
status: 'healthy',
responseTime: 90,
errorRate: 0.005
},
shipping: {
status: 'healthy',
responseTime: 150,
errorRate: 0.02
},
notification: {
status: 'healthy',
responseTime: 80,
errorRate: 0.01
}
};
// 计算整体状态
const overallStatus = Object.values(serviceDetails).some(s => s.status === 'unhealthy')
? 'unhealthy'
: Object.values(serviceDetails).some(s => s.status === 'degraded')
? 'degraded'
: 'healthy';
// 计算性能指标
const performanceMetrics = {
averageResponseTime: Object.values(serviceDetails).reduce((sum, s) => sum + s.responseTime, 0) / Object.values(serviceDetails).length,
averageErrorRate: Object.values(serviceDetails).reduce((sum, s) => sum + s.errorRate, 0) / Object.values(serviceDetails).length,
healthyServices: Object.values(serviceDetails).filter(s => s.status === 'healthy').length,
totalServices: Object.values(serviceDetails).length
};
// 生成建议
const recommendations = [
overallStatus === 'unhealthy' ? '立即修复不健康的服务' : '保持服务健康状态',
performanceMetrics.averageResponseTime > 200 ? '优化服务响应时间' : '响应时间正常',
performanceMetrics.averageErrorRate > 0.05 ? '减少服务错误率' : '错误率在可接受范围内'
];
// 记录报告生成日志
console.log(`[ServiceHealthCheck] 生成健康报告 - ID: ${reportId}, 商户: ${merchantId}`, {
...traceInfo,
reportId
});
return {
reportId,
merchantId,
timestamp,
overallStatus,
serviceDetails,
performanceMetrics,
recommendations
};
}
/**
*
* @param params
* @param traceInfo
* @returns
*/
public static async testServiceAvailability(params: {
merchantId: string;
services: string[];
testDuration: number; // 测试持续时间(秒)
}, traceInfo: {
tenantId: string;
shopId: string;
taskId: string;
traceId: string;
businessType: 'TOC' | 'TOB';
}): Promise<{
testId: string;
merchantId: string;
startTime: string;
endTime: string;
results: Array<{
serviceName: string;
availability: number; // 可用性百分比
responseTimes: number[];
errorCount: number;
}>;
}> {
// 生成测试ID
const testId = `AT-${Date.now()}`;
const startTime = new Date().toISOString();
// 模拟测试结果
const results = params.services.map(service => {
// 生成模拟响应时间和错误数
const responseTimes: number[] = [];
let errorCount = 0;
// 模拟测试过程
for (let i = 0; i < 10; i++) {
const responseTime = Math.floor(Math.random() * 300) + 50;
responseTimes.push(responseTime);
if (Math.random() < 0.05) {
errorCount++;
}
}
// 计算可用性
const availability = ((10 - errorCount) / 10) * 100;
return {
serviceName: service,
availability,
responseTimes,
errorCount
};
});
// 模拟测试持续时间
await new Promise(resolve => setTimeout(resolve, params.testDuration * 1000));
const endTime = new Date().toISOString();
// 记录测试日志
console.log(`[ServiceHealthCheck] 服务可用性测试完成 - ID: ${testId}, 商户: ${params.merchantId}`, {
...traceInfo,
testId,
duration: params.testDuration
});
return {
testId,
merchantId: params.merchantId,
startTime,
endTime,
results
};
}
}