Skip to main content
Glama

MCP SQL Server

by ryudg
InMemoryPerformanceAlertRepository.ts3.48 kB
import { PerformanceAlertRepository } from '../../domain/performance/services/PerformanceDomainService.js'; import { PerformanceAlert, AlertId, AlertType, } from '../../domain/performance/entities/PerformanceAlert.js'; export class InMemoryPerformanceAlertRepository implements PerformanceAlertRepository { private alerts: Map<string, PerformanceAlert> = new Map(); private alertsHistory: PerformanceAlert[] = []; private readonly maxHistorySize = 500; // 최대 500개 알림 보관 async save(alert: PerformanceAlert): Promise<void> { const existingAlert = this.alerts.get(alert.id.value); this.alerts.set(alert.id.value, alert); // 새로운 알림인 경우 히스토리에 추가 if (!existingAlert) { this.alertsHistory.push(alert); this.alertsHistory.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()); // 최대 크기 초과시 오래된 알림 제거 if (this.alertsHistory.length > this.maxHistorySize) { const removedAlerts = this.alertsHistory.splice(this.maxHistorySize); removedAlerts.forEach(removedAlert => { this.alerts.delete(removedAlert.id.value); }); } } } async findById(id: AlertId): Promise<PerformanceAlert | null> { return this.alerts.get(id.value) || null; } async findActive(): Promise<PerformanceAlert[]> { return Array.from(this.alerts.values()).filter(alert => alert.isActive()); } async findAll(): Promise<PerformanceAlert[]> { return Array.from(this.alerts.values()); } async findByType(type: AlertType): Promise<PerformanceAlert[]> { return Array.from(this.alerts.values()).filter(alert => alert.type === type); } // 추가 유틸리티 메서드 async findAcknowledged(): Promise<PerformanceAlert[]> { return Array.from(this.alerts.values()).filter(alert => alert.isAcknowledged()); } async findResolved(): Promise<PerformanceAlert[]> { return Array.from(this.alerts.values()).filter(alert => alert.isResolved()); } async findCritical(): Promise<PerformanceAlert[]> { return Array.from(this.alerts.values()).filter(alert => alert.isCritical()); } async findEscalationCandidates(thresholdMinutes: number = 30): Promise<PerformanceAlert[]> { return Array.from(this.alerts.values()).filter(alert => alert.shouldEscalate(thresholdMinutes)); } async getAlertStatistics(): Promise<{ total: number; active: number; acknowledged: number; resolved: number; critical: number; byType: Record<AlertType, number>; }> { const allAlerts = Array.from(this.alerts.values()); const stats = { total: allAlerts.length, active: allAlerts.filter(a => a.isActive()).length, acknowledged: allAlerts.filter(a => a.isAcknowledged()).length, resolved: allAlerts.filter(a => a.isResolved()).length, critical: allAlerts.filter(a => a.isCritical()).length, byType: {} as Record<AlertType, number>, }; // 타입별 통계 const alertTypes: AlertType[] = [ 'connection_pool_high_utilization', 'slow_query_detected', 'high_cpu_usage', 'high_memory_usage', 'high_disk_usage', 'connection_timeout', 'query_timeout', ]; alertTypes.forEach(type => { stats.byType[type] = allAlerts.filter(a => a.type === type).length; }); return stats; } async clear(): Promise<void> { this.alerts.clear(); this.alertsHistory = []; } }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ryudg/mcp-sql'

If you have feedback or need assistance with the MCP directory API, please join our Discord server