/******************************************************************************** * Copyright 2017 Capital One Services, LLC and Bitwise, Inc. * 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 hydrograph.server.execution.tracking.client.logger; import hydrograph.server.execution.tracking.server.status.datastructures.ComponentStatus; import hydrograph.server.execution.tracking.server.status.datastructures.ExecutionStatus; import hydrograph.server.execution.tracking.utils.ExecutionTrackingLogger; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; class LastExecutionStatus{ private int statusNumber; private ExecutionStatus executionStatus; public LastExecutionStatus(int statusNumber, ExecutionStatus executionStatus) { super(); this.statusNumber = statusNumber; this.executionStatus = executionStatus; } public int getStatusNumber() { return statusNumber; } public ExecutionStatus getExecutionStatus() { return executionStatus; } @Override public String toString() { return "LastExecutionStatus [statusNumber=" + statusNumber + ", executionStatus=" + executionStatus + "]"; } } /** * Use to manage logging * The Class ExecutionTrackingFileLogger. */ public class ExecutionTrackingFileLogger { /** The Constant INSTANCE. */ public static final ExecutionTrackingFileLogger INSTANCE = new ExecutionTrackingFileLogger(); /** The job tracking log directory. */ private String jobTrackingLogDirectory; /** The execution tracking loggers. */ private Map<String,LastExecutionStatus> lastExecutionStatusMap; private static final String EXECUTION_STATUS_RECORD_SEPARATOR = " | "; private static final String TIMESTAMP_FORMAT = "MM/dd/yyyy HH:mm:ss"; private static final String SUBMISSION_TIME = "Submission time: "; private static final String JOB_ID = "Job ID: "; private static final String EXECUTION_TRACKING_LOG_FILE_EXTENTION = ".log"; /** * Instantiates a new execution tracking file logger. */ private ExecutionTrackingFileLogger(){ jobTrackingLogDirectory = "/tmp/JobTrackingLog/"; lastExecutionStatusMap = new HashMap(); createJobTrackingLogDirectory(); } /** * Creates the job tracking log directory. */ private void createJobTrackingLogDirectory() { File file = new File(jobTrackingLogDirectory); if (!file.exists()) { file.mkdirs(); } } private String getTimeStamp() { String timeStamp = new SimpleDateFormat(TIMESTAMP_FORMAT).format(new Date()); return timeStamp; } private String getHeader(ExecutionStatus executionStatus) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(JOB_ID); stringBuilder.append(executionStatus.getJobId() + EXECUTION_STATUS_RECORD_SEPARATOR); stringBuilder.append(SUBMISSION_TIME); String timeStamp = getTimeStamp(); stringBuilder.append(timeStamp + "\n"); return stringBuilder.toString(); } /** * * Log the execution status * * @param uniqJobId - unique job id * @param executionStatus - Execution status ({@link ExecutionStatus}) */ public void log(String uniqJobId,ExecutionStatus executionStatus){ String header=null; if(lastExecutionStatusMap.get(uniqJobId)==null){ lastExecutionStatusMap.put(uniqJobId, new LastExecutionStatus(0, executionStatus)); header = getHeader(executionStatus); }else{ header = null; if(executionStatus.equals(lastExecutionStatusMap.get(uniqJobId).getExecutionStatus())){ return; } lastExecutionStatusMap.put(uniqJobId, new LastExecutionStatus(lastExecutionStatusMap.get(uniqJobId).getStatusNumber() + 1, executionStatus)); } Logger executionTrackingLogger = getExecutionStatusLogger(uniqJobId); if(!StringUtils.isBlank(header)){ executionTrackingLogger.debug(header); } String executionStatusString = getExecutionStatusInString(executionStatus); if(StringUtils.isBlank(executionStatusString)){ return; } executionTrackingLogger.debug(executionStatusString); } /** * Gets the execution status logger. * * @param uniqJobId the unique job id * @return the execution status logger */ private Logger getExecutionStatusLogger(String uniqJobId) { jobTrackingLogDirectory = jobTrackingLogDirectory + "//"; Logger logger = ExecutionTrackingLogger.INSTANCE.getLogger(uniqJobId, jobTrackingLogDirectory + uniqJobId + EXECUTION_TRACKING_LOG_FILE_EXTENTION); return logger; } /** * Gets the execution status in string. * * @param executionStatus the execution status * @return the execution status in string */ private String getExecutionStatusInString(ExecutionStatus executionStatus) { StringBuilder stringBuilder = new StringBuilder(); if(executionStatus==null){ return null; } for(ComponentStatus componentStatus : executionStatus.getComponentStatus()){ Map<String, Long> processCounts = componentStatus.getProcessedRecordCount(); for(String portID: processCounts.keySet()){ stringBuilder.append(lastExecutionStatusMap.get(executionStatus.getJobId()).getStatusNumber() + EXECUTION_STATUS_RECORD_SEPARATOR); stringBuilder.append(getTimeStamp() + EXECUTION_STATUS_RECORD_SEPARATOR); stringBuilder.append(componentStatus.getComponentId() + EXECUTION_STATUS_RECORD_SEPARATOR); stringBuilder.append(portID + EXECUTION_STATUS_RECORD_SEPARATOR); stringBuilder.append(componentStatus.getCurrentStatus() + EXECUTION_STATUS_RECORD_SEPARATOR); stringBuilder.append(processCounts.get(portID) + "\n"); } } return stringBuilder.toString(); } }