@@ -37,43 +37,6 @@ public class RackMonitoringService {
3737 private static final double DISK_WARNING_THRESHOLD = 70.0 ;
3838 private static final double DISK_CRITICAL_THRESHOLD = 90.0 ;
3939
40- public RackStatisticsDto calculateRackStatistics (Long rackId ) {
41- log .debug ("📊 랙 통계 계산 시작: rackId={}" , rackId );
42-
43- Rack rack = rackRepository .findById (rackId )
44- .orElseThrow (() -> new IllegalArgumentException ("랙을 찾을 수 없습니다: " + rackId ));
45-
46- LocalDateTime now = LocalDateTime .now ();
47- List <Equipment > equipments = equipmentRepository .findByRackIdAndDelYn (rackId , DelYN .N );
48-
49- if (equipments .isEmpty ()) {
50- log .debug ("⚠️ 랙에 활성 장비가 없습니다: rackId={}" , rackId );
51- return createEmptyStatistics (rack , now );
52- }
53-
54- List <Long > equipmentIds = equipments .stream ()
55- .map (Equipment ::getId )
56- .collect (Collectors .toList ());
57-
58- RackStatisticsDto .EnvironmentStats environmentStats = getEnvironmentStats (rackId );
59- RackStatisticsDto .RackSummary rackSummary = calculateRackSummary (equipments , equipmentIds );
60- RackStatisticsDto .CpuStats cpuStats = calculateCpuStats (equipments , equipmentIds );
61- RackStatisticsDto .MemoryStats memoryStats = calculateMemoryStats (equipments , equipmentIds );
62- RackStatisticsDto .DiskStats diskStats = calculateDiskStats (equipments , equipmentIds );
63- RackStatisticsDto .NetworkStats networkStats = calculateNetworkStats (equipments , equipmentIds );
64-
65- return RackStatisticsDto .builder ()
66- .rackId (rackId )
67- .rackName (rack .getRackName ())
68- .timestamp (now )
69- .environment (environmentStats )
70- .rackSummary (rackSummary )
71- .cpuStats (cpuStats )
72- .memoryStats (memoryStats )
73- .diskStats (diskStats )
74- .networkStats (networkStats )
75- .build ();
76- }
7740
7841 private RackStatisticsDto .EnvironmentStats getEnvironmentStats (Long rackId ) {
7942 EnvironmentMetric metric = metricCache .getEnvironmentMetric (rackId ).orElse (null );
@@ -451,6 +414,126 @@ private AggregatedNetworkMetric aggregateNicMetrics(List<NetworkMetric> nicMetri
451414 return result ;
452415 }
453416
417+
418+
419+ private static class AggregatedNetworkMetric {
420+ double rxUsage = 0.0 ;
421+ double txUsage = 0.0 ;
422+ double inBytesPerSec = 0.0 ;
423+ double outBytesPerSec = 0.0 ;
424+ long inPktsTot = 0L ;
425+ long outPktsTot = 0L ;
426+ long inErrorPktsTot = 0L ;
427+ long outErrorPktsTot = 0L ;
428+ long inDiscardPktsTot = 0L ;
429+ long outDiscardPktsTot = 0L ;
430+ }
431+
432+ // RackMonitoringService.java
433+
434+ public RackStatisticsDto calculateRackStatistics (Long rackId ) {
435+ log .debug ("📊 랙 통계 계산 시작: rackId={}" , rackId );
436+
437+ Rack rack = rackRepository .findById (rackId )
438+ .orElseThrow (() -> new IllegalArgumentException ("랙을 찾을 수 없습니다: " + rackId ));
439+
440+ LocalDateTime now = LocalDateTime .now ();
441+ List <Equipment > equipments = equipmentRepository .findByRackIdAndDelYn (rackId , DelYN .N );
442+
443+ if (equipments .isEmpty ()) {
444+ log .debug ("⚠️ 랙에 활성 장비가 없습니다: rackId={}" , rackId );
445+ return createEmptyStatistics (rack , now );
446+ }
447+
448+ List <Long > equipmentIds = equipments .stream ()
449+ .map (Equipment ::getId )
450+ .collect (Collectors .toList ());
451+
452+ RackStatisticsDto .EnvironmentStats environmentStats = getEnvironmentStats (rackId );
453+ RackStatisticsDto .RackSummary rackSummary = calculateRackSummary (equipments , equipmentIds );
454+ RackStatisticsDto .CpuStats cpuStats = calculateCpuStats (equipments , equipmentIds );
455+ RackStatisticsDto .SystemLoadStats systemLoadStats = calculateSystemLoadStats (equipments , equipmentIds ); // ✅ 추가
456+ RackStatisticsDto .MemoryStats memoryStats = calculateMemoryStats (equipments , equipmentIds );
457+ RackStatisticsDto .DiskStats diskStats = calculateDiskStats (equipments , equipmentIds );
458+ RackStatisticsDto .NetworkStats networkStats = calculateNetworkStats (equipments , equipmentIds );
459+
460+ return RackStatisticsDto .builder ()
461+ .rackId (rackId )
462+ .rackName (rack .getRackName ())
463+ .timestamp (now )
464+ .environment (environmentStats )
465+ .rackSummary (rackSummary )
466+ .cpuStats (cpuStats )
467+ .systemLoadStats (systemLoadStats ) // ✅ 추가
468+ .memoryStats (memoryStats )
469+ .diskStats (diskStats )
470+ .networkStats (networkStats )
471+ .build ();
472+ }
473+
474+ // ✅ 새로운 메서드 추가
475+ private RackStatisticsDto .SystemLoadStats calculateSystemLoadStats (
476+ List <Equipment > equipments , List <Long > equipmentIds ) {
477+
478+ List <SystemMetric > metrics = new ArrayList <>();
479+ for (Long equipmentId : equipmentIds ) {
480+ metricCache .getSystemMetric (equipmentId ).ifPresent (metrics ::add );
481+ }
482+
483+ if (metrics .isEmpty ()) {
484+ return RackStatisticsDto .SystemLoadStats .builder ().equipmentCount (0 ).build ();
485+ }
486+
487+ // 1분 평균 부하
488+ double avgLoadAvg1 = metrics .stream ()
489+ .filter (m -> m .getLoadAvg1 () != null )
490+ .mapToDouble (SystemMetric ::getLoadAvg1 )
491+ .average ()
492+ .orElse (0.0 );
493+
494+ double maxLoadAvg1 = metrics .stream ()
495+ .filter (m -> m .getLoadAvg1 () != null )
496+ .mapToDouble (SystemMetric ::getLoadAvg1 )
497+ .max ()
498+ .orElse (0.0 );
499+
500+ // 5분 평균 부하
501+ double avgLoadAvg5 = metrics .stream ()
502+ .filter (m -> m .getLoadAvg5 () != null )
503+ .mapToDouble (SystemMetric ::getLoadAvg5 )
504+ .average ()
505+ .orElse (0.0 );
506+
507+ double maxLoadAvg5 = metrics .stream ()
508+ .filter (m -> m .getLoadAvg5 () != null )
509+ .mapToDouble (SystemMetric ::getLoadAvg5 )
510+ .max ()
511+ .orElse (0.0 );
512+
513+ // 15분 평균 부하
514+ double avgLoadAvg15 = metrics .stream ()
515+ .filter (m -> m .getLoadAvg15 () != null )
516+ .mapToDouble (SystemMetric ::getLoadAvg15 )
517+ .average ()
518+ .orElse (0.0 );
519+
520+ double maxLoadAvg15 = metrics .stream ()
521+ .filter (m -> m .getLoadAvg15 () != null )
522+ .mapToDouble (SystemMetric ::getLoadAvg15 )
523+ .max ()
524+ .orElse (0.0 );
525+
526+ return RackStatisticsDto .SystemLoadStats .builder ()
527+ .avgLoadAvg1 (avgLoadAvg1 )
528+ .avgLoadAvg5 (avgLoadAvg5 )
529+ .avgLoadAvg15 (avgLoadAvg15 )
530+ .maxLoadAvg1 (maxLoadAvg1 )
531+ .maxLoadAvg5 (maxLoadAvg5 )
532+ .maxLoadAvg15 (maxLoadAvg15 )
533+ .equipmentCount (metrics .size ())
534+ .build ();
535+ }
536+
454537 private RackStatisticsDto createEmptyStatistics (Rack rack , LocalDateTime now ) {
455538 return RackStatisticsDto .builder ()
456539 .rackId (rack .getId ())
@@ -465,22 +548,10 @@ private RackStatisticsDto createEmptyStatistics(Rack rack, LocalDateTime now) {
465548 .activeEquipmentTypes (Collections .emptyList ())
466549 .build ())
467550 .cpuStats (RackStatisticsDto .CpuStats .builder ().equipmentCount (0 ).build ())
551+ .systemLoadStats (RackStatisticsDto .SystemLoadStats .builder ().equipmentCount (0 ).build ()) // ✅ 추가
468552 .memoryStats (RackStatisticsDto .MemoryStats .builder ().equipmentCount (0 ).build ())
469553 .diskStats (RackStatisticsDto .DiskStats .builder ().equipmentCount (0 ).build ())
470554 .networkStats (RackStatisticsDto .NetworkStats .builder ().equipmentCount (0 ).build ())
471555 .build ();
472556 }
473-
474- private static class AggregatedNetworkMetric {
475- double rxUsage = 0.0 ;
476- double txUsage = 0.0 ;
477- double inBytesPerSec = 0.0 ;
478- double outBytesPerSec = 0.0 ;
479- long inPktsTot = 0L ;
480- long outPktsTot = 0L ;
481- long inErrorPktsTot = 0L ;
482- long outErrorPktsTot = 0L ;
483- long inDiscardPktsTot = 0L ;
484- long outDiscardPktsTot = 0L ;
485- }
486557}
0 commit comments