/* * Copyright 2016 Scouter Project. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package scouter.agent.batch.task; import java.io.File; import java.io.FileWriter; import scouter.agent.batch.Configure; import scouter.agent.batch.Logger; import scouter.agent.batch.Main; import scouter.agent.batch.dump.ThreadDumpHandler; import scouter.agent.batch.netio.data.net.UdpLocalAgent; import scouter.agent.batch.trace.TraceContext; import scouter.util.ThreadUtil; public class BatchMonitor extends Thread { private static BatchMonitor instance = null; public Configure config = null; static public BatchMonitor getInstance(){ if(instance == null){ instance = new BatchMonitor(); instance.setDaemon(true); instance.setName(ThreadUtil.getName(instance)); TraceContext.getInstance(); Runtime.getRuntime().addShutdownHook(new ResultSender()); instance.start(); } return instance; } public void run() { FileWriter stackWriter = null; FileWriter indexWriter = null; try { File stackFile = null; config = Configure.getInstance(); TraceContext traceContext = TraceContext.getInstance(); if(!config.scouter_standalone){ UdpLocalAgent.sendUdpPackToServer(Main.getObjectPack()); } if(config.sfa_dump_enabled){ stackFile = new File(traceContext.getLogFullFilename() + ".log"); if(stackFile.exists()){ stackFile = null; }else{ traceContext.isStackLogFile = true; stackWriter = new FileWriter(stackFile); indexWriter = new FileWriter(new File(traceContext.getLogFullFilename() + ".inx")); } } long lastStackDumpTime = 0L; long lastCheckThreadTime = 0L; long lastCheckGCTime = 0L; long currentTime; long [] gcInfo; while(!config.scouter_stop){ currentTime = System.currentTimeMillis(); if(stackWriter != null){ if((currentTime - lastStackDumpTime) >= config.sfa_dump_interval_ms){ lastStackDumpTime = currentTime; ThreadDumpHandler.processDump(stackFile, stackWriter, indexWriter, config.sfa_dump_filter, config.sfa_dump_header_exists); UdpLocalAgent.sendRunningInfo(traceContext); } } if((currentTime - lastCheckGCTime) >= 5000L){ lastCheckGCTime = currentTime; traceContext.caculateResource(); } if((currentTime - lastCheckThreadTime) >= config.thread_check_interval_ms){ lastCheckThreadTime = currentTime; traceContext.checkThread(); } Thread.sleep(100L); } }catch(Throwable ex){ Logger.println("ERROR: " + ex.getMessage()); }finally{ if(stackWriter != null){ try{ stackWriter.close(); }catch(Exception ex){} } if(indexWriter != null){ try{ indexWriter.close(); }catch(Exception ex){} } } } }