diff --git a/pom.xml b/pom.xml index f3876c4e..a64bdd21 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ io.github.oneteme.traceapi traceapi-core - 0.0.15-SNAPSHOT + 0.0.16-SNAPSHOT io.github.oneteme diff --git a/src/main/java/org/usf/trace/api/server/ApiController.java b/src/main/java/org/usf/trace/api/server/ApiController.java deleted file mode 100644 index 7ad8dc75..00000000 --- a/src/main/java/org/usf/trace/api/server/ApiController.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.usf.trace.api.server; - -import static java.util.Objects.isNull; -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; -import static org.springframework.http.ResponseEntity.accepted; -import static org.usf.trace.api.server.Utils.requireSingle; -import static org.usf.traceapi.core.RemoteTraceSender.INCOMING_ENDPOINT; -import static org.usf.traceapi.core.RemoteTraceSender.MAIN_ENDPOINT; -import static org.usf.traceapi.core.RemoteTraceSender.TRACE_ENDPOINT; - -import java.time.Instant; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.usf.traceapi.core.ApplicationInfo; -import org.usf.traceapi.core.IncomingRequest; -import org.usf.traceapi.core.MainRequest; -import org.usf.traceapi.core.OutcomingRequest; -import org.usf.traceapi.core.Session; - -import lombok.RequiredArgsConstructor; - -@CrossOrigin -@RestController -@RequestMapping(value = TRACE_ENDPOINT, produces = APPLICATION_JSON_VALUE) -@RequiredArgsConstructor -public class ApiController { - - private final RequestDao dao; - private final SessionQueueService queueService; - - @PutMapping(INCOMING_ENDPOINT) - public ResponseEntity saveRequest(@RequestBody IncomingRequest req) { - return appendRequest(req); - } - - @PutMapping(MAIN_ENDPOINT) - public ResponseEntity saveRequest(HttpServletRequest hsr, @RequestBody MainRequest req) { - if(isNull(req.getApplication())) { //set IP address for WABAPP trace - req.setApplication(new ApplicationInfo(null, null, hsr.getRemoteAddr(), null, null, null)); - } - else if(isNull(req.getApplication().getAddress())) { - req.setApplication(req.getApplication().withAddress(hsr.getRemoteAddr())); - } - return appendRequest(req); - } - - private ResponseEntity appendRequest(Session session){ - queueService.add(session); - return accepted().build(); - } - - @GetMapping(INCOMING_ENDPOINT) - public List getIncomingRequestByCriteria( - @RequestParam(defaultValue = "true", name = "lazy") boolean lazy, - @RequestParam(required = false, name = "id") String[] id, - @RequestParam(required = false, name = "name") String[] name, - @RequestParam(required = false, name = "env") String[] env, - @RequestParam(required = false, name = "port") String[] port, - @RequestParam(required = false, name = "start") Instant start, - @RequestParam(required = false, name = "end") Instant end ){ // without tree - FilterCriteria fc = new FilterCriteria(id,null,name,env,port,null,start,end); - System.out.println(fc.toString()); - return dao.getIncomingRequestByCriteria(lazy,fc); - } - - @GetMapping("incoming/request/{id}") - public IncomingRequest getIncomingRequestById(@PathVariable String id) { // without tree - return requireSingle(dao.getIncomingRequestById(true, id)); - } - - @GetMapping(MAIN_ENDPOINT) - public List getMainRequestByCriteria( - @RequestParam(defaultValue = "true", name = "lazy") boolean lazy, - @RequestParam(required = false, name = "id") String[] id, - @RequestParam(required = false, name = "env") String[] env, - @RequestParam(required = false, name = "launchmode") String[] launchMode, - @RequestParam(required = false, name = "start") Instant start, - @RequestParam(required = false, name = "end") Instant end ) { - - FilterCriteria fc = new FilterCriteria(null,id,null,env,null,launchMode,start,end); - return dao.getMainRequestByCriteria(lazy,fc); - } - - @GetMapping("main/request/{id}") - public MainRequest getMainRequestById(@PathVariable String id) { // without tree - return requireSingle(dao.getMainRequestById(true, id)); - } - - @GetMapping("incoming/request/{id}/out") - public OutcomingRequest getOutcomingRequestById(@PathVariable String id) { - return dao.getOutcomingRequestById(id); - } - - @GetMapping("incoming/request/{id}/tree") //LATER - public IncomingRequest getIncomingRequestTreeById(@PathVariable String id) { - return requireSingle(dao.getIncomingRequestById(true, id)); //change query - } - -} - - diff --git a/src/main/java/org/usf/trace/api/server/Exchange.java b/src/main/java/org/usf/trace/api/server/Exchange.java index dfe22388..99ea5f71 100644 --- a/src/main/java/org/usf/trace/api/server/Exchange.java +++ b/src/main/java/org/usf/trace/api/server/Exchange.java @@ -1,7 +1,8 @@ package org.usf.trace.api.server; -import org.usf.traceapi.core.IncomingRequest; -import org.usf.traceapi.core.OutcomingRequest; +import lombok.Setter; +import org.usf.traceapi.core.ApiSession; +import org.usf.traceapi.core.ApiRequest; import lombok.Getter; @@ -11,12 +12,9 @@ * */ @Getter -public final class Exchange extends OutcomingRequest { +@Setter +public final class Exchange extends ApiRequest { - private IncomingRequest remoteTrace; - - public Exchange(String id) { - super(id); - } + private ApiSession remoteTrace; } diff --git a/src/main/java/org/usf/trace/api/server/FilterCriteria.java b/src/main/java/org/usf/trace/api/server/FilterCriteria.java index fcb53de8..2e9af163 100644 --- a/src/main/java/org/usf/trace/api/server/FilterCriteria.java +++ b/src/main/java/org/usf/trace/api/server/FilterCriteria.java @@ -21,9 +21,7 @@ @AllArgsConstructor public class FilterCriteria { - private final String[] idIncoming; // - - private final String[] idMain; + private final String[] idSession; // private final String[] name; private final String[] env; private final String[] port; @@ -33,8 +31,7 @@ public class FilterCriteria { private final Instant end; - public String toSql(Filters idIncomingColname, - Filters idMainColname, + public String toSql(Filters idSession, Filters nameColname, Filters envColname, Filters portColname, @@ -45,8 +42,7 @@ public String toSql(Filters idIncomingColname, Collection argTypes) { var sql = " WHERE 1 = 1"; - sql += toSql(idIncomingColname,args,argTypes,getIdIncoming()); - sql += toSql(idMainColname,args,argTypes,getIdMain()); + sql += toSql(idSession,args,argTypes,getIdSession()); sql += toSql(nameColname,args,argTypes,getName()); sql += toSql(envColname,args,argTypes,getEnv()); sql += toSql(portColname,args,argTypes,getPort()); @@ -70,7 +66,7 @@ String toSql(Filters colname, Collection args, Collection argTy if(values.length == 1){ return " AND "+ sql; } - return " AND (" + sql + " " + colname + "IN(" + Utils.nArg(values.length) + "))";//error + return " AND (" + sql + " " + colname + " IN(" + Utils.nArg(values.length) + "))";//error } args.addAll(Arrays.asList(values)); argTypes.addAll(Collections.nCopies(values.length, colname.getType())); @@ -101,8 +97,7 @@ String endToSql(Filters end , Collection args, Collection argTy @Override public String toString() { return "FilterCriteria{" + - "id=" + Arrays.toString(idIncoming) + - ", host=" + Arrays.toString(name) + + "host=" + Arrays.toString(name) + ", env=" + Arrays.toString(env) + ", port=" + Arrays.toString(port) + ", start='" + start + '\'' + diff --git a/src/main/java/org/usf/trace/api/server/Filters.java b/src/main/java/org/usf/trace/api/server/Filters.java index 77fc6c11..1940bb2c 100644 --- a/src/main/java/org/usf/trace/api/server/Filters.java +++ b/src/main/java/org/usf/trace/api/server/Filters.java @@ -5,8 +5,7 @@ public enum Filters { - ID_IN_REQ(VARCHAR), - ID_MAIN_REQ(VARCHAR), + ID_SES(VARCHAR), VA_APP_NME(VARCHAR), VA_ENV(VARCHAR), CD_PRT(INTEGER), diff --git a/src/main/java/org/usf/trace/api/server/RequestDao.java b/src/main/java/org/usf/trace/api/server/RequestDao.java index 5c661097..1c8e7257 100644 --- a/src/main/java/org/usf/trace/api/server/RequestDao.java +++ b/src/main/java/org/usf/trace/api/server/RequestDao.java @@ -13,6 +13,7 @@ import static org.usf.trace.api.server.Utils.nArg; import static org.usf.trace.api.server.Utils.newArray; +import java.sql.ResultSet; import java.sql.Timestamp; import java.time.Instant; import java.util.*; @@ -20,9 +21,9 @@ import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Stream; -import com.sun.tools.javac.Main; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -43,15 +44,16 @@ public class RequestDao { @Transactional(rollbackFor = Exception.class) public void saveSessions(List sessions) { - filterAndSave(sessions, IncomingRequest.class, this::addIncomingRequest); - filterAndSave(sessions, MainRequest.class, this::addMainRequest); - filterSubAndSave(sessions, Session::getRequests, (s, r)-> new OutcomingRequestWrapper(r, s.getId()), this::addOutcomingRequest); - filterSubAndSave(sessions, Session::getQueries, (s, q)-> new OutcomingQueryWrapper(q, s.getId()), this::addOutcomingQueries); + filterAndSave(sessions, ApiSession.class, this::addIncomingRequest); + filterAndSave(sessions, MainSession.class, this::addMainRequest); + filterSubAndSave(sessions, Session::getRequests, (s, r) -> new OutcomingRequestWrapper(r, s.getId()), this::addOutcomingRequest); + filterSubAndSave(sessions, Session::getQueries, (s, q) -> new OutcomingQueryWrapper(q, s.getId()), this::addOutcomingQueries); + filterSubAndSave(sessions, Session::getStages, (s, st) -> new OutcomingStagesWrapper(st, s.getId()), this::addOutcomingStages); } - - private void addMainRequest(List reqList) { - template.batchUpdate("INSERT INTO E_MAIN_REQ(ID_MAIN_REQ,VA_NAME,VA_USR,DH_DBT,DH_FIN,LNCH,LOC,VA_THRED,VA_APP_NME,VA_VRS,VA_ADRS,VA_ENV,VA_OS,VA_RE,VA_ERR_CLS,VA_ERR_MSG)" - + " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", reqList, reqList.size(), (ps, o) -> { + + private void addMainRequest(List reqList) { + template.batchUpdate("INSERT INTO E_MAIN_SES(ID_SES,VA_NAME,VA_USR,DH_DBT,DH_FIN,LNCH,LOC,VA_THRED,VA_APP_NME,VA_VRS,VA_ADRS,VA_ENV,VA_OS,VA_RE,VA_ERR_CLS,VA_ERR_MSG)" + + " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", reqList, reqList.size(), (ps, o) -> { var app = nullableApplication(o.getApplication()); var exp = nullableException(o.getException()); ps.setString(1, o.getId()); @@ -73,9 +75,9 @@ private void addMainRequest(List reqList) { }); } - private void addIncomingRequest(List reqList) { - template.batchUpdate("INSERT INTO E_IN_REQ(ID_IN_REQ,VA_MTH,VA_PRTCL,VA_HST,CD_PRT,VA_PTH,VA_QRY,VA_CNT_TYP,VA_AUTH,CD_STT,VA_I_SZE,VA_O_SZE,DH_DBT,DH_FIN,VA_THRED,VA_ERR_CLS,VA_ERR_MSG,VA_API_NME,VA_USR,VA_APP_NME,VA_VRS,VA_ADRS,VA_ENV,VA_OS,VA_RE)" - + " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", reqList, reqList.size(), (ps, o) -> { + private void addIncomingRequest(List reqList) { + template.batchUpdate("INSERT INTO E_API_SES(ID_SES,VA_MTH,VA_PRTCL,VA_HST,CD_PRT,VA_PTH,VA_QRY,VA_CNT_TYP,VA_AUTH,CD_STT,VA_I_SZE,VA_O_SZE,DH_DBT,DH_FIN,VA_THRED,VA_ERR_CLS,VA_ERR_MSG,VA_API_NME,VA_USR,VA_APP_NME,VA_VRS,VA_ADRS,VA_ENV,VA_OS,VA_RE)" + + " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", reqList, reqList.size(), (ps, o) -> { var app = nullableApplication(o.getApplication()); var exp = nullableException(o.getException()); ps.setString(1, o.getId()); @@ -84,7 +86,7 @@ private void addIncomingRequest(List reqList) { ps.setString(4, o.getHost()); ps.setInt(5, o.getPort()); ps.setString(6, o.getPath()); - ps.setString(7, o.getQuery()); + ps.setString(7, o.getQuery()); ps.setString(8, o.getContentType()); ps.setString(9, o.getAuthScheme()); ps.setInt(10, o.getStatus()); @@ -107,8 +109,8 @@ private void addIncomingRequest(List reqList) { } private void addOutcomingRequest(List reqList) { - template.batchUpdate("INSERT INTO E_OUT_REQ(ID_OUT_REQ,VA_MTH,VA_PRTCL,VA_HST,CD_PRT,VA_PTH,VA_QRY,VA_CNT_TYP,VA_AUTH,CD_STT,VA_I_SZE,VA_O_SZE,DH_DBT,DH_FIN,VA_THRED,VA_ERR_CLS,VA_ERR_MSG,CD_IN_REQ)" - + " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", reqList, reqList.size(), (ps, o) -> { + template.batchUpdate("INSERT INTO E_API_REQ(CD_API,VA_MTH,VA_PRTCL,VA_HST,CD_PRT,VA_PTH,VA_QRY,VA_CNT_TYP,VA_AUTH,CD_STT,VA_I_SZE,VA_O_SZE,DH_DBT,DH_FIN,VA_THRED,VA_ERR_CLS,VA_ERR_MSG,CD_SES)" + + " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", reqList, reqList.size(), (ps, o) -> { var exp = nullableException(o.getException()); ps.setString(1, o.getId()); ps.setString(2, o.getMethod()); @@ -125,22 +127,38 @@ private void addOutcomingRequest(List reqList) { ps.setTimestamp(13, fromNullableInstant(o.getStart())); ps.setTimestamp(14, fromNullableInstant(o.getEnd())); ps.setString(15, o.getThreadName()); - ps.setString(16,exp.getClassname()); - ps.setString(17,exp.getMessage()); + ps.setString(16, exp.getClassname()); + ps.setString(17, exp.getMessage()); ps.setString(18, o.getParentId()); }); } + public void addOutcomingStages(List stagesList){ + template.batchUpdate("INSERT INTO E_STG(VA_NAME,LOC,DH_DBT,DH_FIN,VA_USR,VA_THRED,VA_ERR_CLS,VA_ERR_MSG,CD_SES)" + + " VALUES(?,?,?,?,?,?,?,?,?)", stagesList,stagesList.size(),(ps,o)-> { + var exp = nullableException(o.getException()); + ps.setString(1,o.getName()); + ps.setString(2,o.getLocation()); + ps.setTimestamp(3,fromNullableInstant(o.getStart())); + ps.setTimestamp(4,fromNullableInstant(o.getEnd())); + ps.setString(5,o.getUser()); + ps.setString(6,o.getThreadName()); + ps.setString(7,exp.getClassname()); + ps.setString(8,exp.getMessage()); + ps.setString(9,o.getParentId()); + }); + } + private void addOutcomingQueries(List qryList) { - var maxId = template.queryForObject("SELECT COALESCE(MAX(ID_OUT_QRY), 0) FROM E_OUT_QRY", Long.class); + var maxId = template.queryForObject("SELECT COALESCE(MAX(ID_OUT_QRY), 0) FROM E_DB_REQ", Long.class); var inc = new AtomicLong(maxId); - template.batchUpdate("INSERT INTO E_OUT_QRY(ID_OUT_QRY,VA_HST,VA_SCHMA,DH_DBT,DH_FIN,VA_USR,VA_THRED,VA_DRV,VA_DB_NME,VA_DB_VRS,VA_CMPLT,CD_IN_REQ)" - + " VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", qryList, qryList.size(), (ps, o) -> { + template.batchUpdate("INSERT INTO E_DB_REQ(ID_OUT_QRY,VA_HST,VA_SCHMA,DH_DBT,DH_FIN,VA_USR,VA_THRED,VA_DRV,VA_DB_NME,VA_DB_VRS,VA_CMPLT,CD_SES)" + + " VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", qryList, qryList.size(), (ps, o) -> { ps.setLong(1, inc.incrementAndGet()); ps.setString(2, o.getHost()); ps.setString(3, o.getSchema()); ps.setTimestamp(4, fromNullableInstant(o.getStart())); - ps.setTimestamp(5, fromNullableInstant(o.getEnd())); + ps.setTimestamp(5, fromNullableInstant(o.getEnd())); ps.setString(6, o.getUser()); ps.setString(7, o.getThreadName()); ps.setString(8, o.getDriverVersion()); @@ -167,12 +185,13 @@ private void addDatabaseActions(List queries) { } @Deprecated // reuse RequestDao::outcomingRequests using criteria - public OutcomingRequest getOutcomingRequestById(String id) { - return template.query("SELECT ID_OUT_REQ,VA_PRTCL,VA_HST,CD_PRT,VA_PTH,VA_QRY,VA_MTH,CD_STT,VA_I_SZE,VA_O_SZE,DH_DBT,DH_FIN,VA_THRED,CD_IN_REQ FROM E_OUT_REQ" - + " WHERE ID_OUT_REQ = ? ", new Object[]{id}, newArray(1, VARCHAR), rs -> { + public ApiRequest getOutcomingRequestById(String id) { + return template.query("SELECT CD_API,VA_PRTCL,VA_HST,CD_PRT,VA_PTH,VA_QRY,VA_MTH,CD_STT,VA_I_SZE,VA_O_SZE,DH_DBT,DH_FIN,VA_THRED,CD_SES FROM E_API_REQ" + + " WHERE CD_API = ? ", new Object[]{id}, newArray(1, VARCHAR), rs -> { - if(rs.next()) { - OutcomingRequest out = new OutcomingRequest(rs.getString("ID_OUT_REQ")); + if (rs.next()) { + ApiRequest out = new ApiRequest(); + out.setId(rs.getString("CD_API")); out.setProtocol(rs.getString("VA_PRTCL")); out.setHost(rs.getString("VA_HST")); out.setPort(rs.getInt("CD_PRT")); @@ -191,16 +210,15 @@ public OutcomingRequest getOutcomingRequestById(String id) { }); } - public List getMainRequestByCriteria(boolean lazy, FilterCriteria fc) { - var query = "SELECT ID_MAIN_REQ,VA_NAME,VA_USR,DH_DBT,DH_FIN,LNCH,LOC,VA_THRED,VA_APP_NME,VA_VRS,VA_ADRS,VA_ENV,VA_OS,VA_RE,VA_ERR_CLS,VA_ERR_MSG FROM E_MAIN_REQ"; + public List getMainRequestByCriteria(boolean lazy, FilterCriteria fc, Supplier fn) { + var query = "SELECT ID_SES,VA_NAME,VA_USR,DH_DBT,DH_FIN,LNCH,LOC,VA_THRED,VA_APP_NME,VA_VRS,VA_ADRS,VA_ENV,VA_OS,VA_RE,VA_ERR_CLS,VA_ERR_MSG FROM E_MAIN_SES"; Collection argTypes = new ArrayList<>(); - Collection args = new ArrayList<>(); - query += fc.toSql(ID_IN_REQ,ID_MAIN_REQ,VA_APP_NME,VA_ENV,CD_PRT,LNCH,DH_DBT,DH_FIN,args,argTypes); - - - List res = template.query(query, args.toArray() , argTypes.stream().mapToInt(i -> i).toArray(),(rs, i) -> { - MainRequest main = new MainRequest(rs.getString("ID_MAIN_REQ")); + Collection args = new ArrayList<>(); + query += fc.toSql(ID_SES, VA_APP_NME, VA_ENV, CD_PRT, LNCH, DH_DBT, DH_FIN, args, argTypes); + List res = template.query(query, args.toArray(), argTypes.stream().mapToInt(i -> i).toArray(), (rs, i) -> { + MainSession main = new MainSession(); + main.setId(rs.getString("ID_SES")); // add value of nullable main.setName(rs.getString("VA_NAME")); main.setUser(rs.getString("VA_USR")); main.setStart(fromNullableTimestamp(rs.getTimestamp("DH_DBT"))); @@ -222,62 +240,29 @@ public List getMainRequestByCriteria(boolean lazy, FilterCriteria f )); return main; }); - if(lazy && !res.isEmpty()) { - var reqMap = res.stream().collect(toMap(MainRequest::getId, identity())); - outcomingRequests(reqMap.keySet()).forEach(r-> reqMap.get(r.getParentId()).getRequests().add(r.getRequest())); - outcomingQueries(reqMap.keySet()).forEach(q-> reqMap.get(q.getParentId()).getQueries().add(q.getQuery())); + if (lazy && !res.isEmpty()) { + var reqMap = res.stream().collect(toMap(MainSession::getId, identity())); + outcomingRequests(reqMap.keySet(), fn).forEach(r -> reqMap.get(r.getParentId()).getRequests().add(r.getRequest())); + outcomingStages(reqMap.keySet(),RunnableStage::new).forEach(r -> reqMap.get(r.getParentId()).getStages().add(r.getStage())); + outcomingQueries(reqMap.keySet()).forEach(q -> reqMap.get(q.getParentId()).getQueries().add(q.getQuery())); } return res; } - - public List getMainRequestById(boolean lazy, String... idArr) { - var query = "SELECT ID_MAIN_REQ,VA_NAME,VA_USR,DH_DBT,DH_FIN,LNCH,LOC,VA_THRED,VA_APP_NME,VA_VRS,VA_ADRS,VA_ENV,VA_OS,VA_RE,VA_ERR_CLS,VA_ERR_MSG FROM E_MAIN_REQ"; - int[] argTypes = null; - if(!isEmpty(idArr)) { - query += " WHERE ID_MAIN_REQ IN(" + nArg(idArr.length) + ")"; - argTypes = newArray(idArr.length, VARCHAR); - } - query += " order by DH_DBT desc"; - List res = template.query(query, idArr, argTypes, (rs, i) -> { - MainRequest main = new MainRequest(rs.getString("ID_MAIN_REQ")); - main.setName(rs.getString("VA_NAME")); - main.setUser(rs.getString("VA_USR")); - main.setStart(fromNullableTimestamp(rs.getTimestamp("DH_DBT"))); - main.setEnd(fromNullableTimestamp(rs.getTimestamp("DH_FIN"))); - main.setLaunchMode(valueOfNullable(LaunchMode.class, rs.getString("LNCH"))); - main.setLocation(rs.getString("LOC")); - main.setThreadName(rs.getString("VA_THRED")); - main.setApplication(new ApplicationInfo( - rs.getString("VA_APP_NME"), - rs.getString("VA_VRS"), - rs.getString("VA_ADRS"), - rs.getString("VA_ENV"), - rs.getString("VA_OS"), - rs.getString("VA_RE") - )); - main.setException(new ExceptionInfo( - rs.getString("VA_ERR_CLS"), - rs.getString("VA_ERR_MSG") - )); - return main; - }); - if(lazy && !res.isEmpty()) { - var reqMap = res.stream().collect(toMap(MainRequest::getId, identity())); - outcomingRequests(reqMap.keySet()).forEach(r-> reqMap.get(r.getParentId()).getRequests().add(r.getRequest())); - outcomingQueries(reqMap.keySet()).forEach(q-> reqMap.get(q.getParentId()).getQueries().add(q.getQuery())); - } - return res; + public List getMainRequestById(boolean lazy, Supplier fn, String... idArr){ + FilterCriteria fc = new FilterCriteria(idArr,null,null,null,null,null,null); + return getMainRequestByCriteria(lazy, fc, fn); } - public List getIncomingRequestByCriteria(boolean lazy, FilterCriteria fs) { - var query = "SELECT ID_IN_REQ,VA_MTH,VA_PRTCL,VA_HST,CD_PRT,VA_PTH,VA_QRY,VA_CNT_TYP,VA_AUTH,CD_STT,VA_I_SZE,VA_O_SZE,DH_DBT,DH_FIN,VA_THRED,VA_ERR_CLS,VA_ERR_MSG,VA_API_NME,VA_USR,VA_APP_NME,VA_VRS,VA_ADRS,VA_ENV,VA_OS,VA_RE FROM E_IN_REQ "; + public List getIncomingRequestByCriteria(boolean lazy, FilterCriteria fs, Supplier fn) { + var query = "SELECT ID_SES,VA_MTH,VA_PRTCL,VA_HST,CD_PRT,VA_PTH,VA_QRY,VA_CNT_TYP,VA_AUTH,CD_STT,VA_I_SZE,VA_O_SZE,DH_DBT,DH_FIN,VA_THRED,VA_ERR_CLS,VA_ERR_MSG,VA_API_NME,VA_USR,VA_APP_NME,VA_VRS,VA_ADRS,VA_ENV,VA_OS,VA_RE FROM E_API_SES "; Collection argTypes = new ArrayList<>(); - Collection args = new ArrayList<>(); - query += fs.toSql(ID_IN_REQ,ID_MAIN_REQ,VA_APP_NME,VA_ENV,CD_PRT,LNCH,DH_DBT,DH_FIN,args,argTypes); + Collection args = new ArrayList<>(); + query += fs.toSql(ID_SES, VA_APP_NME, VA_ENV, CD_PRT, LNCH, DH_DBT, DH_FIN, args, argTypes); query += " order by DH_DBT desc"; - List res = template.query(query, args.toArray() , argTypes.stream().mapToInt(i -> i).toArray() , (rs, i) -> { - IncomingRequest in = new IncomingRequest(rs.getString("ID_IN_REQ")); + List res = template.query(query, args.toArray(), argTypes.stream().mapToInt(i -> i).toArray(), (rs, i) -> { + ApiSession in = new ApiSession(); + in.setId(rs.getString("ID_SES")); in.setMethod(rs.getString("VA_MTH")); in.setProtocol(rs.getString("VA_PRTCL")); in.setHost(rs.getString("VA_HST")); @@ -308,73 +293,66 @@ public List getIncomingRequestByCriteria(boolean lazy, FilterCr )); return in; }); - if(lazy && !res.isEmpty()) { - var reqMap = res.stream().collect(toMap(IncomingRequest::getId, identity())); - outcomingRequests(reqMap.keySet()).forEach(r-> reqMap.get(r.getParentId()).getRequests().add(r.getRequest())); - outcomingQueries(reqMap.keySet()).forEach(q-> reqMap.get(q.getParentId()).getQueries().add(q.getQuery())); + if (lazy && !res.isEmpty()) { + var reqMap = res.stream().collect(toMap(Session::getId, identity())); + outcomingRequests(reqMap.keySet(), fn).forEach(r -> reqMap.get(r.getParentId()).getRequests().add(r.getRequest())); + outcomingStages(reqMap.keySet(),RunnableStage::new).forEach(r -> reqMap.get(r.getParentId()).getStages().add(r.getStage())); + outcomingQueries(reqMap.keySet()).forEach(q -> reqMap.get(q.getParentId()).getQueries().add(q.getQuery())); } return res; } - public List getIncomingRequestById(boolean lazy, String... idArr) { - var query = "SELECT ID_IN_REQ,VA_MTH,VA_PRTCL,VA_HST,CD_PRT,VA_PTH,VA_QRY,VA_CNT_TYP,VA_AUTH,CD_STT,VA_I_SZE,VA_O_SZE,DH_DBT,DH_FIN,VA_THRED,VA_ERR_CLS,VA_ERR_MSG,VA_API_NME,VA_USR,VA_APP_NME,VA_VRS,VA_ADRS,VA_ENV,VA_OS,VA_RE FROM E_IN_REQ"; - int[] argTypes = null; - if(!isEmpty(idArr)) { - query += " WHERE ID_IN_REQ IN(" + nArg(idArr.length) + ")"; - argTypes = newArray(idArr.length, VARCHAR); + + public List getIncomingRequestById(boolean lazy, Supplier fn, String... idArr){ + FilterCriteria fc = new FilterCriteria(idArr,null,null,null,null,null,null); + return getIncomingRequestByCriteria(lazy, fc, fn); + } + + public Session getTreebyId(String id) { + var query = " with recursive recusive(prnt,chld) as (" + + " select ''::varchar as prnt, ? as chld " + + " union all " + + " select recusive.chld, E_API_REQ.CD_API " + + " from E_API_REQ, recusive " + + " where recusive.chld= E_API_REQ.CD_SES " + + ") select distinct(chld) from recusive"; + + List prntIds = template.query(query, (ResultSet rs, int rowNum) -> (rs.getString("chld")), id).stream().filter(Objects::nonNull).collect(toList()); + List prntIncList = getIncomingRequestById(true, Exchange::new,prntIds.toArray(String[]::new)); + List sessionList = getMainRequestById(true, Exchange::new, id); + if( sessionList != null && !sessionList.isEmpty()){ + prntIncList.add(sessionList.get(0)); } - List res = template.query(query, idArr, argTypes, (rs, i) -> { - IncomingRequest in = new IncomingRequest(rs.getString("ID_IN_REQ")); - in.setMethod(rs.getString("VA_MTH")); - in.setProtocol(rs.getString("VA_PRTCL")); - in.setHost(rs.getString("VA_HST")); - in.setPort(rs.getInt("CD_PRT")); - in.setPath(rs.getString("VA_PTH")); - in.setQuery(rs.getString("VA_QRY")); - in.setContentType((rs.getString("VA_CNT_TYP"))); - in.setAuthScheme((rs.getString("VA_AUTH"))); - in.setStatus(rs.getInt("CD_STT")); - in.setInDataSize(rs.getLong("VA_I_SZE")); - in.setOutDataSize(rs.getLong("VA_I_SZE")); - in.setStart(fromNullableTimestamp(rs.getTimestamp("DH_DBT"))); - in.setEnd(fromNullableTimestamp(rs.getTimestamp("DH_FIN"))); - in.setThreadName(rs.getString("VA_THRED")); - in.setException(new ExceptionInfo( - rs.getString("VA_ERR_CLS"), - rs.getString("VA_ERR_MSG") - )); - in.setName(rs.getString("VA_API_NME")); - in.setUser(rs.getString("VA_USR")); - in.setApplication(new ApplicationInfo( - rs.getString("VA_APP_NME"), - rs.getString("VA_VRS"), - rs.getString("VA_ADRS"), - rs.getString("VA_ENV"), - rs.getString("VA_OS"), - rs.getString("VA_RE") - )); - return in; + prntIncList.forEach((prntA) -> { + prntIncList.forEach((prntB) -> { + if (!Objects.equals(prntA.getId(), prntB.getId())){ + Optional opt = prntB.getRequests().stream() + .filter(k -> prntA.getId().equals(k.getId())) + .findFirst(); + if (opt.isPresent()) { + var ex = (Exchange) opt.get(); + ex.setRemoteTrace((ApiSession) prntA); + } + } + }); }); - if(lazy && !res.isEmpty()) { - var reqMap = res.stream().collect(toMap(IncomingRequest::getId, identity())); - outcomingRequests(reqMap.keySet()).forEach(r-> reqMap.get(r.getParentId()).getRequests().add(r.getRequest())); - outcomingQueries(reqMap.keySet()).forEach(q-> reqMap.get(q.getParentId()).getQueries().add(q.getQuery())); - } - return res; + + return prntIncList.stream().filter(r -> r.getId().equals(id)).findFirst().orElseThrow(); } - public List outcomingRequests(Set incomingId) { //use criteria - var query = "SELECT ID_OUT_REQ,VA_PRTCL,VA_HST,CD_PRT,VA_PTH,VA_QRY,VA_MTH,CD_STT,VA_I_SZE,VA_O_SZE,DH_DBT,DH_FIN,VA_THRED,VA_ERR_CLS,VA_ERR_MSG,CD_IN_REQ FROM E_OUT_REQ" - + " WHERE CD_IN_REQ IN(" + nArg(incomingId.size()) + ") ORDER BY DH_DBT ASC"; + public List outcomingRequests(Set incomingId, Supplier fn) { //use criteria + var query = "SELECT CD_API,VA_PRTCL,VA_HST,CD_PRT,VA_PTH,VA_QRY,VA_MTH,CD_STT,VA_I_SZE,VA_O_SZE,DH_DBT,DH_FIN,VA_THRED,VA_ERR_CLS,VA_ERR_MSG,CD_SES FROM E_API_REQ" + + " WHERE CD_SES IN(" + nArg(incomingId.size()) + ") ORDER BY DH_DBT ASC"; return template.query(query, incomingId.toArray(), newArray(incomingId.size(), VARCHAR), (rs, i) -> { - OutcomingRequestWrapper out = new OutcomingRequestWrapper(rs.getString("ID_OUT_REQ"), rs.getString("CD_IN_REQ")); + OutcomingRequestWrapper out = new OutcomingRequestWrapper(rs.getString("CD_SES"), fn); + out.setId(rs.getString("CD_API")); out.setProtocol(rs.getString("VA_PRTCL")); out.setHost(rs.getString("VA_HST")); out.setPort(rs.getInt("CD_PRT")); out.setPath(rs.getString("VA_PTH")); out.setQuery(rs.getString("VA_QRY")); out.setMethod(rs.getString("VA_MTH")); - out.setStatus( rs.getInt("CD_STT")); + out.setStatus(rs.getInt("CD_STT")); out.setInDataSize(rs.getLong("VA_I_SZE")); out.setOutDataSize(rs.getLong("VA_I_SZE")); out.setStart(fromNullableTimestamp(rs.getTimestamp("DH_DBT"))); @@ -389,11 +367,30 @@ public List outcomingRequests(Set incomingId) { }); } + public List outcomingStages(Set sessionId, Supplier fn){ + var query = "SELECT VA_NAME,LOC,DH_DBT,DH_FIN,VA_USR,VA_THRED,VA_ERR_CLS,VA_ERR_MSG,CD_SES FROM E_STG" + +" WHERE CD_SES IN ("+ nArg(sessionId.size()) + ") ORDER BY DH_DBT"; + return template.query(query,sessionId.toArray(),newArray(sessionId.size(),VARCHAR),(rs,i)-> { + OutcomingStagesWrapper stg = new OutcomingStagesWrapper(rs.getString("CD_SES"),fn); + stg.setName(rs.getString("VA_NAME")); + stg.setLocation(rs.getString("LOC")); + stg.setStart(fromNullableTimestamp(rs.getTimestamp("DH_DBT"))); + stg.setEnd(fromNullableTimestamp(rs.getTimestamp("DH_FIN"))); + stg.setUser(rs.getString("VA_USR")); + stg.setThreadName(rs.getString("VA_THRED")); + stg.setException( new ExceptionInfo( + rs.getString("VA_ERR_CLS"), + rs.getString("VA_ERR_MSG") + )); + return stg; + }); + } + public List outcomingQueries(Set incomingId) { // non empty - var query = "SELECT ID_OUT_QRY,VA_HST,CD_PRT,VA_SCHMA,DH_DBT,DH_FIN,VA_USR,VA_THRED,VA_DRV,VA_DB_NME,VA_DB_VRS,VA_CMPLT,CD_IN_REQ FROM E_OUT_QRY" - + " WHERE CD_IN_REQ IN(" + nArg(incomingId.size()) + ")"; + var query = "SELECT ID_OUT_QRY,VA_HST,CD_PRT,VA_SCHMA,DH_DBT,DH_FIN,VA_USR,VA_THRED,VA_DRV,VA_DB_NME,VA_DB_VRS,VA_CMPLT,CD_SES FROM E_DB_REQ" + + " WHERE CD_SES IN(" + nArg(incomingId.size()) + ")"; var queries = template.query(query, incomingId.toArray(), newArray(incomingId.size(), VARCHAR), (rs, i) -> { - var out = new OutcomingQueryWrapper(rs.getLong("ID_OUT_QRY"), rs.getString("CD_IN_REQ")); + var out = new OutcomingQueryWrapper(rs.getLong("ID_OUT_QRY"), rs.getString("CD_SES")); out.setHost(rs.getString("VA_HST")); out.setPort(rs.getInt("CD_PRT")); out.setSchema(rs.getString("VA_SCHMA")); @@ -407,17 +404,17 @@ public List outcomingQueries(Set incomingId) { // out.setCompleted("T".equals(rs.getString("VA_CMPLT"))); return out; }); - if(!queries.isEmpty()) { - var qMap = queries.stream().collect(toMap(OutcomingQueryWrapper::getId, identity())); //unique - databaseActions(qMap.keySet()).forEach(a-> qMap.get(a.getParentId()).getActions().add(a.getAction())); + if (!queries.isEmpty()) { + var qMap = queries.stream().collect(toMap(OutcomingQueryWrapper::getId, identity())); //unique + databaseActions(qMap.keySet()).forEach(a -> qMap.get(a.getParentId()).getActions().add(a.getAction())); } return queries; } public List databaseActions(Set queries) { // non empty var query = "SELECT VA_TYP,DH_DBT,DH_FIN,VA_ERR_CLS,VA_ERR_MSG,CD_OUT_QRY FROM E_DB_ACT" - + " WHERE CD_OUT_QRY IN(" + nArg(queries.size()) + ") ORDER BY DH_DBT ASC"; - return template.query(query, queries.toArray(), newArray(queries.size(), BIGINT), (rs, i)-> + + " WHERE CD_OUT_QRY IN(" + nArg(queries.size()) + ") ORDER BY DH_DBT ASC"; + return template.query(query, queries.toArray(), newArray(queries.size(), BIGINT), (rs, i) -> new DatabaseActionWrapper( rs.getLong("CD_OUT_QRY"), Action.valueOf(rs.getString("VA_TYP")), @@ -431,49 +428,69 @@ public List databaseActions(Set queries) { // non e @Getter class OutcomingRequestWrapper { - + @Delegate - private final OutcomingRequest request; + private final ApiRequest request; private final String parentId; - public OutcomingRequestWrapper(String id, String parentId) { + public OutcomingRequestWrapper(String parentId, Supplier fn) { this.parentId = parentId; - this.request = new OutcomingRequest(id); //delegated setters + this.request = fn.get(); //delegated setters } - - public OutcomingRequestWrapper(OutcomingRequest request, String parentId) { + + public OutcomingRequestWrapper(ApiRequest request, String parentId) { + this.parentId = parentId; + this.request = request; //delegated getters + } + + } + + @Getter + @Setter + class OutcomingStagesWrapper { + + @Delegate + private final RunnableStage stage; + private final String parentId; + + public OutcomingStagesWrapper(String parentId, Supplier fn){ this.parentId = parentId; - this.request = request; //delegated getters + this.stage = fn.get(); + } + + public OutcomingStagesWrapper(RunnableStage stage, String parentId){ + this.parentId = parentId; + this.stage = stage; } } @Setter @Getter class OutcomingQueryWrapper { - + @Delegate - private final OutcomingQuery query; + private final DatabaseRequest query; private final String parentId; private long id; public OutcomingQueryWrapper(Long id, String parentId) { this.parentId = parentId; this.id = id; - this.query = new OutcomingQuery(); //delegated setters + this.query = new DatabaseRequest(); //delegated setters } - - public OutcomingQueryWrapper(OutcomingQuery query, String parentId) { + + public OutcomingQueryWrapper(DatabaseRequest query, String parentId) { this.parentId = parentId; this.query = query; //delegated getters } } @Getter - class DatabaseActionWrapper { + class DatabaseActionWrapper { - @Delegate - private final DatabaseAction action; - private final long parentId; + @Delegate + private final DatabaseAction action; + private final long parentId; public DatabaseActionWrapper(long parentId, Action type, Instant start, Instant end, ExceptionInfo exception) { this.parentId = parentId; @@ -481,50 +498,50 @@ public DatabaseActionWrapper(long parentId, Action type, Instant start, Instant } } - private static void filterAndSave(Collection c, Class classe, Consumer> saveFn){ - var list = c.stream() - .filter(classe::isInstance) - .map(classe::cast) - .collect(toList()); - if(!list.isEmpty()) { - saveFn.accept(list); - } + private static void filterAndSave(Collection c, Class classe, Consumer> saveFn) { + var list = c.stream() + .filter(classe::isInstance) + .map(classe::cast) + .collect(toList()); + if (!list.isEmpty()) { + saveFn.accept(list); + } } - - private static void filterSubAndSave(Collection c, Function> accessor, BiFunction mapper, Consumer> saveFn){ - var list = c.stream() - .filter(o-> nonNull(accessor.apply(o))) - .flatMap(o-> accessor.apply(o).stream().map(s-> mapper.apply(o, s))) - .collect(toList()); - if(!list.isEmpty()) { - saveFn.accept(list); - } + + private static void filterSubAndSave(Collection c, Function> accessor, BiFunction mapper, Consumer> saveFn) { + var list = c.stream() + .filter(o -> nonNull(accessor.apply(o))) + .flatMap(o -> accessor.apply(o).stream().map(s -> mapper.apply(o, s))) + .collect(toList()); + if (!list.isEmpty()) { + saveFn.accept(list); + } } - + private static Timestamp fromNullableInstant(Instant instant) { - return ofNullable(instant).map(Timestamp::from).orElse(null); + return ofNullable(instant).map(Timestamp::from).orElse(null); } - + private static Instant fromNullableTimestamp(Timestamp timestamp) { - return ofNullable(timestamp).map(Timestamp::toInstant).orElse(null); + return ofNullable(timestamp).map(Timestamp::toInstant).orElse(null); } - + private static ApplicationInfo nullableApplication(ApplicationInfo app) { - return ofNullable(app).orElseGet(()-> new ApplicationInfo(null, null, null, null, null, null)); + return ofNullable(app).orElseGet(() -> new ApplicationInfo(null, null, null, null, null, null)); } - private static ExceptionInfo nullableException(ExceptionInfo exp){ - return ofNullable(exp).orElseGet(()-> new ExceptionInfo(null, null)); + private static ExceptionInfo nullableException(ExceptionInfo exp) { + return ofNullable(exp).orElseGet(() -> new ExceptionInfo(null, null)); } private static String valueOfNullable(Object o) { - return ofNullable(o).map(Object::toString).orElse(null); + return ofNullable(o).map(Object::toString).orElse(null); } private static > T valueOfNullable(Class classe, String value) { - return ofNullable(value) - .flatMap(v-> Stream.of(classe.getEnumConstants()).filter(e-> e.name().equals(v)).findAny()) - .orElse(null); + return ofNullable(value) + .flatMap(v -> Stream.of(classe.getEnumConstants()).filter(e -> e.name().equals(v)).findAny()) + .orElse(null); } } diff --git a/src/main/java/org/usf/trace/api/server/SessionQueueService.java b/src/main/java/org/usf/trace/api/server/SessionQueueService.java index e373bbd2..f3d6660a 100644 --- a/src/main/java/org/usf/trace/api/server/SessionQueueService.java +++ b/src/main/java/org/usf/trace/api/server/SessionQueueService.java @@ -1,11 +1,14 @@ package org.usf.trace.api.server; +import static java.util.Collections.addAll; import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.stream.Collectors.toList; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; +import java.util.Set; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; @@ -33,8 +36,8 @@ public SessionQueueService(RequestDao dao, ScheduleProperties prop) { prop.getDelay()*2, prop.getDelay(), prop.getUnit()); //x2 wait for previous POD backup } - public void add(Session session) { - queue.add(session); + public void add(Session... sessions) { + addAll(queue, sessions); log.info("new request added to the queue : {} session(s)", queue.size()); } @@ -42,6 +45,12 @@ public Collection waitList(){ return new ArrayList<>(queue); // send copy } + public Collection deleteSessions(Set ids){ + var sessions = queue.stream().filter(s-> ids.contains(s.getId())).collect(toList()); + queue.removeAll(sessions); + return sessions; + } + private void safeBackup() { if(!queue.isEmpty()) { var list = new LinkedList(); diff --git a/src/main/java/org/usf/trace/api/server/TraceApiApplication.java b/src/main/java/org/usf/trace/api/server/TraceApiApplication.java index 5171bab1..481872f8 100644 --- a/src/main/java/org/usf/trace/api/server/TraceApiApplication.java +++ b/src/main/java/org/usf/trace/api/server/TraceApiApplication.java @@ -7,6 +7,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.usf.traceapi.core.ApiSession; +import org.usf.traceapi.core.MainSession; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; @@ -23,8 +25,10 @@ public static void main(String[] args) { @Bean @Primary public ObjectMapper mapper(){ - return json() - .build() - .registerModules(new JavaTimeModule(), new ParameterNamesModule()); + var mapper = json() + .modules(new JavaTimeModule(), new ParameterNamesModule()) + .build(); + mapper.registerSubtypes(ApiSession.class, MainSession.class); + return mapper; } } diff --git a/src/main/java/org/usf/trace/api/server/config/DataConstants.java b/src/main/java/org/usf/trace/api/server/config/DataConstants.java index 84f4cb2a..46a00568 100644 --- a/src/main/java/org/usf/trace/api/server/config/DataConstants.java +++ b/src/main/java/org/usf/trace/api/server/config/DataConstants.java @@ -2,6 +2,7 @@ import org.usf.jquery.core.ComparisonExpression; import org.usf.jquery.core.DBColumn; +import org.usf.jquery.core.DBFunction; import org.usf.jquery.core.OperationColumn; import org.usf.jquery.web.TableDecorator; @@ -13,14 +14,14 @@ import static org.usf.jquery.core.ComparisonExpression.*; import static org.usf.jquery.core.DBColumn.*; -import static org.usf.trace.api.server.config.TraceApiColumn.STATUS; +import static org.usf.trace.api.server.config.TraceApiColumn.*; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class DataConstants { public static String sessionColumns(TraceApiColumn column) { switch (column) { - case ID: return "id_main_req"; + case ID: return "id_ses"; case NAME: return "va_name"; case START: return "dh_dbt"; case END: return "dh_fin"; @@ -42,7 +43,7 @@ public static String sessionColumns(TraceApiColumn column) { public static String incReqColumns(TraceApiColumn column) { switch (column) { - case ID: return "id_in_req"; + case ID: return "id_ses"; case METHOD: return "va_mth"; case PROTOCOL: return "va_prtcl"; case HOST: return "va_hst"; @@ -65,13 +66,15 @@ public static String incReqColumns(TraceApiColumn column) { case ENVIRONEMENT: return "va_env"; case OS: return "va_os"; case RE: return "va_re"; + case ERR_TYPE: return "va_err_cls"; + case ERR_MSG: return "va_err_msg"; default: return null; } } public static String outReqColumns(TraceApiColumn column) { switch (column) { - case ID: return "id_out_req"; + case ID: return "cd_api"; case METHOD: return "va_mth"; case PROTOCOL: return "va_prtcl"; case HOST: return "va_hst"; @@ -86,7 +89,9 @@ public static String outReqColumns(TraceApiColumn column) { case START: return "dh_dbt"; case END: return "dh_fin"; case THREAD: return "va_thred"; - case PARENT: return "cd_in_req"; + case ERR_TYPE: return "va_err_cls"; + case ERR_MSG: return "va_err_msg"; + case PARENT: return "cd_ses"; default: return null; } } @@ -104,14 +109,29 @@ public static String outQryColumns(TraceApiColumn column) { case DB_NAME: return "va_db_nme"; case DB_VERSION: return "va_db_vrs"; case COMPLETE: return "va_cmplt"; - case PARENT: return "cd_in_req"; + case PARENT: return "cd_ses"; default: return null; } } + public static String outStgColumns(TraceApiColumn column) { + switch (column){ + case NAME: return "va_name"; + case LOCATION: return "loc"; + case START: return "dh_dbt"; + case END: return "dh_fin"; + case USER: return "va_usr"; + case THREAD: return "va_thred"; + case ERR_TYPE: return "va_err_cls"; + case ERR_MSG: return "va_err_msg"; + case PARENT: return "cd_ses"; + default: return null; + } + } + public static String dbActColumns(TraceApiColumn column){ switch (column){ - case TYPE: return"va_typ"; + case TYPE: return "va_typ"; case START: return "dh_dbt"; case END: return "dh_fin"; case ERR_TYPE: return "va_err_cls"; @@ -121,14 +141,6 @@ public static String dbActColumns(TraceApiColumn column){ } } - public static DBColumn elapsedtime_Tera(TableDecorator table) { - return c -> "(CAST (((DT_FIN - DT_DBT) second(4)) as DECIMAL(15,2)))"; - } - - public static DBColumn asDate_Tera(TableDecorator table) { - return c -> "(CAST(DH_DBT AS DATE))"; - } - @Deprecated(forRemoval = true) public static ComparisonExpression greaterOrEqualsExpressions(String timestamp) { return greaterOrEqual(Timestamp.from(Instant.parse(timestamp))); @@ -139,45 +151,8 @@ public static ComparisonExpression lessThanExpressions(String timestamp) { return lessThan(Timestamp.from(Instant.parse(timestamp))); } - - public static DBColumn elapsedtime(TableDecorator table) { - return c -> "CAST(TIMESTAMPDIFF(MILLISECOND, DH_DBT, DH_FIN) /1000.0 AS DECIMAL(10,2))"; - } - public static DBColumn elapsedtime2(TableDecorator table) { - return c -> "extract(EPOCH from (dh_fin - dh_dbt))"; - } - - public static DBColumn asDate(TableDecorator table) { - return c -> "FORMATDATETIME (DH_DBT, 'yyyy-MM-dd' )"; - } - - public static DBColumn byDay(TableDecorator table) { - return c -> "(EXTRACT (DAY FROM DH_DBT))"; - } - - public static DBColumn byMonth(TableDecorator table) { - return c -> "(EXTRACT (MONTH FROM DH_DBT))"; - } - - public static DBColumn byYear(TableDecorator table) { - return c -> "(EXTRACT (YEAR FROM DH_DBT))"; - } - - - public static OperationColumn avgElapsedTime(TableDecorator table) { - var elapsed = elapsedtime(table); - return avg(elapsed); - } - - public static OperationColumn minElapsedTime(TableDecorator table) { - var elapsed = elapsedtime(table); - return min(elapsed); - } - - public static OperationColumn maxElapsedTime(TableDecorator table) { - var elapsed = elapsedtime(table); - return max(elapsed); + return DBFunction.epoch().args(table.column(END).minus(table.column(START))); } private static OperationColumn countStatusByType(TableDecorator table, ComparisonExpression op) { @@ -185,6 +160,14 @@ private static OperationColumn countStatusByType(TableDecorator table, Compariso return count((status).when(op).then(status).end()); } + private static OperationColumn countDbBySucces(TableDecorator table, ComparisonExpression op ){ + var complete = table.column(COMPLETE); + return count((complete).when(op).then(complete).end()); + } + + public static OperationColumn countDbError (TableDecorator table){ return countDbBySucces(table,equal('F'));} + public static OperationColumn countDbSucces (TableDecorator table){ return countDbBySucces(table,equal('T'));} + public static OperationColumn countStatus200(TableDecorator table) { return countStatusByType(table, equal(200)); @@ -247,6 +230,7 @@ public static ComparisonExpression elapsedTimeExpressions(String name) { } } + private static OperationColumn elapsedTimeBySpeed(ComparisonExpression op, TableDecorator table) { var elapsed = elapsedtime2(table); return count(elapsed.when(op).then(elapsed).end()); diff --git a/src/main/java/org/usf/trace/api/server/config/TraceApiColumn.java b/src/main/java/org/usf/trace/api/server/config/TraceApiColumn.java index f7c13aca..8e9de53c 100644 --- a/src/main/java/org/usf/trace/api/server/config/TraceApiColumn.java +++ b/src/main/java/org/usf/trace/api/server/config/TraceApiColumn.java @@ -54,30 +54,12 @@ public enum TraceApiColumn implements ColumnDecorator { PARENT("parent"), //--- - @Deprecated(forRemoval = true) - AS_DATE("asDate", DataConstants::asDate), //start.date - @Deprecated(forRemoval = true) - BY_DAY("byDay", DataConstants::byDay), //start.day - - @Deprecated(forRemoval = true) - BY_MONTH("byMonth", DataConstants::byMonth), //start.month - @Deprecated(forRemoval = true) - BY_YEAR("byYear", DataConstants::byYear), //start.year ELAPSEDTIME("elapsedtime", DataConstants::elapsedtime2, DataConstants::elapsedTimeExpressions), - @Deprecated(forRemoval = true) - AVG_ELAPSEDTIME("avgElapsedTime", DataConstants::avgElapsedTime), //elapsedtime.avg - @Deprecated(forRemoval = true) - MAX_ELAPSEDTIME("maxElapsedTime", DataConstants::maxElapsedTime), //elapsedtime.max - @Deprecated(forRemoval = true) - MIN_ELAPSEDTIME("minElapsedTime", DataConstants::minElapsedTime), //elapsedtime.min - COUNT_SLOWEST("elapsedTimeSlowest", DataConstants::elapsedTimeVerySlow), COUNT_SLOW("elapsedTimeSlow", DataConstants::elapsedTimeSlow), COUNT_MEDIUM("elapsedTimeMedium", DataConstants::elapsedTimeMedium), COUNT_FAST("elapsedTimeFast", DataConstants::elapsedTimeFast), COUNT_FASTEST("elapsedTimeFastest", DataConstants::elapsedTimeFastest), - @Deprecated(forRemoval = true) - COUNT("countRows", t-> DBColumn.count(), DataConstants::elapsedTimeExpressions), //use count funct COUNT_ERROR("countErrorRows", DataConstants::countErrorStatus), COUNT_ERROR_CLIENT("countClientErrorRows", DataConstants::countClientErrorStatus), @@ -89,7 +71,9 @@ public enum TraceApiColumn implements ColumnDecorator { COUNT_403("count403", DataConstants::countStatus403), COUNT_404("count404", DataConstants::countStatus404), COUNT_500("count500", DataConstants::countStatus500), - COUNT_503("count503", DataConstants::countStatus503); + COUNT_503("count503", DataConstants::countStatus503), + COUNT_DB_ERROR("countDbError",DataConstants::countDbError), + COUNT_DB_SUCCES("countDbSucces",DataConstants::countDbSucces); private final String out; //nullable diff --git a/src/main/java/org/usf/trace/api/server/config/TraceApiTable.java b/src/main/java/org/usf/trace/api/server/config/TraceApiTable.java index 6dd0e283..ace86517 100644 --- a/src/main/java/org/usf/trace/api/server/config/TraceApiTable.java +++ b/src/main/java/org/usf/trace/api/server/config/TraceApiTable.java @@ -14,10 +14,12 @@ @RequiredArgsConstructor public enum TraceApiTable implements TableDecorator { - OUT("e_out_req", DataConstants::outReqColumns), - REQUEST("e_in_req", DataConstants::incReqColumns), - SESSION("e_main_req", DataConstants::sessionColumns), - QUERY("e_out_qry",DataConstants::outQryColumns), + OUT("e_api_req", DataConstants::outReqColumns), + REQUEST("e_api_ses", DataConstants::incReqColumns), + REQUEST2("e_api_ses", DataConstants::incReqColumns), + SESSION("e_main_ses", DataConstants::sessionColumns), + QUERY("e_db_req",DataConstants::outQryColumns), + STAGES("e_stg",DataConstants::outStgColumns), DBACTION("e_db_act",DataConstants::dbActColumns); @NonNull diff --git a/src/main/java/org/usf/trace/api/server/controller/ApiController.java b/src/main/java/org/usf/trace/api/server/controller/ApiController.java new file mode 100644 index 00000000..593300ce --- /dev/null +++ b/src/main/java/org/usf/trace/api/server/controller/ApiController.java @@ -0,0 +1,104 @@ +package org.usf.trace.api.server.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.CacheControl; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.usf.trace.api.server.FilterCriteria; +import org.usf.trace.api.server.RequestDao; +import org.usf.trace.api.server.SessionQueueService; +import org.usf.traceapi.core.*; + +import javax.servlet.http.HttpServletRequest; +import java.time.Instant; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static java.util.Objects.isNull; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +import static org.springframework.http.ResponseEntity.accepted; +import static org.usf.trace.api.server.Utils.requireSingle; +import static org.usf.traceapi.core.Session.nextId; + +@Slf4j +@CrossOrigin +@RestController +@RequestMapping(value = "trace", produces = APPLICATION_JSON_VALUE) +@RequiredArgsConstructor +public class ApiController { + + private final RequestDao dao; + private final SessionQueueService queueService; + + @PutMapping("session") + public ResponseEntity saveSession(HttpServletRequest hsr,@RequestBody Session[] sessions) { + for(Session s : sessions) { + if(isNull(s.getId())) { + if(s instanceof MainSession) { + s.setId(nextId()); // safe id set for web collectors + updateRemoteAddress(hsr,(MainSession) s); + } + else if(s instanceof ApiSession) { + log.warn("ApiSesstion id is null : {}", s); + } + } + } + queueService.add(sessions); + return accepted().build(); + } + public void updateRemoteAddress(HttpServletRequest hsr, @RequestBody MainSession req) { + if(isNull(req.getApplication())) { //set IP address for WABAPP trace + req.setApplication(new ApplicationInfo(null, null, hsr.getRemoteAddr(), null, null, null)); + } + else if(isNull(req.getApplication().getAddress())) { + req.setApplication(req.getApplication().withAddress(hsr.getRemoteAddr())); + } + } + + @GetMapping("session/request") + public List getIncomingRequestByCriteria( + @RequestParam(required = false, name = "name") String[] name, + @RequestParam(required = false, name = "env") String[] env, + @RequestParam(required = false, name = "port") String[] port, + @RequestParam(required = false, name = "start") Instant start, + @RequestParam(required = false, name = "end") Instant end, + @RequestParam(defaultValue = "true", name = "lazy") boolean lazy){ // without tree + FilterCriteria fc = new FilterCriteria(null,name,env,port,null,start,end); + return dao.getIncomingRequestByCriteria(lazy, fc, ApiRequest::new); + } + + @GetMapping("session/request/{id}") + public ResponseEntity getIncomingRequestById(@PathVariable String id) { // without tree + return ResponseEntity.ok().cacheControl(CacheControl.maxAge(1, TimeUnit.DAYS)).body(requireSingle(dao.getIncomingRequestById(true, ApiRequest::new, id))); + } + + @GetMapping("session/main") + public List getMainRequestByCriteria( + @RequestParam(required = false, name = "env") String[] env, + @RequestParam(required = false, name = "launchmode") String[] launchMode, + @RequestParam(required = false, name = "start") Instant start, + @RequestParam(required = false, name = "end") Instant end, + @RequestParam(defaultValue = "true", name = "lazy") boolean lazy) { + + FilterCriteria fc = new FilterCriteria(null,null,env,null,launchMode,start,end); + return dao.getMainRequestByCriteria(lazy, fc, ApiRequest::new); + } + + @GetMapping("session/main/{id}") + public ResponseEntity getMainRequestById(@PathVariable String id) { // without tree + return ResponseEntity.ok().cacheControl(CacheControl.maxAge(1, TimeUnit.DAYS)).body(requireSingle(dao.getMainRequestById(true, ApiRequest::new, id))); + } + + @GetMapping("session/request/{id}/out") + public ApiRequest getOutcomingRequestById(@PathVariable String id) { + return dao.getOutcomingRequestById(id); + } + + @GetMapping("session/request/{id}/tree") + public Session getTreebyId(@PathVariable String id){ + return dao.getTreebyId(id); + } +} + + diff --git a/src/main/java/org/usf/trace/api/server/CacheController.java b/src/main/java/org/usf/trace/api/server/controller/CacheController.java similarity index 64% rename from src/main/java/org/usf/trace/api/server/CacheController.java rename to src/main/java/org/usf/trace/api/server/controller/CacheController.java index 1326c292..559ea997 100644 --- a/src/main/java/org/usf/trace/api/server/CacheController.java +++ b/src/main/java/org/usf/trace/api/server/controller/CacheController.java @@ -1,13 +1,17 @@ -package org.usf.trace.api.server; +package org.usf.trace.api.server.controller; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; import java.util.Collection; +import java.util.Set; import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.usf.trace.api.server.SessionQueueService; import org.usf.traceapi.core.Session; import lombok.RequiredArgsConstructor; @@ -25,4 +29,9 @@ public Collection getCache(){ return queue.waitList(); } + @DeleteMapping + public Collection deleteSessions(@RequestParam("id") Set ids){ + return queue.deleteSessions(ids); + } + } \ No newline at end of file diff --git a/src/main/java/org/usf/trace/api/server/MetadataController.java b/src/main/java/org/usf/trace/api/server/controller/MetadataController.java similarity index 83% rename from src/main/java/org/usf/trace/api/server/MetadataController.java rename to src/main/java/org/usf/trace/api/server/controller/MetadataController.java index eb358560..93a2f693 100644 --- a/src/main/java/org/usf/trace/api/server/MetadataController.java +++ b/src/main/java/org/usf/trace/api/server/controller/MetadataController.java @@ -1,4 +1,4 @@ -package org.usf.trace.api.server; +package org.usf.trace.api.server.controller; import static java.util.Arrays.asList; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @@ -26,12 +26,7 @@ public class MetadataController { @GetMapping("aggregate") List fetch() { return asList( - new SimpleFieldMetadata(REQUEST, COUNT, COUNT.reference(), "Nombre d'appels", "count"), new SimpleFieldMetadata(REQUEST, ELAPSEDTIME, ELAPSEDTIME.reference(), "temps de réponse (s)", "s"), - new SimpleFieldMetadata(REQUEST, AVG_ELAPSEDTIME, AVG_ELAPSEDTIME.reference(), "temps de réponse moyen(s)", "s"), - new SimpleFieldMetadata(REQUEST, MAX_ELAPSEDTIME, MAX_ELAPSEDTIME.reference(), "temps de réponse max(s)", "s"), - new SimpleFieldMetadata(REQUEST, MIN_ELAPSEDTIME, MIN_ELAPSEDTIME.reference(), "temps de réponse min(s)", "s"), - new CombinedFieldMetadata("nombre d'appels OK / KO", asList( new SimpleFieldMetadata(REQUEST, COUNT_ERROR, COUNT_ERROR.reference(), "nombre d'appels en erreur", "count"), new SimpleFieldMetadata(REQUEST, COUNT_SUCCES, COUNT_SUCCES.reference(), "nombre d'appels OK", "count"))), @@ -75,11 +70,7 @@ List fetchFilters() { new SimpleFieldMetadata(REQUEST, ADDRESS, ADDRESS.reference(), "Adresse", "count"), new SimpleFieldMetadata(REQUEST, ENVIRONEMENT, ENVIRONEMENT.reference(), "Environement", "count"), new SimpleFieldMetadata(REQUEST, OS, OS.reference(), "Sytèm d'exploitation", "count"), - new SimpleFieldMetadata(REQUEST, RE, RE.reference(), "Environement d'exécution", "count"), - new SimpleFieldMetadata(REQUEST, AS_DATE, AS_DATE.reference(), "Format date", "count"), - new SimpleFieldMetadata(REQUEST, BY_DAY, BY_DAY.reference(), "Format jour", "count"), - new SimpleFieldMetadata(REQUEST, BY_MONTH, BY_MONTH.reference(), "Format mois", "count"), - new SimpleFieldMetadata(REQUEST, BY_YEAR, BY_YEAR.reference(), "Format Year", "count") + new SimpleFieldMetadata(REQUEST, RE, RE.reference(), "Environement d'exécution", "count") ); } } diff --git a/src/main/java/org/usf/trace/api/server/PerformanceStatsController.java b/src/main/java/org/usf/trace/api/server/controller/PerformanceStatsController.java similarity index 73% rename from src/main/java/org/usf/trace/api/server/PerformanceStatsController.java rename to src/main/java/org/usf/trace/api/server/controller/PerformanceStatsController.java index 9725b482..20bc95b5 100644 --- a/src/main/java/org/usf/trace/api/server/PerformanceStatsController.java +++ b/src/main/java/org/usf/trace/api/server/controller/PerformanceStatsController.java @@ -1,4 +1,4 @@ -package org.usf.trace.api.server; +package org.usf.trace.api.server.controller; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; import static org.springframework.http.MediaType.TEXT_HTML_VALUE; @@ -6,6 +6,7 @@ import java.io.IOException; import java.util.List; +import java.util.stream.Stream; import javax.servlet.http.HttpServletResponse; @@ -16,11 +17,13 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import org.usf.jquery.core.DynamicModel; -import org.usf.jquery.core.RequestQueryBuilder; +import org.usf.jquery.core.*; import org.usf.jquery.web.RequestQueryParam; import lombok.RequiredArgsConstructor; +import org.usf.trace.api.server.config.DataConstants; +import org.usf.trace.api.server.config.TraceApiColumn; +import org.usf.trace.api.server.config.TraceApiTable; @CrossOrigin @RestController @@ -31,17 +34,24 @@ public class PerformanceStatsController { private final JdbcTemplate template; @GetMapping(value="incoming/request", produces = APPLICATION_JSON_VALUE) - public List stats( + public List request( @RequestQueryParam(name = "request", defaultColumns = "count") RequestQueryBuilder query) { return usingSpringJdbc(query); } - + @GetMapping(value="session", produces = APPLICATION_JSON_VALUE) public List session( @RequestQueryParam(name = "session", defaultColumns = "count") RequestQueryBuilder query) { return usingSpringJdbc(query); } + @GetMapping(value="environment", produces = APPLICATION_JSON_VALUE) + public List environment( + @RequestQueryParam(name = "request", defaultColumns = "environement") RequestQueryBuilder query + ) { + return usingSpringJdbc(query.distinct()); + } + private List usingSpringJdbc(RequestQueryBuilder req) { var query = req.build(); return template.query(query.getQuery(), query.defaultMapper()::map, query.getParams()); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 202e3dab..a2470e90 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,10 +1,14 @@ server: port: 9006 + compression: + enabled: true + mime-types: application/json + min-response-size: 1MB spring: application: name: traceapi datasource: - url: jdbc:h2:mem:testdb; + url: jdbc:h2:mem:testdb;DATABASE_TO_LOWER=TRUE; username: sa password: driver-class-name: org.h2.Driver diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 15014662..6b8b59d8 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -1,93 +1,105 @@ ---https://www.postgresql.org/docs/current/datatype-character.html -CREATE TABLE IF NOT EXISTS E_MAIN_REQ( - ID_MAIN_REQ VARCHAR PRIMARY KEY, - VA_NAME VARCHAR, - VA_USR VARCHAR, - DH_DBT TIMESTAMP(3), - DH_FIN TIMESTAMP(3), - LNCH VARCHAR, - LOC VARCHAR, - VA_THRED VARCHAR, - VA_APP_NME VARCHAR, - VA_VRS VARCHAR, - VA_ADRS VARCHAR, - VA_ENV VARCHAR, - VA_OS VARCHAR, - VA_RE VARCHAR, - VA_ERR_CLS VARCHAR, - VA_ERR_MSG VARCHAR + +CREATE TABLE IF NOT EXISTS E_MAIN_SES ( + ID_SES VARCHAR PRIMARY KEY, + VA_NAME VARCHAR, + VA_USR VARCHAR, + DH_DBT TIMESTAMP(3), + DH_FIN TIMESTAMP(3), + LNCH VARCHAR, + LOC VARCHAR, + VA_THRED VARCHAR, + VA_APP_NME VARCHAR, + VA_VRS VARCHAR, + VA_ADRS VARCHAR, + VA_ENV VARCHAR, + VA_OS VARCHAR, + VA_RE VARCHAR, + VA_ERR_CLS VARCHAR, + VA_ERR_MSG VARCHAR ); -CREATE TABLE IF NOT EXISTS E_IN_REQ ( - ID_IN_REQ VARCHAR PRIMARY KEY, - VA_MTH VARCHAR, - VA_PRTCL VARCHAR, - VA_HST VARCHAR, - CD_PRT INT, - VA_PTH VARCHAR, - VA_QRY VARCHAR, - VA_CNT_TYP VARCHAR, - VA_AUTH VARCHAR, - CD_STT INT, - VA_I_SZE BIGINT, - VA_O_SZE BIGINT, - DH_DBT TIMESTAMP(3), - DH_FIN TIMESTAMP(3), - VA_THRED VARCHAR, - VA_ERR_CLS VARCHAR, - VA_ERR_MSG VARCHAR, - VA_API_NME VARCHAR, - VA_USR VARCHAR, - VA_APP_NME VARCHAR, - VA_VRS VARCHAR, - VA_ADRS VARCHAR, - VA_ENV VARCHAR, - VA_OS VARCHAR, - VA_RE VARCHAR +CREATE TABLE IF NOT EXISTS E_API_SES ( + ID_SES VARCHAR PRIMARY KEY, + VA_MTH VARCHAR, + VA_PRTCL VARCHAR, + VA_HST VARCHAR, + CD_PRT INT, + VA_PTH VARCHAR, + VA_QRY VARCHAR, + VA_CNT_TYP VARCHAR, + VA_AUTH VARCHAR, + CD_STT INT, + VA_I_SZE BIGINT, + VA_O_SZE BIGINT, + DH_DBT TIMESTAMP(3), + DH_FIN TIMESTAMP(3), + VA_THRED VARCHAR, + VA_ERR_CLS VARCHAR, + VA_ERR_MSG VARCHAR, + VA_API_NME VARCHAR, + VA_USR VARCHAR, + VA_APP_NME VARCHAR, + VA_VRS VARCHAR, + VA_ADRS VARCHAR, + VA_ENV VARCHAR, + VA_OS VARCHAR, + VA_RE VARCHAR ); -CREATE TABLE IF NOT EXISTS E_OUT_REQ ( - ID_OUT_REQ VARCHAR PRIMARY KEY, - VA_MTH VARCHAR, - VA_PRTCL VARCHAR, - VA_HST VARCHAR, - CD_PRT INT, - VA_PTH VARCHAR, - VA_QRY VARCHAR, - VA_CNT_TYP VARCHAR, - VA_AUTH VARCHAR, - CD_STT INT, - VA_I_SZE BIGINT, - VA_O_SZE BIGINT, - DH_DBT TIMESTAMP(3), - DH_FIN TIMESTAMP(3), - VA_THRED VARCHAR, - VA_ERR_CLS VARCHAR, - VA_ERR_MSG VARCHAR, - CD_IN_REQ VARCHAR +CREATE TABLE IF NOT EXISTS E_API_REQ ( + VA_MTH VARCHAR, + VA_PRTCL VARCHAR, + VA_HST VARCHAR, + CD_PRT INT, + VA_PTH VARCHAR, + VA_QRY VARCHAR, + VA_CNT_TYP VARCHAR, + VA_AUTH VARCHAR, + CD_STT INT, + VA_I_SZE BIGINT, + VA_O_SZE BIGINT, + DH_DBT TIMESTAMP(3), + DH_FIN TIMESTAMP(3), + VA_THRED VARCHAR, + VA_ERR_CLS VARCHAR, + VA_ERR_MSG VARCHAR, + CD_SES VARCHAR, -- Parent + CD_API VARCHAR -- NUll ); -CREATE TABLE IF NOT EXISTS E_OUT_QRY ( - ID_OUT_QRY BIGINT, - VA_HST VARCHAR, - CD_PRT INT, - VA_SCHMA VARCHAR, - DH_DBT TIMESTAMP(3), - DH_FIN TIMESTAMP(3), - VA_USR VARCHAR, - VA_THRED VARCHAR, - VA_DRV VARCHAR, - VA_DB_NME VARCHAR, - VA_DB_VRS VARCHAR, - VA_CMPLT CHAR, - CD_IN_REQ VARCHAR +CREATE TABLE IF NOT EXISTS E_DB_REQ ( + ID_OUT_QRY BIGINT, + VA_HST VARCHAR, + CD_PRT INT, + VA_SCHMA VARCHAR, + DH_DBT TIMESTAMP(3), + DH_FIN TIMESTAMP(3), + VA_USR VARCHAR, + VA_THRED VARCHAR, + VA_DRV VARCHAR, + VA_DB_NME VARCHAR, + VA_DB_VRS VARCHAR, + VA_CMPLT CHAR, + CD_SES VARCHAR ); -CREATE TABLE IF NOT EXISTS E_DB_ACT( - VA_TYP VARCHAR, +CREATE TABLE IF NOT EXISTS E_STG ( + VA_NAME VARCHAR, + LOC VARCHAR, DH_DBT TIMESTAMP(3), DH_FIN TIMESTAMP(3), + VA_USR VARCHAR, + VA_THRED VARCHAR, VA_ERR_CLS VARCHAR, VA_ERR_MSG VARCHAR, - CD_OUT_QRY BIGINT + CD_SES VARCHAR +); + +CREATE TABLE IF NOT EXISTS E_DB_ACT ( + VA_TYP VARCHAR, + DH_DBT TIMESTAMP(3), + DH_FIN TIMESTAMP(3), + VA_ERR_CLS VARCHAR, + VA_ERR_MSG VARCHAR, + CD_OUT_QRY BIGINT );