浏览代码

add system health check

shjung 2 月之前
父节点
当前提交
ccf94d658f
共有 15 个文件被更改,包括 55 次插入73 次删除
  1. 0 1
      moct-utic-server/src/main/java/com/utic/its/moct/utic/server/MoctUticServerApplication.java
  2. 0 4
      moct-utic-server/src/main/java/com/utic/its/moct/utic/server/config/ApplicationConfig.java
  3. 3 12
      moct-utic-server/src/main/java/com/utic/its/moct/utic/server/config/DatabaseConfig.java
  4. 3 3
      moct-utic-server/src/main/java/com/utic/its/moct/utic/server/scheduler/ApplicationScheduler.java
  5. 2 0
      rota-utic-client/build.gradle
  6. 0 1
      rota-utic-client/src/main/java/com/utic/its/rota/utic/client/RotaUticClientApplication.java
  7. 0 4
      rota-utic-client/src/main/java/com/utic/its/rota/utic/client/config/ApplicationConfig.java
  8. 4 12
      rota-utic-client/src/main/java/com/utic/its/rota/utic/client/config/DatabaseConfig.java
  9. 3 3
      rota-utic-client/src/main/java/com/utic/its/rota/utic/client/scheduler/ApplicationScheduler.java
  10. 7 3
      rota-utic-client/src/main/java/com/utic/its/rota/utic/client/service/ApplicationService.java
  11. 0 1
      rota-utic-server/src/main/java/com/utic/its/rota/utic/server/RotaUticServerApplication.java
  12. 0 4
      rota-utic-server/src/main/java/com/utic/its/rota/utic/server/config/ApplicationConfig.java
  13. 3 12
      rota-utic-server/src/main/java/com/utic/its/rota/utic/server/config/DatabaseConfig.java
  14. 3 3
      rota-utic-server/src/main/java/com/utic/its/rota/utic/server/scheduler/ApplicationScheduler.java
  15. 27 10
      utic-its-common/src/main/java/com/utic/its/common/utils/SystemHealth.java

+ 0 - 1
moct-utic-server/src/main/java/com/utic/its/moct/utic/server/MoctUticServerApplication.java

@@ -110,7 +110,6 @@ public class MoctUticServerApplication implements CommandLineRunner, Application
         itsAsnCommServerService.run();
 
         if (clusterConfig.isEnabled()) {
-            applicationConfig.setClusterId(clusterConfig.getId());
             clusterConfig.loggingInfo();
 
             ClusterMasterService clusterMasterService = SpringUtils.getBean(ClusterMasterService.class);

+ 0 - 4
moct-utic-server/src/main/java/com/utic/its/moct/utic/server/config/ApplicationConfig.java

@@ -65,8 +65,4 @@ public class ApplicationConfig extends NettyServerConfig {
         log.info("[ApplicationConfig]         workerThreads: {}", this.workerThreads);
     }
 
-    public void setClusterId(int clusterId) {
-        this.processName = this.processName + "-" + clusterId;
-    }
-
 }

+ 3 - 12
moct-utic-server/src/main/java/com/utic/its/moct/utic/server/config/DatabaseConfig.java

@@ -76,23 +76,14 @@ public class DatabaseConfig {
 //        return DataSourceBuilder.create().type(HikariDataSource.class).build();
     }
 
