/** * APM_TPS_SUMMARY 테이블에서 최근 데이터를 조회하여 FDGS에 PUT한다.<br> * <br> * * @param dsAgent * @param now * @author Kim Ji Hye * @since 2015. 10. 20. */ public void makeTodayTpsData(FrameOneDataset dsAgent, String now) { SqlManager sqlManager = SqlManagerFactory.getSqlManager(); Parameters inParam = ParametersFactory.createParameters(HtmlParameters.class); String today = now.substring(0, 8); // yyyyMMdd String tomarrow = DateUtil.formatDateString(DateUtil.getOperationDay(today, 1)); inParam.put("REQ_DTM_TODAY", today); inParam.put("REQ_DTM_TOMARROW", tomarrow); if (dsAgent != null) { for (int j = 0; j < dsAgent.getRowCount(); j++) { dsAgent.setActiveRow(j); // APM_TPS_SUMMARY 테이블에서 오늘 데이터 조회 inParam.put("AGENT_ID", dsAgent.getColumnAsString(j, "AGENT_ID")); FrameOneDataset dataset = sqlManager.queryForFrameOneDataset( inParam, "fiveMinuteSummary.getTodayRecentTpsSummary"); List<TPS> tpsList = new ArrayList<TPS>(); if (dataset != null) { for (int i = 0; i < dataset.getRowCount(); i++) { dataset.setActiveRow(i); // 에이전트 별로 FDGS에 put 할 List를 만든다. TPS tps = new TPS(); tps.setAgentId(dataset.getColumnAsString(i, "AGENT_ID")); tps.setReqDtm(dataset.getColumnAsString(i, "REQ_DTM")); tps.setTxCnt(dataset.getColumnAsInteger(i, "TX_CNT")); tpsList.add(tps); } // FDGS에 put 한다. FDGSUtil.putObject( APMConstants.CHART_TPS_TODAY, dsAgent.getColumnAsString(j, "AGENT_ID"), tpsList); // 차트 데이터 로더 데몬에게 변경사항 공지 ChartDataStorageDaemon.noticeChangedState(APMConstants.CHART_TPS_TODAY); } } } }
/** * TODO 쓰레드 정보 조회.<br> * <br> * * @param request * @param response * @param inParams * @return * @author Park Woon Kyung * @since 2015. 10.18 */ @RequestMapping(value = "/threadSearch") public Parameters threadSearch( HttpServletRequest request, HttpServletResponse response, Parameters inParams) { Parameters outParam = ParametersFactory.createParameters(inParams); // 수집 쓰레드덤프 데이터 ThreadDumpData threadDumpData = null; // 호출시간 날짜형태로 표현 SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List<ThreadState> threadStateList = null; // FDGS 조회 시작 시간 String startTime = null; // FDGS 조회 순간 시간 String now = null; // 쓰레드 정보 저장 DataSet 컬럼 구성 FrameOneDataset dsThreadDump = new FrameOneHtmlDataset(); dsThreadDump.addStringColumn("AGENT_ID"); dsThreadDump.addStringColumn("CLIENT_IP"); dsThreadDump.addStringColumn("REQ_TIME"); dsThreadDump.addIntegerColumn("RES_TIME"); dsThreadDump.addIntegerColumn("THREAD_ID"); dsThreadDump.addStringColumn("THREAD_STATE"); dsThreadDump.addStringColumn("APPLICATION"); dsThreadDump.addStringColumn("THREAD_STACKTRC"); dsThreadDump.addStringColumn("SQL"); // 선택된 Agent 처리(반드시 1개의 Agent만 선택가능) String agentId = inParams.getVariableAsString("AGENTLIST"); if (null != agentId && !"".equals(agentId)) { // 쓰레드 덤프를 요청하는 모델 클래스 ThreadDumpData td = new ThreadDumpData(); td.setAgentId(agentId); td.setTypeCd(APMConstants.THREADDUMP_DATA); td.setWeightValue(APMConstants.THREADDUMP_WEIGHT_VALUE); td.setThreadDumpReqDtm(DateUtil.getDateTime("yyyyMMddHHmmssSSS")); // 선택한 에이전트의 쓰레드 덤프 요청 sendThreadDumpRequest(td); // FDGS 조회 시작 시간 startTime = DateUtil.getDateTime("yyyyMMddHHmmss"); // FDGS 캐시에 요청한 키에 해당하는 쓰레드 덤프 데이터가 있는지 확인 while (threadDumpData == null) { // FDGS 조회 시간이 10초이상이면 break now = DateUtil.getDateTime("yyyyMMddHHmmss"); if (DateUtil.getDiffSecCount(startTime, now) >= 10) { break; } threadDumpData = FDGSUtil.getObject( APMConstants.THREAD_DUMP_DATA, td.getThreadDumpReqDtm() + "|" + td.getAgentId(), ThreadDumpData.class); // 에이전트에서 받은 데이터가 있을 때 if (threadDumpData != null) { threadStateList = threadDumpData.getThreadStateList(); break; } try { // 0.5초 쉼 Thread.sleep(500); } catch (InterruptedException e) { LOG.error("InterruptedException", e); } } if (threadStateList != null) { for (ThreadState ts : threadStateList) { int row = dsThreadDump.appendRow(); dsThreadDump.setColumn(row, "AGENT_ID", agentId); dsThreadDump.setColumn(row, "CLIENT_IP", ts.getClientIp()); dsThreadDump.setColumn( row, "REQ_TIME", time.format( DateUtil.parseDate(String.valueOf(ts.getReqStartDtm()).substring(0, 14)))); dsThreadDump.setColumn(row, "RES_TIME", ts.getElapsedTime()); dsThreadDump.setColumn(row, "THREAD_ID", ts.getThreadId()); dsThreadDump.setColumn(row, "THREAD_STATE", ts.getThreadState()); dsThreadDump.setColumn(row, "APPLICATION", ts.getCallUri()); dsThreadDump.setColumn(row, "THREAD_STACKTRC", ts.getStackTrc()); dsThreadDump.setColumn(row, "SQL", ts.getSqlString()); } } } if (LOG.isDebugEnabled()) { LOG.debug("[dsThreadDump]"); LOG.debug(dsThreadDump); } outParam.setFrameOneDataset("ds_threadDump", dsThreadDump); return outParam; }