From 4b966e81592b8122a74f8b0e64f543db38a68f3f Mon Sep 17 00:00:00 2001 From: pksup Date: Tue, 13 Jan 2026 17:00:01 +0900 Subject: [PATCH] =?UTF-8?q?PRECISION=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduler/ApiStatsScheduler.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/src/main/java/com/eactive/eai/custom/statistics/scheduler/ApiStatsScheduler.java b/src/main/java/com/eactive/eai/custom/statistics/scheduler/ApiStatsScheduler.java index 61e6c22..c10d9bd 100644 --- a/src/main/java/com/eactive/eai/custom/statistics/scheduler/ApiStatsScheduler.java +++ b/src/main/java/com/eactive/eai/custom/statistics/scheduler/ApiStatsScheduler.java @@ -90,6 +90,9 @@ public class ApiStatsScheduler { for (ApiStatsMinute stats : statsList) { try { + // Precision 체크 (디버깅) + checkPrecision(stats); + minuteLogger.log(stats); savedCount++; @@ -158,6 +161,9 @@ public class ApiStatsScheduler { for (ApiStatsHour stats : statsList) { try { + // Precision 체크 (디버깅) + checkPrecision(stats); + hourLogger.log(stats); savedCount++; @@ -285,4 +291,73 @@ public class ApiStatsScheduler { log.error("Error during shutdown", e); } } + + /** + * Precision 체크 (디버깅용) + */ + private void checkPrecision(ApiStatsMinute stats) { + checkPrecisionCommon(stats.getApiName(), stats.getStatTime(), + stats.getTotalCnt(), stats.getSuccessCnt(), stats.getTimeoutCnt(), + stats.getSystemErrCnt(), stats.getBizErrCnt(), + stats.getSeq900TimeoutCnt(), stats.getSeq900SystemErrCnt(), stats.getSeq900BizErrCnt(), + stats.getAvgRespTime(), stats.getMinRespTime(), stats.getMaxRespTime(), + stats.getP50RespTime(), stats.getP95RespTime()); + } + + /** + * Precision 체크 (디버깅용) + */ + private void checkPrecision(ApiStatsHour stats) { + checkPrecisionCommon(stats.getApiName(), stats.getStatTime(), + stats.getTotalCnt(), stats.getSuccessCnt(), stats.getTimeoutCnt(), + stats.getSystemErrCnt(), stats.getBizErrCnt(), + stats.getSeq900TimeoutCnt(), stats.getSeq900SystemErrCnt(), stats.getSeq900BizErrCnt(), + stats.getAvgRespTime(), stats.getMinRespTime(), stats.getMaxRespTime(), + stats.getP50RespTime(), stats.getP95RespTime()); + } + + private void checkPrecisionCommon(String apiName, Object statTime, + Long totalCnt, Long successCnt, Long timeoutCnt, Long systemErrCnt, Long bizErrCnt, + Long seq900TimeoutCnt, Long seq900SystemErrCnt, Long seq900BizErrCnt, + java.math.BigDecimal avgRespTime, java.math.BigDecimal minRespTime, java.math.BigDecimal maxRespTimeValue, + java.math.BigDecimal p50RespTime, java.math.BigDecimal p95RespTime) { + + // NUMBER(12) 체크 - 건수 필드 + if (totalCnt != null && totalCnt > 999999999999L) { + log.warn("PRECISION EXCEEDED - API: {}, Time: {}, TOTAL_CNT: {}", apiName, statTime, totalCnt); + } + if (successCnt != null && successCnt < 0) { + log.warn("NEGATIVE VALUE - API: {}, Time: {}, SUCCESS_CNT: {}", apiName, statTime, successCnt); + } + if (successCnt != null && successCnt > 999999999999L) { + log.warn("PRECISION EXCEEDED - API: {}, Time: {}, SUCCESS_CNT: {}", apiName, statTime, successCnt); + } + if (timeoutCnt != null && timeoutCnt > 999999999999L) { + log.warn("PRECISION EXCEEDED - API: {}, Time: {}, TIMEOUT_CNT: {}", apiName, statTime, timeoutCnt); + } + if (systemErrCnt != null && systemErrCnt > 999999999999L) { + log.warn("PRECISION EXCEEDED - API: {}, Time: {}, SYSTEM_ERR_CNT: {}", apiName, statTime, systemErrCnt); + } + if (bizErrCnt != null && bizErrCnt > 999999999999L) { + log.warn("PRECISION EXCEEDED - API: {}, Time: {}, BIZ_ERR_CNT: {}", apiName, statTime, bizErrCnt); + } + + // NUMBER(10,3) 체크 - 응답시간 필드 + java.math.BigDecimal maxRespTimeLimit = new java.math.BigDecimal("9999999.999"); + if (avgRespTime != null && avgRespTime.compareTo(maxRespTimeLimit) > 0) { + log.warn("PRECISION EXCEEDED - API: {}, Time: {}, AVG_RESP_TIME: {}", apiName, statTime, avgRespTime); + } + if (minRespTime != null && minRespTime.compareTo(maxRespTimeLimit) > 0) { + log.warn("PRECISION EXCEEDED - API: {}, Time: {}, MIN_RESP_TIME: {}", apiName, statTime, minRespTime); + } + if (maxRespTimeValue != null && maxRespTimeValue.compareTo(maxRespTimeLimit) > 0) { + log.warn("PRECISION EXCEEDED - API: {}, Time: {}, MAX_RESP_TIME: {}", apiName, statTime, maxRespTimeValue); + } + if (p50RespTime != null && p50RespTime.compareTo(maxRespTimeLimit) > 0) { + log.warn("PRECISION EXCEEDED - API: {}, Time: {}, P50_RESP_TIME: {}", apiName, statTime, p50RespTime); + } + if (p95RespTime != null && p95RespTime.compareTo(maxRespTimeLimit) > 0) { + log.warn("PRECISION EXCEEDED - API: {}, Time: {}, P95_RESP_TIME: {}", apiName, statTime, p95RespTime); + } + } }