Merge remote-tracking branch 'origin/jenkins_with_weblogic' into jenkins_with_weblogic
This commit is contained in:
@@ -202,6 +202,4 @@
|
||||
<!-- 로그추축 -->
|
||||
<sqlMap resource="com/eactive/eai/apim/portalstatistics/EAILog-oracle.xml" />
|
||||
|
||||
<!-- ObpGwMetric 시간별 거래량 지표 -->
|
||||
<sqlMap resource="com/eactive/eai/apim/obp/ObpGwMetric-oracle.xml" />
|
||||
</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) {
|
||||
return repository.findByTimesliceAndApiIdAndClientIdAndHostnameAndOrgId(
|
||||
timeslice, apiId, clientId, hostname, orgId);
|
||||
return repository.findByUniqueKeyNullSafe(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.eai.rms.common.base.BaseService;
|
||||
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.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.ObpGwMetricVO;
|
||||
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 YYYYMMDD_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
|
||||
|
||||
private final ObpGwMetricDAO obpGwMetricDAO;
|
||||
private final ObpGwMetricJpaDAO obpGwMetricJpaDAO;
|
||||
private final ObpGwMetricService obpGwMetricService;
|
||||
|
||||
public ObpGwMetricManService(ObpGwMetricDAO obpGwMetricDAO, ObpGwMetricService obpGwMetricService) {
|
||||
this.obpGwMetricDAO = obpGwMetricDAO;
|
||||
public ObpGwMetricManService(ObpGwMetricJpaDAO obpGwMetricJpaDAO, ObpGwMetricService obpGwMetricService) {
|
||||
this.obpGwMetricJpaDAO = obpGwMetricJpaDAO;
|
||||
this.obpGwMetricService = obpGwMetricService;
|
||||
}
|
||||
|
||||
@@ -101,10 +100,10 @@ public class ObpGwMetricManService extends BaseService {
|
||||
// 1단계: GW DB에서 EAIBZWKDSTCD 코드 목록 조회
|
||||
// ═══════════════════════════════════════════════════════════════════
|
||||
long step1Start = System.currentTimeMillis();
|
||||
DataSourceType apigwDataSourceType = DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.APIGW);
|
||||
DataSourceContextHolder.setDataSourceType(apigwDataSourceType);
|
||||
DataSourceContextHolder.setDataSourceType(
|
||||
DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.APIGW));
|
||||
|
||||
List<String> bzwkCodes = obpGwMetricDAO.selectAllBzwkCodes(apigwDataSourceType.getSchema());
|
||||
List<String> bzwkCodes = obpGwMetricJpaDAO.selectAllBzwkCodes();
|
||||
log.info("[1단계] EAIBZWKDSTCD 코드 조회 완료: count={}, elapsed={}ms",
|
||||
bzwkCodes.size(), System.currentTimeMillis() - step1Start);
|
||||
|
||||
@@ -118,15 +117,8 @@ public class ObpGwMetricManService extends BaseService {
|
||||
for (String bzwkCode : bzwkCodes) {
|
||||
long codeStart = System.currentTimeMillis();
|
||||
|
||||
HashMap<String, Object> paramMap = new HashMap<>();
|
||||
paramMap.put("schemaId", apigwDataSourceType.getSchema());
|
||||
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);
|
||||
List<ObpGwMetricVO> partialResult = obpGwMetricJpaDAO.selectHourlyMetricsByBzwkCode(
|
||||
tableName, bzwkCode, startTime, endTime, timeslice);
|
||||
|
||||
for (ObpGwMetricVO vo : partialResult) {
|
||||
String key = vo.getAggregationKey();
|
||||
@@ -164,8 +156,8 @@ public class ObpGwMetricManService extends BaseService {
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
Map<String, String> apiNameMap = obpGwMetricDAO.selectApiNames(apigwDataSourceType.getSchema(), apiIds);
|
||||
ObpGwMetricDAO.UriMethodResult uriMethodResult = obpGwMetricDAO.selectUrisAndMethods(apigwDataSourceType.getSchema(), eaiSvcSernos);
|
||||
Map<String, String> apiNameMap = obpGwMetricJpaDAO.selectApiNames(apiIds);
|
||||
ObpGwMetricJpaDAO.UriMethodResult uriMethodResult = obpGwMetricJpaDAO.selectUrisAndMethods(eaiSvcSernos);
|
||||
Map<String, String> uriMap = uriMethodResult.getUriMap();
|
||||
Map<String, String> methodMap = uriMethodResult.getMethodMap();
|
||||
log.info("[3단계] 부가정보 조회 완료: apiCount={}, eaiSvcSernoCount={}, elapsed={}ms",
|
||||
@@ -182,7 +174,7 @@ public class ObpGwMetricManService extends BaseService {
|
||||
.map(ObpGwMetricVO::getOrgId)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
Map<String, String> appIdMap = obpGwMetricDAO.selectAppIdsByOrgIds(orgIds);
|
||||
Map<String, String> appIdMap = obpGwMetricJpaDAO.selectAppIdsByOrgIds(orgIds);
|
||||
|
||||
int insertCount = 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