/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.logging; import java.sql.Timestamp; import org.teiid.client.plan.PlanNode; import org.teiid.core.util.StringUtil; import org.teiid.translator.ExecutionContext; /** * Log Message for source and user command events. */ public class CommandLogMessage { public enum Event { NEW, PLAN, END, CANCEL, SOURCE, ERROR } private boolean source; private Event event; private long timestamp; // Transaction info private String transactionID; // Session info private String sessionID; private String applicationName; private String principal; private String vdbName; private String vdbVersion; // RequestInfo private String requestID; private Long sourceCommandID; private String sql; private Long rowCount; private String modelName; private String translatorName; private ExecutionContext executionContext; private PlanNode plan; private Object[] sourceCommand; private Long cpuTime; public CommandLogMessage(long timestamp, String requestID, String transactionID, String sessionID, String applicationName, String principal, String vdbName, String vdbVersion, String sql, Long cpuTime) { // userCommandStart this(timestamp, requestID, transactionID, sessionID, principal, vdbName, vdbVersion, null, Event.NEW, null); this.applicationName = applicationName; this.sql = sql; this.cpuTime = cpuTime; } public CommandLogMessage(long timestamp, String requestID, String transactionID, String sessionID, String principal, String vdbName, String vdbVersion, Long finalRowCount, Event event, PlanNode plan) { // userCommandEnd this.event = event; this.timestamp = timestamp; this.requestID = requestID; this.transactionID = transactionID; this.sessionID = sessionID; this.principal = principal; this.vdbName = vdbName; this.vdbVersion = vdbVersion; this.rowCount = finalRowCount; this.plan = plan; } public CommandLogMessage(long timestamp, String requestID, long sourceCommandID, String transactionID, String modelName, String translatorName, String sessionID, String principal, String sql, ExecutionContext context) { // dataSourceCommandStart this(timestamp, requestID, sourceCommandID, transactionID, modelName, translatorName, sessionID, principal, null, Event.NEW, context, null); this.sql = sql; } public CommandLogMessage(long timestamp, String requestID, long sourceCommandID, String transactionID, String modelName, String translatorName, String sessionID, String principal, Long finalRowCount, Event event, ExecutionContext context, Long cpuTime) { // dataSourceCommandEnd this.source = true; this.event = event; this.timestamp = timestamp; this.requestID = requestID; this.sourceCommandID = sourceCommandID; this.transactionID = transactionID; this.modelName = modelName; this.translatorName = translatorName; this.sessionID = sessionID; this.principal = principal; this.rowCount = finalRowCount; this.executionContext = context; this.cpuTime = cpuTime; } public String toString() { if (!source) { if (event == Event.NEW) { return "\tSTART USER COMMAND:\tstartTime=" + new Timestamp(timestamp) + "\trequestID=" + requestID + "\ttxID=" + transactionID + "\tsessionID=" + sessionID + "\tapplicationName=" + applicationName + "\tprincipal=" + principal + "\tvdbName=" + vdbName + "\tvdbVersion=" + vdbVersion + "\tsql=" + sql; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$//$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ } return "\t"+ event +" USER COMMAND:\tendTime=" + new Timestamp(timestamp) + "\trequestID=" + requestID + "\ttxID=" + transactionID + "\tsessionID=" + sessionID + "\tprincipal=" + principal + "\tvdbName=" + vdbName + "\tvdbVersion=" + vdbVersion + "\tfinalRowCount=" + rowCount+ ((plan!=null)?"\tplan=" + plan:"") + ((cpuTime!=null)?"\tcpuTime(ns)=" + cpuTime:""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$//$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$ } if (event == Event.NEW) { return "\tSTART DATA SRC COMMAND:\tstartTime=" + new Timestamp(timestamp) + "\trequestID=" + requestID + "\tsourceCommandID="+ sourceCommandID + "\texecutionID="+ executionContext.getExecutionCountIdentifier() + "\ttxID=" + transactionID + "\tmodelName="+ modelName + "\ttranslatorName=" + translatorName + "\tsessionID=" + sessionID + "\tprincipal=" + principal + "\tsql=" + sql; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$//$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ } return "\t"+ event +" SRC COMMAND:\tendTime=" + new Timestamp(timestamp) + "\trequestID=" + requestID + "\tsourceCommandID="+ sourceCommandID + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ "\texecutionID="+ executionContext.getExecutionCountIdentifier() + "\ttxID=" + transactionID + "\tmodelName="+ modelName + "\ttranslatorName=" + translatorName + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ "\tsessionID=" + sessionID + "\tprincipal=" + principal + ((sourceCommand != null)?"\tsourceCommand=" + StringUtil.toString(sourceCommand, " "):"") + ((rowCount != null)?"\tfinalRowCount=" + rowCount:"") + ((cpuTime!=null)?"\tcpuTime(ns)=" + cpuTime:""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$//$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ } public long getTimestamp() { return timestamp; } public String getTransactionID() { return transactionID; } public String getSessionID() { return sessionID; } public String getApplicationName() { return applicationName; } public String getPrincipal() { return principal; } public String getVdbName() { return vdbName; } public String getVdbVersion() { return vdbVersion; } public String getRequestID() { return requestID; } public Long getSourceCommandID() { return sourceCommandID; } /** * Returns the command. Only valid for {@link Event#NEW} * @return */ public String getSql() { return sql; } /** * Returns the command. Only valid for {@link Event#END} * @return */ public Long getRowCount() { return rowCount; } public String getModelName() { return modelName; } /** * @deprecated in 7.7 see {@link #getTranslatorName()} */ public String getConnectorBindingName() { return translatorName; } public String getTranslatorName() { return translatorName; } public Event getStatus() { return event; } public boolean isSource() { return source; } /** * Only available for source commands * @return */ public ExecutionContext getExecutionContext() { return executionContext; } /** * Only available for user commands after the NEW event * @return */ public PlanNode getPlan() { return plan; } /** * the cpu time in nanoseconds. Will be null for events * that don't have a cpu time measurement. Will be -1 when * the system is not able to determine a value. * * @return */ public Long getCpuTime() { return cpuTime; } public void setSourceCommand(Object[] sourceCommand) { this.sourceCommand = sourceCommand; } /** * The source command issued. It's up to each source as to what the representation is. * Only set for the {@link Event#SOURCE} * @param sourceCommand */ public Object[] getSourceCommand() { return sourceCommand; } }