Java tutorial
/******************************************************************************* * Copyright 2012 Pradeep Nambiar, Pexus LLC * * Source File: src/org/perf/log/logger/PerfLogData.java * * 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 org.perf.log.logger; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Date; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.perf.log.context.PerfLogContext; import org.perf.log.txn.types.PerfLogTxnClass; public class PerfLogData implements Externalizable { public PerfLogData() { super(); // TODO Auto-generated constructor stub } public PerfLogData(PerfLogContext perfLogContext) { super(); // fill in perfLogData with common elements from perfLogContext if (perfLogContext != null) { setUserId(perfLogContext.getUserId()); setCloneName(perfLogContext.getJvmCloneId()); setGuid(perfLogContext.getGuid()); setSessionId(perfLogContext.getRequestSessionId()); setThreadName(perfLogContext.getThreadName()); setPerfLogContext(perfLogContext); setServerIp(perfLogContext.getHostIp()); setServerName(perfLogContext.getHostId()); setJvmDepth(perfLogContext.getJvmDepth()); setTxnFilterDepth(perfLogContext.getTxnFilterDepth()); setThreadId(perfLogContext.getThreadId()); setInfoContextString(perfLogContext.getInfoContextString()); } else setPerfLogContext(null); } private static final String LINE_SEPARATOR = System.getProperty("line.separator"); private final static Logger logger = LoggerFactory.getLogger("PerfLogData"); String guid = null; String sessionId = null; String threadName = null; String threadId = null; Date transactionDate = null; String serverName = null; String serverIp = null; String cloneName = null; int jvmDepth = 0; int txnFilterDepth = 0; String transactionType = null; String userId = null; String transactionName = null; String subTransactionName = null; String transactionClass = null; long transactionTime = 0; String message = null; String infoContextString = null; String throwableClassName = null; String throwableMessage = null; PerfLogContext perfLogContext = null; Throwable throwable = null; // set if there was an exception otherwise null. public String getGuid() { return guid; } public void setGuid(String guid) { this.guid = guid; } public Date getTransactionDate() { return transactionDate; } public void setTransactionDate(Date transactionDate) { this.transactionDate = transactionDate; } public String getServerName() { return serverName; } public void setServerName(String serverName) { this.serverName = serverName; } public String getCloneName() { return cloneName; } public void setCloneName(String cloneName) { this.cloneName = cloneName; } public String getTransactionType() { return transactionType; } public void setTransactionType(String transactionType) { this.transactionType = transactionType; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getTransactionName() { return transactionName; } public void setTransactionName(String transactionName) { this.transactionName = transactionName; } public String getSubTransactionName() { return subTransactionName; } public void setSubTransactionName(String subTransactionName) { this.subTransactionName = subTransactionName; } public long getTransactionTime() { return transactionTime; } public void setTransactionTime(long transactionTime) { this.transactionTime = transactionTime; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public void setPerfLogContext(PerfLogContext perfLogContext) { this.perfLogContext = perfLogContext; if (perfLogContext != null) { // extract the infoContext String plus additional details not available // in the log data that would be useful setInfoContextString(perfLogContext.getInfoContextString()); } } public Throwable getThrowable() { return throwable; } public void setThrowable(Throwable throwable) { this.throwable = throwable; if (throwable != null) { setThrowableClassName(throwable.getClass().getCanonicalName()); setThrowableMessage(throwable.getMessage()); } } public String getSessionId() { return sessionId; } public void setSessionId(String sessionId) { this.sessionId = sessionId; } private String readStr(ObjectInput in) { // read length try { int len = in.readInt(); if (len == 0) return null; else return (String) in.readObject(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } private void writeStr(String outStr, ObjectOutput out) { try { if (outStr != null) { out.writeInt(outStr.length()); out.writeObject(outStr); } else { out.writeInt(0); } } catch (IOException e) { e.printStackTrace(); } } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { setTransactionTime(in.readLong()); setGuid(readStr(in)); setSessionId(readStr(in)); setThreadName(readStr(in)); setThreadId(readStr(in)); setTransactionDate(new Date(in.readLong())); setServerName(readStr(in)); setServerIp(readStr(in)); setCloneName(readStr(in)); setJvmDepth(in.readInt()); setTxnFilterDepth(in.readInt()); setTransactionType(readStr(in)); setUserId(readStr(in)); setTransactionName(readStr(in)); setSubTransactionName(readStr(in)); setTransactionClass(readStr(in)); setInfoContextString(readStr(in)); setMessage(readStr(in)); setThrowableClassName(readStr(in)); setThrowableMessage(readStr(in)); // add any required PerfLogContext data } @Override public void writeExternal(ObjectOutput out) throws IOException { // write out the desired fields out.writeLong(getTransactionTime()); writeStr(getGuid(), out); writeStr(getSessionId(), out); writeStr(getThreadName(), out); writeStr(getThreadId(), out); if (getTransactionDate() != null) out.writeLong(getTransactionDate().getTime()); else out.writeLong(new Date().getTime()); writeStr(getServerName(), out); writeStr(getServerIp(), out); writeStr(getCloneName(), out); out.writeInt(getJvmDepth()); out.writeInt(getTxnFilterDepth()); writeStr(getTransactionType(), out); writeStr(getUserId(), out); writeStr(getTransactionName(), out); writeStr(getSubTransactionName(), out); writeStr(getTransactionClass(), out); writeStr(getInfoContextString(), out); writeStr(getMessage(), out); writeStr(getThrowableClassName(), out); writeStr(getThrowableMessage(), out); } @SuppressWarnings("unchecked") public String toJSON() { JSONObject obj = new JSONObject(); obj.put("txnDate", new Long(getTransactionDate().getTime())); obj.put("txnTime", new Long(getTransactionTime())); obj.put("guid", getGuid()); obj.put("sid", getSessionId()); obj.put("threadName", getThreadName()); obj.put("threadId", getThreadId()); obj.put("cloneName", getCloneName()); obj.put("jvmDepth", new Integer(getJvmDepth())); obj.put("txnFilterDepth", new Integer(getTxnFilterDepth())); obj.put("serverName", getServerName()); obj.put("serverIp", getServerIp()); obj.put("userid", getUserId()); obj.put("txnName", getTransactionName()); obj.put("subTxnName", getSubTransactionName()); obj.put("txnClass", getTransactionClass()); obj.put("txnType", getTransactionType()); obj.put("infoCtxStr", getInfoContextString()); obj.put("message", getMessage()); obj.put("throwableClass", getThrowableClassName()); obj.put("throwableMessage", getThrowableMessage()); return obj.toJSONString(); } /** * @return the infoContextString */ public String getInfoContextString() { return infoContextString; } /** * @param infoContextString the infoContextString to set */ protected void setInfoContextString(String infoContextString) { this.infoContextString = infoContextString; } /** * @return the throwableClassName */ public String getThrowableClassName() { return throwableClassName; } /** * @param throwableClassName the throwableClassName to set */ public void setThrowableClassName(String throwableClassName) { this.throwableClassName = throwableClassName; } /** * @return the throwableMessage */ public String getThrowableMessage() { return throwableMessage; } /** * @param throwableMessage the throwableMessage to set */ public void setThrowableMessage(String throwableMessage) { this.throwableMessage = throwableMessage; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { // A short version of perf data suitable for writing to // log file when exceptions happen StringBuffer buf = new StringBuffer(); buf.append("PERFLOG"); if (getThrowable() != null) { buf.append("(FAILURE="); buf.append(getThrowable().getMessage()); buf.append(")"); } else buf.append("(SUCCESS)"); buf.append(" :txnType="); buf.append(getTransactionType()); buf.append(" :txnTime="); buf.append(getTransactionTime()); buf.append(" msec"); buf.append(LINE_SEPARATOR); return buf.toString(); } // convert perf log data suitable for writing to console or file public String getFullFormatedPerfDataStr() { StringBuffer buf = new StringBuffer(); buf.append("PERFLOG"); if (getThrowable() != null) { buf.append("(FAILURE="); buf.append(getThrowableClassName() + ": " + getThrowableMessage()); buf.append(")"); } else buf.append("(SUCCESS)"); buf.append(" :txnType=" + getTransactionType()); buf.append(" :txnDate=" + getTransactionDate()); buf.append(" :txnTime=" + getTransactionTime()); buf.append(" :userId=" + getUserId()); buf.append(" :guid=" + getGuid()); buf.append(" :sessionId=" + getSessionId()); buf.append(" :threadName=" + getThreadName()); buf.append(" :threadId=" + getThreadId()); buf.append(" :serverName=" + getServerName()); buf.append(" :serverIp=" + getServerIp()); buf.append(" :cloneName=" + getCloneName()); buf.append(" :jvmDepth=" + getJvmDepth()); buf.append(" :txnFilterDepth=" + getTxnFilterDepth()); buf.append(" :txnName=" + getTransactionName()); buf.append(" :subTxnName=" + getSubTransactionName()); buf.append(" :txnClass=" + getTransactionClass()); buf.append(LINE_SEPARATOR); buf.append(" :infoCtxStr=" + getInfoContextString()); buf.append(LINE_SEPARATOR); buf.append(" :message=" + getMessage()); return buf.toString(); } /** * @return the serverIp */ public String getServerIp() { return serverIp; } /** * @param serverIp the serverIp to set */ public void setServerIp(String serverIp) { this.serverIp = serverIp; } // This method takes a JSON message string creates a PerfLogData object public static PerfLogData fromJSON(String messageContent) { PerfLogData perfLogData = new PerfLogData(); JSONObject perfLogDataJSONObj = null; // deserialize the JSON Object JSONParser parser = new JSONParser(); try { if (messageContent != null) { perfLogDataJSONObj = (JSONObject) parser.parse(messageContent); // transactionStart if (perfLogDataJSONObj.get("txnDate") != null) { java.util.Date timeStamp = new java.util.Date( ((Long) perfLogDataJSONObj.get("txnDate")).longValue()); perfLogData.setTransactionDate(new java.sql.Timestamp(timeStamp.getTime())); } else perfLogData.setTransactionDate(null); // GUID if (perfLogDataJSONObj.get("guid") != null) { perfLogData.setGuid(perfLogDataJSONObj.get("guid").toString()); } else perfLogData.setGuid(null); // SID (Session ID) if (perfLogDataJSONObj.get("sid") != null) { perfLogData.setSessionId(perfLogDataJSONObj.get("sid").toString()); } else perfLogData.setSessionId(null); // THREAD_NAME if (perfLogDataJSONObj.get("threadName") != null) { perfLogData.setThreadName(perfLogDataJSONObj.get("threadName").toString()); } else perfLogData.setThreadName(null); // THREAD_ID if (perfLogDataJSONObj.get("threadId") != null) { perfLogData.setThreadId(perfLogDataJSONObj.get("threadId").toString()); } else perfLogData.setThreadId(null); // cloneName (InstanceName) if (perfLogDataJSONObj.get("cloneName") != null) { perfLogData.setCloneName(perfLogDataJSONObj.get("cloneName").toString()); } else perfLogData.setCloneName(null); // jvmDepth if (perfLogDataJSONObj.get("jvmDepth") != null) { perfLogData.setJvmDepth(((Integer) (perfLogDataJSONObj.get("jvmDepth"))).intValue()); } else perfLogData.setJvmDepth(0); // txnFilterDepth if (perfLogDataJSONObj.get("txnFilterDepth") != null) { perfLogData .setTxnFilterDepth(((Integer) (perfLogDataJSONObj.get("txnFilterDepth"))).intValue()); } else perfLogData.setTxnFilterDepth(0); // serverName if (perfLogDataJSONObj.get("serverName") != null) { perfLogData.setServerName(perfLogDataJSONObj.get("serverName").toString()); } else perfLogData.setServerName(null); // serverIp if (perfLogDataJSONObj.get("serverIp") != null) { perfLogData.setServerIp(perfLogDataJSONObj.get("serverIp").toString()); } else perfLogData.setServerIp(null); // userId if (perfLogDataJSONObj.get("userid") != null) { perfLogData.setUserId(perfLogDataJSONObj.get("userid").toString()); } else perfLogData.setUserId(null); // pageId if (perfLogDataJSONObj.get("txnName") != null) { perfLogData.setTransactionName(perfLogDataJSONObj.get("txnName").toString()); } else perfLogData.setTransactionName(null); // action if (perfLogDataJSONObj.get("subTxnName") != null) { perfLogData.setSubTransactionName(perfLogDataJSONObj.get("subTxnName").toString()); } else perfLogData.setSubTransactionName(null); // txnClass if (perfLogDataJSONObj.get("txnClass") != null) { perfLogData.setTransactionClass(perfLogDataJSONObj.get("txnClass").toString()); } else perfLogData.setTransactionClass(null); // transactionTimeInMilliSeconds if (perfLogDataJSONObj.get("txnTime") != null) { perfLogData.setTransactionTime(((Long) perfLogDataJSONObj.get("txnTime")).longValue()); } else perfLogData.setTransactionTime(0); // get throwableMessage and throwableClass String throwableMessage = (String) perfLogDataJSONObj.get("throwableMessage"); perfLogData.setThrowableMessage(throwableMessage); perfLogData.setThrowableClassName((String) perfLogDataJSONObj.get("throwableClass")); // Transaction Type perfLogData.setTransactionType((String) perfLogDataJSONObj.get("txnType")); // InfoContext String perfLogData.setInfoContextString((String) perfLogDataJSONObj.get("infoCtxStr")); // Message String perfLogData.setMessage((String) perfLogDataJSONObj.get("message")); } } catch (ParseException parseException) { logger.error("JSON Parser Exception" + parseException.getMessage()); // parseException.printStackTrace(); } return perfLogData; } public String getThreadName() { return threadName; } public void setThreadName(String threadName) { this.threadName = threadName; } public String getTransactionClass() { if (transactionClass != null) return transactionClass; else return PerfLogTxnClass.getTxnClassFromTransactionType(this); } public void setTransactionClass(String transactionClass) { this.transactionClass = transactionClass; } public String getThreadId() { return threadId; } public void setThreadId(String threadId) { this.threadId = threadId; } public int getJvmDepth() { return jvmDepth; } public void setJvmDepth(int jvmDepth) { this.jvmDepth = jvmDepth; } public int getTxnFilterDepth() { return txnFilterDepth; } public void setTxnFilterDepth(int txnFilterDepth) { this.txnFilterDepth = txnFilterDepth; } }