LENS-25: Print the query execution status on CLI
Project: http://git-wip-us.apache.org/repos/asf/incubator-lens/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-lens/commit/25428747 Tree: http://git-wip-us.apache.org/repos/asf/incubator-lens/tree/25428747 Diff: http://git-wip-us.apache.org/repos/asf/incubator-lens/diff/25428747 Branch: refs/heads/current-release-line Commit: 25428747d76428dadeb5a573dc751ed9b4b15432 Parents: 1fde486 Author: Raju Bairishetti <[email protected]> Authored: Thu Jun 18 16:41:59 2015 +0530 Committer: Rajat Khandelwal <[email protected]> Committed: Thu Jun 18 16:41:59 2015 +0530 ---------------------------------------------------------------------- .../cli/commands/LensConnectionCommands.java | 125 +++++++++++++++++++ .../java/org/apache/lens/client/LensClient.java | 6 + .../apache/lens/client/LensClientConfig.java | 2 +- .../org/apache/lens/client/LensStatement.java | 21 ++++ src/site/apt/user/cli.apt | 4 + tools/conf-pseudo-distr/client/log4j.properties | 28 ++--- tools/conf/client/log4j.properties | 28 ++--- 7 files changed, 183 insertions(+), 31 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/25428747/lens-cli/src/main/java/org/apache/lens/cli/commands/LensConnectionCommands.java ---------------------------------------------------------------------- diff --git a/lens-cli/src/main/java/org/apache/lens/cli/commands/LensConnectionCommands.java b/lens-cli/src/main/java/org/apache/lens/cli/commands/LensConnectionCommands.java index 675e6c8..8b4face 100644 --- a/lens-cli/src/main/java/org/apache/lens/cli/commands/LensConnectionCommands.java +++ b/lens-cli/src/main/java/org/apache/lens/cli/commands/LensConnectionCommands.java @@ -18,6 +18,7 @@ */ package org.apache.lens.cli.commands; +import java.util.Enumeration; import java.util.List; import javax.ws.rs.ProcessingException; @@ -25,6 +26,10 @@ import javax.ws.rs.ProcessingException; import org.apache.lens.api.APIResult; import org.apache.lens.cli.commands.annotations.UserDocumentation; +import org.apache.lens.client.LensClient; + +import org.apache.log4j.*; + import org.springframework.shell.core.ExitShellRequest; import org.springframework.shell.core.annotation.CliCommand; import org.springframework.shell.core.annotation.CliOption; @@ -153,6 +158,126 @@ public class LensConnectionCommands extends BaseLensCommand { } /** + * Enables to show all class level logs on cli + * @param enable + */ + @CliCommand(value = {"debug"}, help = "prints all class level logs and verbose logs on cli for debugging purpose." + + " 'debug false' to turn off all class level logging and verbose level logging ") + public void debug(@CliOption(key = {"", "enable"}, + mandatory = false, unspecifiedDefaultValue = "true", + help = "To print all logs on cli for debugging purpose") boolean enable) { + Logger logger = LoggerUtil.getRootLogger(); + Logger cliLogger = LoggerUtil.getCliLogger(); + if (enable) { + LoggerUtil.addConsoleAppenderIfNotPresent(logger); + LoggerUtil.addConsoleAppenderIfNotPresent(cliLogger); + } else { + LoggerUtil.removeConsoleAppender(logger); + LoggerUtil.removeConsoleAppender(cliLogger); + } + } + + /** + * Enables to show only cliLogger(verbose) logs on cli + * @param enable + */ + @CliCommand(value = {"verbose"}, help = "Show cliLogger logs on cli" + + "'verbose false' turns off the cliLogger logs on console") + public void verbose(@CliOption(key = {"", "enable"}, + mandatory = false, unspecifiedDefaultValue = "true", + help = "Print the clilogger logs on cli") boolean enable) { + Logger cliLogger = LoggerUtil.getCliLogger(); + if (enable) { + LoggerUtil.addConsoleAppenderIfNotPresent(cliLogger); + } else { + LoggerUtil.removeConsoleAppender(cliLogger); + } + } + + private static class LoggerUtil { + private static Logger logger; + private static Logger cliLogger; + + public static Logger getRootLogger() { + if (logger == null) { + logger = Logger.getRootLogger(); + } + return logger; + } + + public static Logger getCliLogger() { + if (cliLogger == null) { + cliLogger = Logger.getLogger(LensClient.CLILOGGER); + } + return cliLogger; + } + + public static ConsoleAppender getConsoleAppender() { + return getConsoleAppender(getPatternLayout()); + } + + public static ConsoleAppender getConsoleAppender(Layout layout) { + ConsoleAppender consoleAppender = new ConsoleAppender(); + consoleAppender.setLayout(layout); + consoleAppender.activateOptions(); + return consoleAppender; + } + + public static PatternLayout getPatternLayout() { + String conversionPattern = "%d [%t] %F %-7p - %m%n"; + return getPatternLayout(conversionPattern); + } + + public static PatternLayout getPatternLayout(String conversionPattern) { + PatternLayout layout = new PatternLayout(); + layout.setConversionPattern(conversionPattern); + return layout; + } + + /** + * Check whether ConsoleAppender was already added + * @param logger + * @return true if it was already added + * false if it does not contain ConsoleAppender + */ + public static void addConsoleAppenderIfNotPresent(Logger logger) { + boolean isConsoleAppenderAdded = false; + Layout layout = null; + Enumeration appenderSeries = logger.getAllAppenders(); + while (appenderSeries.hasMoreElements()) { + Appender appender = (Appender) appenderSeries.nextElement(); + if (appender instanceof ConsoleAppender) { + isConsoleAppenderAdded = true; + break; + } else { + layout = appender.getLayout(); + } + } + if (!isConsoleAppenderAdded) { + if (layout == null) { + layout = LoggerUtil.getPatternLayout(); + } + if (logger.getLevel() == null) { + logger.setLevel(Level.DEBUG); + } + ConsoleAppender consoleAppender = LoggerUtil.getConsoleAppender(layout); + logger.addAppender(consoleAppender); + } + } + + public static void removeConsoleAppender(Logger logger) { + Enumeration appenderSeries = logger.getAllAppenders(); + while (appenderSeries.hasMoreElements()) { + Appender appender = (Appender) appenderSeries.nextElement(); + if (appender instanceof ConsoleAppender) { + logger.removeAppender(appender); + } + } + } + + } + + /** * Quit shell. * * @return the exit shell request http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/25428747/lens-client/src/main/java/org/apache/lens/client/LensClient.java ---------------------------------------------------------------------- diff --git a/lens-client/src/main/java/org/apache/lens/client/LensClient.java b/lens-client/src/main/java/org/apache/lens/client/LensClient.java index 5c3daa8..7399d9e 100644 --- a/lens-client/src/main/java/org/apache/lens/client/LensClient.java +++ b/lens-client/src/main/java/org/apache/lens/client/LensClient.java @@ -37,6 +37,8 @@ import lombok.Getter; public class LensClient { private static final Log LOG = LogFactory.getLog(LensClient.class); + + public static final String CLILOGGER = "cliLogger"; private static final String DEFAULT_PASSWORD = ""; private final LensClientConfig conf; @Getter @@ -48,6 +50,10 @@ public class LensClient { Maps.newHashMap(); private final LensStatement statement; + public static Log getCliLooger() { + return LogFactory.getLog(CLILOGGER); + } + public LensClient() { this(new LensClientConfig()); } http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/25428747/lens-client/src/main/java/org/apache/lens/client/LensClientConfig.java ---------------------------------------------------------------------- diff --git a/lens-client/src/main/java/org/apache/lens/client/LensClientConfig.java b/lens-client/src/main/java/org/apache/lens/client/LensClientConfig.java index cf3a97c..edb56ac 100644 --- a/lens-client/src/main/java/org/apache/lens/client/LensClientConfig.java +++ b/lens-client/src/main/java/org/apache/lens/client/LensClientConfig.java @@ -49,7 +49,7 @@ public class LensClientConfig extends Configuration { private static final String QUERY_POLL_INTERVAL_KEY = CLIENT_PFX + "query.poll.interval"; /** The Constant DEFAULT_QUERY_POLL_INTERVAL. */ - private static final long DEFAULT_QUERY_POLL_INTERVAL = 10 * 1000L; + private static final long DEFAULT_QUERY_POLL_INTERVAL = 10L; /** The Constant USER_NAME. */ private static final String USER_NAME = CLIENT_PFX + "user.name"; http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/25428747/lens-client/src/main/java/org/apache/lens/client/LensStatement.java ---------------------------------------------------------------------- diff --git a/lens-client/src/main/java/org/apache/lens/client/LensStatement.java b/lens-client/src/main/java/org/apache/lens/client/LensStatement.java index e2693c9..40e2b86 100644 --- a/lens-client/src/main/java/org/apache/lens/client/LensStatement.java +++ b/lens-client/src/main/java/org/apache/lens/client/LensStatement.java @@ -191,10 +191,27 @@ public class LensStatement { * @param handle the handle */ public void waitForQueryToComplete(QueryHandle handle) { + LensClient.getCliLooger().info("Query handle: " + handle); query = getQuery(handle); + while (isQueryInQUEUEDSate()) { + query = getQuery(handle); + LensClient.getCliLooger().debug("Query " + handle + " status: " + query.getStatus()); + try { + Thread.sleep(connection.getLensConnectionParams().getQueryPollInterval()); + } catch (InterruptedException e) { + throw new IllegalStateException(e); + } + } + LensClient.getCliLooger().info("User query: '" + query.getUserQuery() + + "' was submitted to " + query.getSelectedDriverClassName()); + if (query.getDriverQuery() != null) { + LensClient.getCliLooger().info(" Driver query: '" + query.getDriverQuery() + + "' and Driver handle: " + query.getDriverOpHandle()); + } while (!query.getStatus().finished() && !(query.getStatus().toString().equals(Status.CLOSED.toString()))) { query = getQuery(handle); + LensClient.getCliLooger().info(query.getStatus()); try { Thread.sleep(connection.getLensConnectionParams().getQueryPollInterval()); } catch (InterruptedException e) { @@ -203,6 +220,10 @@ public class LensStatement { } } + private boolean isQueryInQUEUEDSate() { + return query.getStatus().getStatus().equals(QueryStatus.Status.QUEUED); + } + /** * Gets the query web target. * http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/25428747/src/site/apt/user/cli.apt ---------------------------------------------------------------------- diff --git a/src/site/apt/user/cli.apt b/src/site/apt/user/cli.apt index 20785f1..353c171 100644 --- a/src/site/apt/user/cli.apt +++ b/src/site/apt/user/cli.apt @@ -92,6 +92,8 @@ User CLI Commands *--+--+ |close/bye|Releases all resources of the server session and exits the shell| *--+--+ +|debug [[--enable] To print all logs on cli for debugging purpose]|prints all class lelvel logs on cli for debugging purpose| +*--+--+ |get [--key] \<key\>|Fetches and prints session parameter specified with name <<<key>>> from lens server| *--+--+ |list resources [[--type] \<resource-type\>]|list all resources from session. If type is provided, lists resources of type <<<resource-type>>>. Valid values for type are jar and file.| @@ -104,6 +106,8 @@ User CLI Commands *--+--+ |show params|Fetches and prints all session parameter from lens server| *--+--+ +|verbose [[--enable] Print the clilogger logs on cli]|Show cliLogger logs for command| +*--+--+ <<Lens Connection Commands>> === http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/25428747/tools/conf-pseudo-distr/client/log4j.properties ---------------------------------------------------------------------- diff --git a/tools/conf-pseudo-distr/client/log4j.properties b/tools/conf-pseudo-distr/client/log4j.properties index 5520304..3756cf7 100644 --- a/tools/conf-pseudo-distr/client/log4j.properties +++ b/tools/conf-pseudo-distr/client/log4j.properties @@ -19,22 +19,20 @@ # Set root logger level to DEBUG and its only appender to A1. -log4j.rootLogger=INFO, R - -# A1 is set to be a ConsoleAppender. -log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.rootLogger=INFO, root log4j.category.org.springframework=OFF -# A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n - -log4j.appender.R=org.apache.log4j.RollingFileAppender -log4j.appender.R.File=${lens.log.dir}/lensclient.log -log4j.appender.R.layout=org.apache.log4j.PatternLayout -log4j.appender.R.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n - -log4j.appender.R.MaxFileSize=100000KB +log4j.appender.root=org.apache.log4j.RollingFileAppender +log4j.appender.root.File=${lens.log.dir}/lensclient.log +log4j.appender.root.layout=org.apache.log4j.PatternLayout +log4j.appender.root.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n +log4j.appender.root.MaxFileSize=100000KB # Keep 20 backup files -log4j.appender.R.MaxBackupIndex=20 +log4j.appender.root.MaxBackupIndex=20 + +log4j.category.cliLogger=DEBUG, verboseLogger +log4j.appender.verboseLogger=org.apache.log4j.ConsoleAppender +log4j.appender.verboseLogger.layout=org.apache.log4j.PatternLayout +log4j.appender.verboseLogger.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n +log4j.additivity.cliLogger=false http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/25428747/tools/conf/client/log4j.properties ---------------------------------------------------------------------- diff --git a/tools/conf/client/log4j.properties b/tools/conf/client/log4j.properties index 5520304..3756cf7 100644 --- a/tools/conf/client/log4j.properties +++ b/tools/conf/client/log4j.properties @@ -19,22 +19,20 @@ # Set root logger level to DEBUG and its only appender to A1. -log4j.rootLogger=INFO, R - -# A1 is set to be a ConsoleAppender. -log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.rootLogger=INFO, root log4j.category.org.springframework=OFF -# A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n - -log4j.appender.R=org.apache.log4j.RollingFileAppender -log4j.appender.R.File=${lens.log.dir}/lensclient.log -log4j.appender.R.layout=org.apache.log4j.PatternLayout -log4j.appender.R.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n - -log4j.appender.R.MaxFileSize=100000KB +log4j.appender.root=org.apache.log4j.RollingFileAppender +log4j.appender.root.File=${lens.log.dir}/lensclient.log +log4j.appender.root.layout=org.apache.log4j.PatternLayout +log4j.appender.root.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n +log4j.appender.root.MaxFileSize=100000KB # Keep 20 backup files -log4j.appender.R.MaxBackupIndex=20 +log4j.appender.root.MaxBackupIndex=20 + +log4j.category.cliLogger=DEBUG, verboseLogger +log4j.appender.verboseLogger=org.apache.log4j.ConsoleAppender +log4j.appender.verboseLogger.layout=org.apache.log4j.PatternLayout +log4j.appender.verboseLogger.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n +log4j.additivity.cliLogger=false
