Merge remote-tracking branch 'origin/jenkins_with_weblogic' of C:/KJB_DEV/eapim-bundle/bundles/251219/eapim-admin_incremental_2025-12-01.bundle into jenkins_with_weblogic
This commit is contained in:
@@ -202,6 +202,4 @@
|
|||||||
<!-- 로그추축 -->
|
<!-- 로그추축 -->
|
||||||
<sqlMap resource="com/eactive/eai/apim/portalstatistics/EAILog-oracle.xml" />
|
<sqlMap resource="com/eactive/eai/apim/portalstatistics/EAILog-oracle.xml" />
|
||||||
|
|
||||||
<!-- ObpGwMetric 시간별 거래량 지표 -->
|
|
||||||
<sqlMap resource="com/eactive/eai/apim/obp/ObpGwMetric-oracle.xml" />
|
|
||||||
</sqlMapConfig>
|
</sqlMapConfig>
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
package com.eactive.eai.rms.data.entity.onl.apim.obp;
|
|
||||||
|
|
||||||
import com.eactive.eai.rms.common.base.SqlMapClientTemplateDao;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ObpGwMetric DAO - iBATIS를 사용한 로그 테이블 집계
|
|
||||||
*/
|
|
||||||
@Repository
|
|
||||||
public class ObpGwMetricDAO extends SqlMapClientTemplateDao {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* EAIBZWKDSTCD 코드 목록 조회
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public List<String> selectAllBzwkCodes(String schemaId) {
|
|
||||||
HashMap<String, Object> paramMap = new HashMap<>();
|
|
||||||
paramMap.put("schemaId", schemaId);
|
|
||||||
return this.template.queryForList("ObpGwMetric.selectAllBzwkCodes", paramMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* EAIBZWKDSTCD별 시간대 로그 집계
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public List<ObpGwMetricVO> selectHourlyMetricsByBzwkCode(HashMap<String, Object> paramMap) {
|
|
||||||
return this.template.queryForList("ObpGwMetric.selectHourlyMetricsByBzwkCode", paramMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* API 이름 조회 (TSEAIHE01)
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public Map<String, String> selectApiNames(String schemaId, Set<String> apiIds) {
|
|
||||||
if (apiIds == null || apiIds.isEmpty()) {
|
|
||||||
return new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
HashMap<String, Object> paramMap = new HashMap<>();
|
|
||||||
paramMap.put("schemaId", schemaId);
|
|
||||||
paramMap.put("apiIds", new ArrayList<>(apiIds)); // Set → List 변환 (iBATIS iterate 호환)
|
|
||||||
|
|
||||||
List<Map<String, String>> resultList = this.template.queryForList("ObpGwMetric.selectApiNames", paramMap);
|
|
||||||
|
|
||||||
Map<String, String> result = new HashMap<>();
|
|
||||||
for (Map<String, String> m : resultList) {
|
|
||||||
String apiId = m.get("API_ID");
|
|
||||||
String apiName = m.get("API_NAME");
|
|
||||||
if (apiId != null && apiName != null) {
|
|
||||||
result.put(apiId, apiName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* URI 및 HTTP Method 조회 결과
|
|
||||||
*/
|
|
||||||
public static class UriMethodResult {
|
|
||||||
private final Map<String, String> uriMap;
|
|
||||||
private final Map<String, String> methodMap;
|
|
||||||
|
|
||||||
public UriMethodResult(Map<String, String> uriMap, Map<String, String> methodMap) {
|
|
||||||
this.uriMap = uriMap;
|
|
||||||
this.methodMap = methodMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, String> getUriMap() {
|
|
||||||
return uriMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, String> getMethodMap() {
|
|
||||||
return methodMap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* URI 및 HTTP Method 조회 (HTTP_ADAPTER_EXTRA_LOG)
|
|
||||||
* - GUID = TSEAILG1X.EAISVCSERNO와 매핑
|
|
||||||
* - SERVICE_PROCESS_NUMBER = 100 (인바운드 요청)
|
|
||||||
*
|
|
||||||
* @param schemaId DB 스키마 ID
|
|
||||||
* @param eaiSvcSernos EAI 서비스 일련번호 목록 (GUID)
|
|
||||||
* @return UriMethodResult (eaiSvcSerno → URI 맵, eaiSvcSerno → METHOD 맵)
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public UriMethodResult selectUrisAndMethods(String schemaId, Set<String> eaiSvcSernos) {
|
|
||||||
if (eaiSvcSernos == null || eaiSvcSernos.isEmpty()) {
|
|
||||||
return new UriMethodResult(new HashMap<>(), new HashMap<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
HashMap<String, Object> paramMap = new HashMap<>();
|
|
||||||
paramMap.put("schemaId", schemaId);
|
|
||||||
paramMap.put("eaiSvcSernos", new ArrayList<>(eaiSvcSernos)); // Set → List 변환 (iBATIS iterate 호환)
|
|
||||||
|
|
||||||
List<Map<String, String>> resultList = this.template.queryForList("ObpGwMetric.selectUris", paramMap);
|
|
||||||
|
|
||||||
Map<String, String> uriMap = new HashMap<>();
|
|
||||||
Map<String, String> methodMap = new HashMap<>();
|
|
||||||
for (Map<String, String> m : resultList) {
|
|
||||||
String eaiSvcSerno = m.get("EAI_SVC_SERNO");
|
|
||||||
String uri = m.get("URI");
|
|
||||||
String method = m.get("METHOD");
|
|
||||||
if (eaiSvcSerno != null) {
|
|
||||||
if (uri != null) {
|
|
||||||
uriMap.put(eaiSvcSerno, uri);
|
|
||||||
}
|
|
||||||
if (method != null) {
|
|
||||||
methodMap.put(eaiSvcSerno, method);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new UriMethodResult(uriMap, methodMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* AppId 조회 (ptl_app_request) - org_id로 조회
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public Map<String, String> selectAppIdsByOrgIds(Set<String> orgIds) {
|
|
||||||
if (orgIds == null || orgIds.isEmpty()) {
|
|
||||||
return new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
HashMap<String, Object> paramMap = new HashMap<>();
|
|
||||||
paramMap.put("orgIds", new ArrayList<>(orgIds)); // Set → List 변환 (iBATIS iterate 호환)
|
|
||||||
|
|
||||||
List<Map<String, String>> resultList = this.template.queryForList("ObpGwMetric.selectAppIdsByOrgIds", paramMap);
|
|
||||||
|
|
||||||
Map<String, String> result = new HashMap<>();
|
|
||||||
for (Map<String, String> m : resultList) {
|
|
||||||
String orgId = m.get("ORG_ID");
|
|
||||||
String appId = m.get("APP_ID");
|
|
||||||
if (orgId != null && appId != null) {
|
|
||||||
result.put(orgId, appId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,255 @@
|
|||||||
|
package com.eactive.eai.rms.data.entity.onl.apim.obp;
|
||||||
|
|
||||||
|
import com.eactive.apim.portal.apprequest.entity.AppRequest;
|
||||||
|
import com.eactive.apim.portal.apprequest.entity.QAppRequest;
|
||||||
|
import com.eactive.eai.data.entity.onl.message.EAIMessageEntity;
|
||||||
|
import com.eactive.eai.data.entity.onl.message.QEAIMessageEntity;
|
||||||
|
import com.eactive.eai.data.entity.onl.unifbwk.QUnifBwkTp;
|
||||||
|
import com.querydsl.core.Tuple;
|
||||||
|
import com.querydsl.jpa.impl.JPAQueryFactory;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.PersistenceContext;
|
||||||
|
import javax.persistence.Query;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ObpGwMetric JPA DAO - JPA/QueryDSL을 사용한 로그 테이블 집계
|
||||||
|
*
|
||||||
|
* <p>Multi-tenancy 지원: 호출 전 DataSourceContextHolder 설정 필요</p>
|
||||||
|
*/
|
||||||
|
@Repository
|
||||||
|
public class ObpGwMetricJpaDAO {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(ObpGwMetricJpaDAO.class);
|
||||||
|
|
||||||
|
@PersistenceContext
|
||||||
|
private EntityManager entityManager;
|
||||||
|
|
||||||
|
private JPAQueryFactory getQueryFactory() {
|
||||||
|
return new JPAQueryFactory(entityManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EAIBZWKDSTCD 코드 목록 조회 (TSEAICM01)
|
||||||
|
*
|
||||||
|
* @return 업무구분코드 목록
|
||||||
|
*/
|
||||||
|
public List<String> selectAllBzwkCodes() {
|
||||||
|
QUnifBwkTp cm01 = QUnifBwkTp.unifBwkTp;
|
||||||
|
|
||||||
|
return getQueryFactory()
|
||||||
|
.select(cm01.eaibzwkdstcd)
|
||||||
|
.from(cm01)
|
||||||
|
.orderBy(cm01.eaibzwkdstcd.asc())
|
||||||
|
.fetch();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EAIBZWKDSTCD별 시간대 로그 집계 (Native Query)
|
||||||
|
*
|
||||||
|
* <p>동적 테이블명(TSEAILG1X)을 사용하므로 Native Query 필요</p>
|
||||||
|
*
|
||||||
|
* @param tableName 동적 테이블명 (예: TSEAILG14)
|
||||||
|
* @param bzwkCode 업무구분코드
|
||||||
|
* @param startTime 시작시간 (yyyyMMddHHmmssSSS)
|
||||||
|
* @param endTime 종료시간 (yyyyMMddHHmmssSSS)
|
||||||
|
* @param timeslice 타임슬라이스 (yyyyMMddHH0000000)
|
||||||
|
* @return 집계 결과 목록
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public List<ObpGwMetricVO> selectHourlyMetricsByBzwkCode(
|
||||||
|
String tableName, String bzwkCode, String startTime, String endTime, String timeslice) {
|
||||||
|
|
||||||
|
String sql = "SELECT " +
|
||||||
|
"EAISVCNAME AS API_ID, " +
|
||||||
|
"CLIENTID AS CLIENT_ID, " +
|
||||||
|
"EAISEVRINSTNCNAME AS HOSTNAME, " +
|
||||||
|
"ORGID AS ORG_ID, " +
|
||||||
|
":timeslice AS TIMESLICE, " +
|
||||||
|
"SUM(CASE WHEN LOGPRCSSSERNO = '100' THEN 1 ELSE 0 END) AS ATTEMPTED_COUNT, " +
|
||||||
|
"SUM(CASE WHEN LOGPRCSSSERNO = '400' " +
|
||||||
|
" AND (RSPNSERRCDNAME IS NULL OR RSPNSERRCDNAME LIKE 'ESB%') " +
|
||||||
|
" THEN 1 ELSE 0 END) AS COMPLETED_COUNT, " +
|
||||||
|
"MAX(TRIM(EAISVCSERNO)) AS EAI_SVC_SERNO " +
|
||||||
|
"FROM " + tableName + " " +
|
||||||
|
"WHERE EAIBZWKDSTCD = :bzwkCode " +
|
||||||
|
" AND MSGDPSTYMS BETWEEN :startTime AND :endTime " +
|
||||||
|
"GROUP BY EAISVCNAME, CLIENTID, EAISEVRINSTNCNAME, ORGID " +
|
||||||
|
"HAVING SUM(CASE WHEN LOGPRCSSSERNO = '100' THEN 1 ELSE 0 END) > 0 " +
|
||||||
|
" OR SUM(CASE WHEN LOGPRCSSSERNO = '400' THEN 1 ELSE 0 END) > 0";
|
||||||
|
|
||||||
|
Query query = entityManager.createNativeQuery(sql);
|
||||||
|
query.setParameter("timeslice", timeslice);
|
||||||
|
query.setParameter("bzwkCode", bzwkCode);
|
||||||
|
query.setParameter("startTime", startTime);
|
||||||
|
query.setParameter("endTime", endTime);
|
||||||
|
|
||||||
|
List<Object[]> results = query.getResultList();
|
||||||
|
|
||||||
|
return results.stream()
|
||||||
|
.map(this::mapToObpGwMetricVO)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Native Query 결과를 ObpGwMetricVO로 변환
|
||||||
|
*/
|
||||||
|
private ObpGwMetricVO mapToObpGwMetricVO(Object[] row) {
|
||||||
|
ObpGwMetricVO vo = new ObpGwMetricVO();
|
||||||
|
vo.setApiId((String) row[0]);
|
||||||
|
vo.setClientId((String) row[1]);
|
||||||
|
vo.setHostname((String) row[2]);
|
||||||
|
vo.setOrgId((String) row[3]);
|
||||||
|
vo.setTimeslice((String) row[4]);
|
||||||
|
vo.setAttemptedCount(toLong(row[5]));
|
||||||
|
vo.setCompletedCount(toLong(row[6]));
|
||||||
|
vo.setEaiSvcSerno((String) row[7]);
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number 타입을 Long으로 변환 (Oracle은 BigDecimal 반환)
|
||||||
|
*/
|
||||||
|
private Long toLong(Object value) {
|
||||||
|
if (value == null) return 0L;
|
||||||
|
if (value instanceof BigDecimal) {
|
||||||
|
return ((BigDecimal) value).longValue();
|
||||||
|
}
|
||||||
|
if (value instanceof Number) {
|
||||||
|
return ((Number) value).longValue();
|
||||||
|
}
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API 이름 조회 (TSEAIHE01)
|
||||||
|
*
|
||||||
|
* @param apiIds API ID 목록 (EAISVCNAME)
|
||||||
|
* @return API ID → API 이름 맵
|
||||||
|
*/
|
||||||
|
public Map<String, String> selectApiNames(Set<String> apiIds) {
|
||||||
|
if (apiIds == null || apiIds.isEmpty()) {
|
||||||
|
return new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
QEAIMessageEntity he01 = QEAIMessageEntity.eAIMessageEntity;
|
||||||
|
|
||||||
|
List<Tuple> results = getQueryFactory()
|
||||||
|
.select(he01.eaisvcname, he01.eaisvcdesc)
|
||||||
|
.from(he01)
|
||||||
|
.where(he01.eaisvcname.in(apiIds))
|
||||||
|
.fetch();
|
||||||
|
|
||||||
|
Map<String, String> result = new HashMap<>();
|
||||||
|
for (Tuple tuple : results) {
|
||||||
|
String apiId = tuple.get(he01.eaisvcname);
|
||||||
|
String apiName = tuple.get(he01.eaisvcdesc);
|
||||||
|
if (apiId != null && apiName != null) {
|
||||||
|
result.put(apiId, apiName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URI 및 HTTP Method 조회 결과
|
||||||
|
*/
|
||||||
|
public static class UriMethodResult {
|
||||||
|
private final Map<String, String> uriMap;
|
||||||
|
private final Map<String, String> methodMap;
|
||||||
|
|
||||||
|
public UriMethodResult(Map<String, String> uriMap, Map<String, String> methodMap) {
|
||||||
|
this.uriMap = uriMap;
|
||||||
|
this.methodMap = methodMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getUriMap() {
|
||||||
|
return uriMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getMethodMap() {
|
||||||
|
return methodMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URI 및 HTTP Method 조회 (HTTP_ADAPTER_EXTRA_LOG)
|
||||||
|
*
|
||||||
|
* <p>SERVICE_PROCESS_NUMBER = 100 (인바운드 요청) 조건으로 조회</p>
|
||||||
|
*
|
||||||
|
* @param eaiSvcSernos EAI 서비스 일련번호 목록 (GUID)
|
||||||
|
* @return UriMethodResult (eaiSvcSerno → URI 맵, eaiSvcSerno → METHOD 맵)
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public UriMethodResult selectUrisAndMethods(Set<String> eaiSvcSernos) {
|
||||||
|
if (eaiSvcSernos == null || eaiSvcSernos.isEmpty()) {
|
||||||
|
return new UriMethodResult(new HashMap<>(), new HashMap<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
// IN절 파라미터 바인딩을 위한 처리
|
||||||
|
String sql = "SELECT GUID AS EAI_SVC_SERNO, URL AS URI, HTTP_METHOD AS METHOD " +
|
||||||
|
"FROM HTTP_ADAPTER_EXTRA_LOG " +
|
||||||
|
"WHERE SERVICE_PROCESS_NUMBER = 100 " +
|
||||||
|
" AND GUID IN (:eaiSvcSernos)";
|
||||||
|
|
||||||
|
Query query = entityManager.createNativeQuery(sql);
|
||||||
|
query.setParameter("eaiSvcSernos", new ArrayList<>(eaiSvcSernos));
|
||||||
|
|
||||||
|
List<Object[]> results = query.getResultList();
|
||||||
|
|
||||||
|
Map<String, String> uriMap = new HashMap<>();
|
||||||
|
Map<String, String> methodMap = new HashMap<>();
|
||||||
|
|
||||||
|
for (Object[] row : results) {
|
||||||
|
String eaiSvcSerno = (String) row[0];
|
||||||
|
String uri = (String) row[1];
|
||||||
|
String method = (String) row[2];
|
||||||
|
if (eaiSvcSerno != null) {
|
||||||
|
if (uri != null) {
|
||||||
|
uriMap.put(eaiSvcSerno, uri);
|
||||||
|
}
|
||||||
|
if (method != null) {
|
||||||
|
methodMap.put(eaiSvcSerno, method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new UriMethodResult(uriMap, methodMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AppId 조회 (PTL_APP_REQUEST) - org_id로 조회
|
||||||
|
*
|
||||||
|
* @param orgIds 기관 ID 목록
|
||||||
|
* @return 기관 ID → 앱 ID 맵
|
||||||
|
*/
|
||||||
|
public Map<String, String> selectAppIdsByOrgIds(Set<String> orgIds) {
|
||||||
|
if (orgIds == null || orgIds.isEmpty()) {
|
||||||
|
return new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
QAppRequest appRequest = QAppRequest.appRequest;
|
||||||
|
|
||||||
|
List<Tuple> results = getQueryFactory()
|
||||||
|
.select(appRequest.org.id, appRequest.id)
|
||||||
|
.from(appRequest)
|
||||||
|
.where(appRequest.org.id.in(orgIds))
|
||||||
|
.fetch();
|
||||||
|
|
||||||
|
Map<String, String> result = new HashMap<>();
|
||||||
|
for (Tuple tuple : results) {
|
||||||
|
String orgId = tuple.get(appRequest.org.id);
|
||||||
|
String appId = tuple.get(appRequest.id);
|
||||||
|
if (orgId != null && appId != null) {
|
||||||
|
result.put(orgId, appId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,11 +23,10 @@ public class ObpGwMetricService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UPSERT 판단을 위한 기존 데이터 조회
|
* UPSERT 판단을 위한 기존 데이터 조회 (NULL 안전)
|
||||||
*/
|
*/
|
||||||
public Optional<ObpGwMetric> findByUniqueKey(LocalDateTime timeslice, String apiId, String clientId, String hostname, String orgId) {
|
public Optional<ObpGwMetric> findByUniqueKey(LocalDateTime timeslice, String apiId, String clientId, String hostname, String orgId) {
|
||||||
return repository.findByTimesliceAndApiIdAndClientIdAndHostnameAndOrgId(
|
return repository.findByUniqueKeyNullSafe(timeslice, apiId, clientId, hostname, orgId);
|
||||||
timeslice, apiId, clientId, hostname, orgId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,10 +3,9 @@ package com.eactive.eai.rms.onl.apim.obp;
|
|||||||
import com.eactive.apim.portal.obp.entity.ObpGwMetric;
|
import com.eactive.apim.portal.obp.entity.ObpGwMetric;
|
||||||
import com.eactive.eai.rms.common.base.BaseService;
|
import com.eactive.eai.rms.common.base.BaseService;
|
||||||
import com.eactive.eai.rms.common.datasource.DataSourceContextHolder;
|
import com.eactive.eai.rms.common.datasource.DataSourceContextHolder;
|
||||||
import com.eactive.eai.rms.common.datasource.DataSourceType;
|
|
||||||
import com.eactive.eai.rms.common.datasource.DataSourceTypeManager;
|
import com.eactive.eai.rms.common.datasource.DataSourceTypeManager;
|
||||||
import com.eactive.eai.rms.common.util.CommonUtil;
|
import com.eactive.eai.rms.common.util.CommonUtil;
|
||||||
import com.eactive.eai.rms.data.entity.onl.apim.obp.ObpGwMetricDAO;
|
import com.eactive.eai.rms.data.entity.onl.apim.obp.ObpGwMetricJpaDAO;
|
||||||
import com.eactive.eai.rms.data.entity.onl.apim.obp.ObpGwMetricService;
|
import com.eactive.eai.rms.data.entity.onl.apim.obp.ObpGwMetricService;
|
||||||
import com.eactive.eai.rms.data.entity.onl.apim.obp.ObpGwMetricVO;
|
import com.eactive.eai.rms.data.entity.onl.apim.obp.ObpGwMetricVO;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -43,11 +42,11 @@ public class ObpGwMetricManService extends BaseService {
|
|||||||
private static final DateTimeFormatter TIMESTAMP_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
|
private static final DateTimeFormatter TIMESTAMP_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
|
||||||
private static final DateTimeFormatter YYYYMMDD_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
|
private static final DateTimeFormatter YYYYMMDD_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
|
||||||
|
|
||||||
private final ObpGwMetricDAO obpGwMetricDAO;
|
private final ObpGwMetricJpaDAO obpGwMetricJpaDAO;
|
||||||
private final ObpGwMetricService obpGwMetricService;
|
private final ObpGwMetricService obpGwMetricService;
|
||||||
|
|
||||||
public ObpGwMetricManService(ObpGwMetricDAO obpGwMetricDAO, ObpGwMetricService obpGwMetricService) {
|
public ObpGwMetricManService(ObpGwMetricJpaDAO obpGwMetricJpaDAO, ObpGwMetricService obpGwMetricService) {
|
||||||
this.obpGwMetricDAO = obpGwMetricDAO;
|
this.obpGwMetricJpaDAO = obpGwMetricJpaDAO;
|
||||||
this.obpGwMetricService = obpGwMetricService;
|
this.obpGwMetricService = obpGwMetricService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,10 +100,10 @@ public class ObpGwMetricManService extends BaseService {
|
|||||||
// 1단계: GW DB에서 EAIBZWKDSTCD 코드 목록 조회
|
// 1단계: GW DB에서 EAIBZWKDSTCD 코드 목록 조회
|
||||||
// ═══════════════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════════════
|
||||||
long step1Start = System.currentTimeMillis();
|
long step1Start = System.currentTimeMillis();
|
||||||
DataSourceType apigwDataSourceType = DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.APIGW);
|
DataSourceContextHolder.setDataSourceType(
|
||||||
DataSourceContextHolder.setDataSourceType(apigwDataSourceType);
|
DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.APIGW));
|
||||||
|
|
||||||
List<String> bzwkCodes = obpGwMetricDAO.selectAllBzwkCodes(apigwDataSourceType.getSchema());
|
List<String> bzwkCodes = obpGwMetricJpaDAO.selectAllBzwkCodes();
|
||||||
log.info("[1단계] EAIBZWKDSTCD 코드 조회 완료: count={}, elapsed={}ms",
|
log.info("[1단계] EAIBZWKDSTCD 코드 조회 완료: count={}, elapsed={}ms",
|
||||||
bzwkCodes.size(), System.currentTimeMillis() - step1Start);
|
bzwkCodes.size(), System.currentTimeMillis() - step1Start);
|
||||||
|
|
||||||
@@ -118,15 +117,8 @@ public class ObpGwMetricManService extends BaseService {
|
|||||||
for (String bzwkCode : bzwkCodes) {
|
for (String bzwkCode : bzwkCodes) {
|
||||||
long codeStart = System.currentTimeMillis();
|
long codeStart = System.currentTimeMillis();
|
||||||
|
|
||||||
HashMap<String, Object> paramMap = new HashMap<>();
|
List<ObpGwMetricVO> partialResult = obpGwMetricJpaDAO.selectHourlyMetricsByBzwkCode(
|
||||||
paramMap.put("schemaId", apigwDataSourceType.getSchema());
|
tableName, bzwkCode, startTime, endTime, timeslice);
|
||||||
paramMap.put("tableName", tableName);
|
|
||||||
paramMap.put("bzwkCode", bzwkCode);
|
|
||||||
paramMap.put("startTime", startTime);
|
|
||||||
paramMap.put("endTime", endTime);
|
|
||||||
paramMap.put("timeslice", timeslice);
|
|
||||||
|
|
||||||
List<ObpGwMetricVO> partialResult = obpGwMetricDAO.selectHourlyMetricsByBzwkCode(paramMap);
|
|
||||||
|
|
||||||
for (ObpGwMetricVO vo : partialResult) {
|
for (ObpGwMetricVO vo : partialResult) {
|
||||||
String key = vo.getAggregationKey();
|
String key = vo.getAggregationKey();
|
||||||
@@ -164,8 +156,8 @@ public class ObpGwMetricManService extends BaseService {
|
|||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
Map<String, String> apiNameMap = obpGwMetricDAO.selectApiNames(apigwDataSourceType.getSchema(), apiIds);
|
Map<String, String> apiNameMap = obpGwMetricJpaDAO.selectApiNames(apiIds);
|
||||||
ObpGwMetricDAO.UriMethodResult uriMethodResult = obpGwMetricDAO.selectUrisAndMethods(apigwDataSourceType.getSchema(), eaiSvcSernos);
|
ObpGwMetricJpaDAO.UriMethodResult uriMethodResult = obpGwMetricJpaDAO.selectUrisAndMethods(eaiSvcSernos);
|
||||||
Map<String, String> uriMap = uriMethodResult.getUriMap();
|
Map<String, String> uriMap = uriMethodResult.getUriMap();
|
||||||
Map<String, String> methodMap = uriMethodResult.getMethodMap();
|
Map<String, String> methodMap = uriMethodResult.getMethodMap();
|
||||||
log.info("[3단계] 부가정보 조회 완료: apiCount={}, eaiSvcSernoCount={}, elapsed={}ms",
|
log.info("[3단계] 부가정보 조회 완료: apiCount={}, eaiSvcSernoCount={}, elapsed={}ms",
|
||||||
@@ -182,7 +174,7 @@ public class ObpGwMetricManService extends BaseService {
|
|||||||
.map(ObpGwMetricVO::getOrgId)
|
.map(ObpGwMetricVO::getOrgId)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
Map<String, String> appIdMap = obpGwMetricDAO.selectAppIdsByOrgIds(orgIds);
|
Map<String, String> appIdMap = obpGwMetricJpaDAO.selectAppIdsByOrgIds(orgIds);
|
||||||
|
|
||||||
int insertCount = 0;
|
int insertCount = 0;
|
||||||
int updateCount = 0;
|
int updateCount = 0;
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
|
|
||||||
|
|
||||||
<sqlMap namespace="ObpGwMetric">
|
|
||||||
|
|
||||||
<!-- EAIBZWKDSTCD 코드 목록 조회 (TSEAICM01) -->
|
|
||||||
<statement id="selectAllBzwkCodes" parameterClass="java.util.HashMap" resultClass="java.lang.String">
|
|
||||||
SELECT EAIBZWKDSTCD
|
|
||||||
FROM $schemaId$.TSEAICM01
|
|
||||||
ORDER BY EAIBZWKDSTCD
|
|
||||||
</statement>
|
|
||||||
|
|
||||||
<!-- 로그 집계 결과 매핑 -->
|
|
||||||
<resultMap id="obpGwMetricResult" class="com.eactive.eai.rms.data.entity.onl.apim.obp.ObpGwMetricVO">
|
|
||||||
<result property="apiId" column="API_ID"/>
|
|
||||||
<result property="clientId" column="CLIENT_ID"/>
|
|
||||||
<result property="hostname" column="HOSTNAME"/>
|
|
||||||
<result property="orgId" column="ORG_ID"/>
|
|
||||||
<result property="timeslice" column="TIMESLICE"/>
|
|
||||||
<result property="attemptedCount" column="ATTEMPTED_COUNT"/>
|
|
||||||
<result property="completedCount" column="COMPLETED_COUNT"/>
|
|
||||||
<result property="eaiSvcSerno" column="EAI_SVC_SERNO"/>
|
|
||||||
</resultMap>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
EAIBZWKDSTCD별 시간대 로그 집계 (Index Range Scan 활용)
|
|
||||||
|
|
||||||
에러 판단 기준:
|
|
||||||
- 성공 조건: RSPNSERRCDNAME IS NULL 또는 RSPNSERRCDNAME LIKE 'ESB%'
|
|
||||||
- 에러 조건: RE%, RF%, REC%, RIB%, 기타 모든 에러 코드
|
|
||||||
|
|
||||||
성능 최적화:
|
|
||||||
- PK 인덱스 (EAIBZWKDSTCD, MSGDPSTYMS, EAISVCSERNO, LOGPRCSSSERNO) 활용
|
|
||||||
- EAIBZWKDSTCD를 고정하여 Index Range Scan 보장
|
|
||||||
-->
|
|
||||||
<statement id="selectHourlyMetricsByBzwkCode" parameterClass="java.util.HashMap" resultMap="obpGwMetricResult">
|
|
||||||
SELECT
|
|
||||||
EAISVCNAME AS API_ID,
|
|
||||||
CLIENTID AS CLIENT_ID,
|
|
||||||
EAISEVRINSTNCNAME AS HOSTNAME,
|
|
||||||
ORGID AS ORG_ID,
|
|
||||||
'$timeslice$' AS TIMESLICE,
|
|
||||||
SUM(CASE WHEN LOGPRCSSSERNO = '100' THEN 1 ELSE 0 END) AS ATTEMPTED_COUNT,
|
|
||||||
SUM(CASE WHEN LOGPRCSSSERNO = '400'
|
|
||||||
AND (RSPNSERRCDNAME IS NULL OR RSPNSERRCDNAME LIKE 'ESB%')
|
|
||||||
THEN 1 ELSE 0 END) AS COMPLETED_COUNT,
|
|
||||||
MAX(TRIM(EAISVCSERNO)) AS EAI_SVC_SERNO
|
|
||||||
FROM $schemaId$.$tableName$
|
|
||||||
WHERE EAIBZWKDSTCD = #bzwkCode#
|
|
||||||
AND MSGDPSTYMS BETWEEN #startTime# AND #endTime#
|
|
||||||
GROUP BY EAISVCNAME, CLIENTID, EAISEVRINSTNCNAME, ORGID
|
|
||||||
HAVING SUM(CASE WHEN LOGPRCSSSERNO = '100' THEN 1 ELSE 0 END) > 0
|
|
||||||
OR SUM(CASE WHEN LOGPRCSSSERNO = '400' THEN 1 ELSE 0 END) > 0
|
|
||||||
</statement>
|
|
||||||
|
|
||||||
<!-- API 이름 조회 (TSEAIHE01) -->
|
|
||||||
<statement id="selectApiNames" parameterClass="java.util.HashMap" resultClass="java.util.HashMap">
|
|
||||||
SELECT
|
|
||||||
EAISVCNAME AS API_ID,
|
|
||||||
EAISVCDESC AS API_NAME
|
|
||||||
FROM $schemaId$.TSEAIHE01
|
|
||||||
WHERE EAISVCNAME IN
|
|
||||||
<iterate property="apiIds" open="(" close=")" conjunction=",">
|
|
||||||
#apiIds[]#
|
|
||||||
</iterate>
|
|
||||||
</statement>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
URI 및 HTTP Method 조회 (HTTP_ADAPTER_EXTRA_LOG)
|
|
||||||
- GUID = TSEAILG1X.EAISVCSERNO
|
|
||||||
- SERVICE_PROCESS_NUMBER = 100 (인바운드 요청)
|
|
||||||
- 결과: HTTP_METHOD (예: POST), URL (예: /mapi/kjbank/obp/kakaobank/v3/loan/query)
|
|
||||||
-->
|
|
||||||
<statement id="selectUris" parameterClass="java.util.HashMap" resultClass="java.util.HashMap">
|
|
||||||
SELECT
|
|
||||||
GUID AS EAI_SVC_SERNO,
|
|
||||||
URL AS URI,
|
|
||||||
HTTP_METHOD AS METHOD
|
|
||||||
FROM $schemaId$.HTTP_ADAPTER_EXTRA_LOG
|
|
||||||
WHERE SERVICE_PROCESS_NUMBER = 100
|
|
||||||
AND GUID IN
|
|
||||||
<iterate property="eaiSvcSernos" open="(" close=")" conjunction=",">
|
|
||||||
#eaiSvcSernos[]#
|
|
||||||
</iterate>
|
|
||||||
</statement>
|
|
||||||
|
|
||||||
<!-- AppId 조회 (ptl_app_request) - org_id로 조회 -->
|
|
||||||
<statement id="selectAppIdsByOrgIds" parameterClass="java.util.HashMap" resultClass="java.util.HashMap">
|
|
||||||
SELECT
|
|
||||||
ORG_ID,
|
|
||||||
ID AS APP_ID
|
|
||||||
FROM PTL_APP_REQUEST
|
|
||||||
WHERE ORG_ID IN
|
|
||||||
<iterate property="orgIds" open="(" close=")" conjunction=",">
|
|
||||||
#orgIds[]#
|
|
||||||
</iterate>
|
|
||||||
</statement>
|
|
||||||
|
|
||||||
</sqlMap>
|
|
||||||
Reference in New Issue
Block a user