@Override public void run() { // 현재 Thread에 invoker의 ClassLoader를 셋팅해 주어서, 동일한 ClassLoader에서 로딩한 Config가 동기화의 대상이 되도록 한다. Thread.currentThread().setContextClassLoader(classLoader); synchronized (FiveMinuteSummaryDaemon.class) { if (LOG.isDebugEnabled()) { LOG.debug("FiveMinuteSummaryDaemon started..."); } // 현재시간 now = DateUtil.getDateTime("yyyyMMddHHmmss"); long nowLong = Long.parseLong(now); // 모든 Agent Id 조회 SqlManager sqlManager = SqlManagerFactory.getSqlManager(); Parameters inParam = ParametersFactory.createParameters(HtmlParameters.class); FrameOneDataset dsAgent = sqlManager.queryForFrameOneDataset(inParam, "fiveMinuteSummary.getAgentList"); try { // 현재 시간(요약 시간) > 마지막 요약 시간 -> 실행 if (nowLong > tpsSummaryLastInserted) { summarizeTps(dsAgent, now); tpsSummaryLastInserted = nowLong; } } catch (Exception e) { LOG.error("Exception", e); } try { // 현재 시간(요약 시간) > 마지막 요약 시간 -> 실행 if (nowLong > resSummaryTimeLastInserted) { summarizeResTime(dsAgent, now); resSummaryTimeLastInserted = nowLong; } } catch (Exception e) { LOG.error("Exception", e); } try { // 현재 시간(요약 시간) > 마지막 요약 시간 -> 실행 if (nowLong > resourceSummaryTimeLastInserted) { summarizeResource(dsAgent, now); resourceSummaryTimeLastInserted = nowLong; } } catch (Exception e) { LOG.error("Exception", e); } try { // 현재 시간(요약 시간) > 마지막 요약 시간 -> 실행 if (nowLong > todayTpsSummaryLastPut) { makeTodayTpsData(dsAgent, now); todayTpsSummaryLastPut = nowLong; } } catch (Exception e) { LOG.error("Exception", e); } } }
/** * 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; }