-    private static @NotNull String getString() {
-        final String moduleName = "utic-ptis-server";
-        final String actionName = "Transfer ITS to MOCT";
-//            final String clientIdentifier = "its";
-//            final String clientInfo = "BatchJob: TrafficProcessor v1.2";
-//            return new OracleAwareDataSource(hikari, this.moduleName, actionName, clientIdentifier, clientInfo);
+    private @NotNull String getString() {
+        final String moduleName = this.config.getProcessName();
+        final String actionName = "UTIC MOCT Traffic Send Server";
         final String connInitSql;
         connInitSql = String.format(
                 "BEGIN DBMS_APPLICATION_INFO.SET_MODULE('%s', '%s'); END;",
                 moduleName, actionName
         );
-//        dataSource.setConnectionInitSql(
-//                "BEGIN " +
-//                        "DBMS_APPLICATION_INFO.SET_MODULE('MyAppScheduler', 'BatchJobEveryMinute'); " +
-//                        "DBMS_SESSION.SET_IDENTIFIER('seungho'); " +
-//                        "END;"
-//        );
         return connInitSql;
     }
 

+ 3 - 3
moct-utic-server/src/main/java/com/utic/its/moct/utic/server/scheduler/ApplicationScheduler.java

@@ -118,7 +118,7 @@ public class ApplicationScheduler {
     private void loggingSystemHealth() {
         double loadAvg = this.systemHealth.getLoadAverage();
         String loadAvgStr = (loadAvg < 0) ? "N/A" : this.df.format(loadAvg);
-        log.info("SYSTEM HEALTH: CPU {} Cores[{} %, LoadAvg({})], Memory[{} %, Used({} MB), Max({} MB)], Threads[{}, Peak({})], GC[{}, {} ms]",
+        log.info("SYSTEM HEALTH: CPU {} Cores[{} %, LoadAvg({})], Memory[{} %, Used({} MB), Max({} MB)], Threads[{}, Peak({})], GC(T/R)[{}/{} ms]",
                 this.systemHealth.getCpuCores(),
                 this.df.format(this.systemHealth.getCpuUsage()),
                 loadAvgStr,
@@ -127,8 +127,8 @@ public class ApplicationScheduler {
                 this.systemHealth.getMaxMemory(),
                 this.systemHealth.getThreadCount(),
                 this.systemHealth.getPeakThreadCount(),
-                this.systemHealth.getGcCount(),
-                this.systemHealth.getGcTime());
+                this.systemHealth.getGcTotalAvgTime(),
+                this.systemHealth.getGcRecentAvgTime());
     }
 
     private void logSessionStatus() {

+ 2 - 0
rota-utic-client/build.gradle

@@ -50,6 +50,8 @@ dependencies {
     implementation 'com.its:its-cluster:0.0.1'
 
     testImplementation 'org.springframework.boot:spring-boot-starter-test'
+
+    implementation 'org.jetbrains:annotations:24.0.0'  //@NotNull, @Nullable
 }
 
 test {

+ 0 - 1
rota-utic-client/src/main/java/com/utic/its/rota/utic/client/RotaUticClientApplication.java

@@ -116,7 +116,6 @@ public class RotaUticClientApplication implements CommandLineRunner, Application
         itsAsnClientCommService.run();
 
         if (clusterConfig.isEnabled()) {
-            applicationConfig.setClusterId(clusterConfig.getId());
             clusterConfig.loggingInfo();
 
             ClusterMasterService clusterMasterService = SpringUtils.getBean(ClusterMasterService.class);

+ 0 - 4
rota-utic-client/src/main/java/com/utic/its/rota/utic/client/config/ApplicationConfig.java

@@ -69,8 +69,4 @@ public class ApplicationConfig extends NettyServerConfig {
         log.info("[ApplicationConfig]         workerThreads: {}", this.workerThreads);
     }
 
-    public void setClusterId(int clusterId) {
-        this.processName = this.processName + "-" + clusterId;
-    }
-
 }

+ 4 - 12
rota-utic-client/src/main/java/com/utic/its/rota/utic/client/config/DatabaseConfig.java

@@ -1,5 +1,6 @@
 package com.utic.its.rota.utic.client.config;
 
+import org.jetbrains.annotations.NotNull;
 import com.utic.its.rota.utic.client.cluster.ClusterConfig;
 import com.zaxxer.hikari.HikariDataSource;
 import lombok.RequiredArgsConstructor;
@@ -75,23 +76,14 @@ public class DatabaseConfig {
 //        return DataSourceBuilder.create().type(HikariDataSource.class).build();
     }
 
-    private static String getString() {
-        final String moduleName = "utic-ptis-server";
-        final String actionName = "Transfer ITS to MOCT";
-//            final String clientIdentifier = "its";
-//            final String clientInfo = "BatchJob: TrafficProcessor v1.2";
-//            return new OracleAwareDataSource(hikari, this.moduleName, actionName, clientIdentifier, clientInfo);
+    private @NotNull String getString() {
+        final String moduleName = this.config.getProcessName();
+        final String actionName = "UTIC Local Traffic Recv Client";
         final String connInitSql;
         connInitSql = String.format(
                 "BEGIN DBMS_APPLICATION_INFO.SET_MODULE('%s', '%s'); END;",
                 moduleName, actionName
         );
-//        dataSource.setConnectionInitSql(
-//                "BEGIN " +
-//                        "DBMS_APPLICATION_INFO.SET_MODULE('MyAppScheduler', 'BatchJobEveryMinute'); " +
-//                        "DBMS_SESSION.SET_IDENTIFIER('seungho'); " +
-//                        "END;"
-//        );
         return connInitSql;
     }
 

+ 3 - 3
rota-utic-client/src/main/java/com/utic/its/rota/utic/client/scheduler/ApplicationScheduler.java

@@ -155,7 +155,7 @@ public class ApplicationScheduler {
     private void loggingSystemHealth() {
         double loadAvg = this.systemHealth.getLoadAverage();
         String loadAvgStr = (loadAvg < 0) ? "N/A" : this.df.format(loadAvg);
-        log.info("SYSTEM HEALTH: CPU {} Cores[{} %, LoadAvg({})], Memory[{} %, Used({} MB), Max({} MB)], Threads[{}, Peak({})], GC[{}, {} ms]",
+        log.info("SYSTEM HEALTH: CPU {} Cores[{} %, LoadAvg({})], Memory[{} %, Used({} MB), Max({} MB)], Threads[{}, Peak({})], GC(T/R)[{}/{} ms]",
                 this.systemHealth.getCpuCores(),
                 this.df.format(this.systemHealth.getCpuUsage()),
                 loadAvgStr,
@@ -164,8 +164,8 @@ public class ApplicationScheduler {
                 this.systemHealth.getMaxMemory(),
                 this.systemHealth.getThreadCount(),
                 this.systemHealth.getPeakThreadCount(),
-                this.systemHealth.getGcCount(),
-                this.systemHealth.getGcTime());
+                this.systemHealth.getGcTotalAvgTime(),
+                this.systemHealth.getGcRecentAvgTime());
     }
 
     private void logSessionStatus() {

+ 7 - 3
rota-utic-client/src/main/java/com/utic/its/rota/utic/client/service/ApplicationService.java

@@ -134,10 +134,15 @@ public class ApplicationService {
         log.info("applicationService.loadRegionCenterInfo: Cluster Run: {}, clusterId: {}, master: {}",
                 this.clusterConfig.isEnabled(), this.clusterConfig.getId(), this.clusterConfig.isMaster());
 
+        setupLoadBalancer();;
+        return true;
+    }
+
+    private void setupLoadBalancer() {
         // 부하분산을 위하여 지역센터를 클러스터에 할당한다.
         if (!this.clusterConfig.isEnabled()) {
             // 클러스터를 사용하지 않는 경우
-            return true;
+            return;
         }
 
         // 클러스터에 지역센터를 할당
@@ -154,7 +159,7 @@ public class ApplicationService {
             for (String centerId : assignedClients) {
                 CenterDto center = ApplicationRepository.CENTER_MAP.get(centerId);
                 if (center == null) {
-                    log.error("applicationService.loadRegionCenterInfo: center {} not found.", centerId);
+                    log.error("setupLoadBalancer: {} not found.", centerId);
                     continue;
                 }
                 center.setClusterId(clusterId);
@@ -168,7 +173,6 @@ public class ApplicationService {
             }
             log.info("Cluster: {} ==> {}", centerId, center.getClusterId());
         }
-        return true;
     }
 
 }

+ 0 - 1
rota-utic-server/src/main/java/com/utic/its/rota/utic/server/RotaUticServerApplication.java

@@ -117,7 +117,6 @@ public class RotaUticServerApplication implements CommandLineRunner, Application
         itsAsnCommServerService.run();
 
         if (clusterConfig.isEnabled()) {
-            applicationConfig.setClusterId(clusterConfig.getId());
             clusterConfig.loggingInfo();
 
             ClusterMasterService clusterMasterService = SpringUtils.getBean(ClusterMasterService.class);

+ 0 - 4
rota-utic-server/src/main/java/com/utic/its/rota/utic/server/config/ApplicationConfig.java

@@ -65,8 +65,4 @@ public class ApplicationConfig extends NettyServerConfig {
         log.info("[ApplicationConfig]         workerThreads: {}", this.workerThreads);
     }
 
-    public void setClusterId(int clusterId) {
-        this.processName = this.processName + "-" + clusterId;
-    }
-
 }

+ 3 - 12
rota-utic-server/src/main/java/com/utic/its/rota/utic/server/config/DatabaseConfig.java

@@ -76,23 +76,14 @@ public class DatabaseConfig {
 //        return DataSourceBuilder.create().type(HikariDataSource.class).build();
     }
 
-    private static @NotNull String getString() {
-        final String moduleName = "utic-ptis-server";
-        final String actionName = "Transfer ITS to MOCT";
-//            final String clientIdentifier = "its";
-//            final String clientInfo = "BatchJob: TrafficProcessor v1.2";
-//            return new OracleAwareDataSource(hikari, this.moduleName, actionName, clientIdentifier, clientInfo);
+    private @NotNull String getString() {
+        final String moduleName = this.config.getProcessName();
+        final String actionName = "UTIC ITS Traffic Send Server";
         final String connInitSql;
         connInitSql = String.format(
                 "BEGIN DBMS_APPLICATION_INFO.SET_MODULE('%s', '%s'); END;",
                 moduleName, actionName
         );
-//        dataSource.setConnectionInitSql(
-//                "BEGIN " +
-//                        "DBMS_APPLICATION_INFO.SET_MODULE('MyAppScheduler', 'BatchJobEveryMinute'); " +
-//                        "DBMS_SESSION.SET_IDENTIFIER('seungho'); " +
-//                        "END;"
-//        );
         return connInitSql;
     }
 

+ 3 - 3
rota-utic-server/src/main/java/com/utic/its/rota/utic/server/scheduler/ApplicationScheduler.java

@@ -159,7 +159,7 @@ public class ApplicationScheduler {
     private void loggingSystemHealth() {
         double loadAvg = this.systemHealth.getLoadAverage();
         String loadAvgStr = (loadAvg < 0) ? "N/A" : this.df.format(loadAvg);
-        log.info("SYSTEM HEALTH: CPU {} Cores[{} %, LoadAvg({})], Memory[{} %, Used({} MB), Max({} MB)], Threads[{}, Peak({})], GC[{}, {} ms]",
+        log.info("SYSTEM HEALTH: CPU {} Cores[{} %, LoadAvg({})], Memory[{} %, Used({} MB), Max({} MB)], Threads[{}, Peak({})], GC(T/R)[{}/{} ms]",
                 this.systemHealth.getCpuCores(),
                 this.df.format(this.systemHealth.getCpuUsage()),
                 loadAvgStr,
@@ -168,8 +168,8 @@ public class ApplicationScheduler {
                 this.systemHealth.getMaxMemory(),
                 this.systemHealth.getThreadCount(),
                 this.systemHealth.getPeakThreadCount(),
-                this.systemHealth.getGcCount(),
-                this.systemHealth.getGcTime());
+                this.systemHealth.getGcTotalAvgTime(),
+                this.systemHealth.getGcRecentAvgTime());
     }
 
     private void logSessionStatus() {

+ 27 - 10
utic-its-common/src/main/java/com/utic/its/common/utils/SystemHealth.java

@@ -9,8 +9,6 @@ import java.lang.management.ManagementFactory;
 import java.lang.management.MemoryMXBean;
 import java.time.Instant;
 import java.time.ZoneId;
-import java.util.HashMap;
-import java.util.Map;
 
 @Getter
 public class SystemHealth {
@@ -41,11 +39,17 @@ public class SystemHealth {
     private long diskFree;
     private double diskUsage;
 
-    private final Map<String, GcStats> gcStatsMap = new HashMap<>();
+//    private final Map<String, GcStats> gcStatsMap = new HashMap<>();
     private String gcName;
-    private long gcCount = 0;
-    private long gcTime = 0;
-    private String jvmStartTime;
+    private long gcTotalCount = 0;
+    private long gcTotalTime = 0;
+    private long gcTotalAvgTime = 0;
+
+    private long gcRecentCount = 0;
+    private long gcRecentTime = 0;
+    private long gcRecentAvgTime = 0;
+
+    private final String jvmStartTime;
 
     public SystemHealth() {
         this.jvmStartTime = Instant.ofEpochMilli(
@@ -109,13 +113,26 @@ public class SystemHealth {
             }
         }
 
+        long totalGcCount = 0;
+        long totalGcTime = 0;
         for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) {
-            this.gcName = gc.getName();
-            this.gcCount += gc.getCollectionCount();
-            this.gcTime += gc.getCollectionTime();
-            gcStatsMap.put(gc.getName(), new GcStats(gc.getCollectionCount(), gc.getCollectionTime()));
+            totalGcCount += gc.getCollectionCount();
+            totalGcTime += gc.getCollectionTime();
+//            this.gcName = gc.getName();
+//            gcStatsMap.put(gc.getName(), new GcStats(gc.getCollectionCount(), gc.getCollectionTime()));
         }
 
+        // 누적 평균
+        this.gcTotalAvgTime = totalGcTime > 0 ? Math.round((double) totalGcTime / totalGcCount) : 0;
+
+        // 최근 변화량
+        this.gcRecentCount = totalGcCount - this.gcTotalCount;
+        this.gcRecentTime = totalGcTime - this.gcTotalTime;
+        this.gcRecentAvgTime = gcTotalCount > 0 ? Math.round((double) this.gcRecentTime  / gcTotalCount) : 0;
+
+        this.gcTotalCount = totalGcCount;
+        this.gcTotalTime = totalGcTime;
+
 //        for (File root : File.listRoots()) {
 //            if (root.exists() && root.canRead()) {
 //                long total = root.getTotalSpace();