Repository: phoenix
Updated Branches:
refs/heads/4.x-HBase-0.98 8f3cd25e3 -> 8e27399c0
PHOENIX-2186 Creating backend services for the Phoenix Tracing Web App (Nishani)
Conflicts:
pom.xml
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/59391683
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/59391683
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/59391683
Branch: refs/heads/4.x-HBase-0.98
Commit: 59391683e4b26c1609fda97a775cd74bd99a2ddc
Parents: 8f3cd25
Author: ayolajayamaha <[email protected]>
Authored: Mon Jul 27 22:27:27 2015 +0530
Committer: Nick Dimiduk <[email protected]>
Committed: Wed Sep 9 16:09:24 2015 -0700
----------------------------------------------------------------------
bin/phoenix_utils.py | 8 +
bin/traceserver.py | 188 +++++++++++++
phoenix-tracing-webapp/README.md | 15 +
phoenix-tracing-webapp/pom.xml | 122 ++++++++
.../src/build/trace-server-runnable.xml | 60 ++++
.../src/main/config/checkstyle/checker.xml | 281 +++++++++++++++++++
.../src/main/config/checkstyle/header.txt | 16 ++
.../src/main/config/checkstyle/suppressions.xml | 46 +++
.../tracingwebapp/http/ConnectionFactory.java | 43 +++
.../tracingwebapp/http/EntityFactory.java | 101 +++++++
.../apache/phoenix/tracingwebapp/http/Main.java | 81 ++++++
.../tracingwebapp/http/TraceServlet.java | 152 ++++++++++
.../src/main/webapp/WEB-INF/web.xml | 15 +
.../src/main/webapp/index.html | 16 ++
pom.xml | 2 +
15 files changed, 1146 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/bin/phoenix_utils.py
----------------------------------------------------------------------
diff --git a/bin/phoenix_utils.py b/bin/phoenix_utils.py
index bfb4737..13dd360 100755
--- a/bin/phoenix_utils.py
+++ b/bin/phoenix_utils.py
@@ -56,6 +56,7 @@ def setPath():
PHOENIX_CLIENT_JAR_PATTERN = "phoenix-*-client.jar"
PHOENIX_THIN_CLIENT_JAR_PATTERN = "phoenix-*-thin-client.jar"
PHOENIX_QUERYSERVER_JAR_PATTERN = "phoenix-server-*-runnable.jar"
+ PHOENIX_TRACESERVER_JAR_PATTERN = "phoenix-tracing-webapp-*-runnable.jar"
PHOENIX_TESTS_JAR_PATTERN = "phoenix-core-*-tests*.jar"
# Backward support old env variable PHOENIX_LIB_DIR replaced by
PHOENIX_CLASS_PATH
@@ -119,6 +120,13 @@ def setPath():
if phoenix_queryserver_jar == "":
phoenix_queryserver_jar =
findFileInPathWithoutRecursion(PHOENIX_QUERYSERVER_JAR_PATTERN,
os.path.join(current_dir, ".."))
+ global phoenix_traceserver_jar
+ phoenix_traceserver_jar = find(PHOENIX_TRACESERVER_JAR_PATTERN,
os.path.join(current_dir, "..", "phoenix-tracing-webapp", "target", "*"))
+ if phoenix_traceserver_jar == "":
+ phoenix_traceserver_jar =
findFileInPathWithoutRecursion(PHOENIX_TRACESERVER_JAR_PATTERN,
os.path.join(current_dir, "..", "lib"))
+ if phoenix_traceserver_jar == "":
+ phoenix_traceserver_jar =
findFileInPathWithoutRecursion(PHOENIX_TRACESERVER_JAR_PATTERN,
os.path.join(current_dir, ".."))
+
global phoenix_thin_client_jar
phoenix_thin_client_jar = find(PHOENIX_THIN_CLIENT_JAR_PATTERN,
os.path.join(current_dir, "..", "phoenix-server-client", "target", "*"))
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/bin/traceserver.py
----------------------------------------------------------------------
diff --git a/bin/traceserver.py b/bin/traceserver.py
new file mode 100755
index 0000000..3d12193
--- /dev/null
+++ b/bin/traceserver.py
@@ -0,0 +1,188 @@
+#!/usr/bin/env python
+############################################################################
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+############################################################################
+
+#
+# Script to handle launching the trace server process.
+#
+# usage: traceserver.py [start|stop]
+#
+
+import datetime
+import getpass
+import os
+import os.path
+import signal
+import subprocess
+import sys
+import tempfile
+
+try:
+ import daemon
+ daemon_supported = True
+except ImportError:
+ # daemon script not supported on some platforms (windows?)
+ daemon_supported = False
+
+import phoenix_utils
+
+phoenix_utils.setPath()
+
+command = None
+args = sys.argv
+
+if len(args) > 1:
+ if args[1] == 'start':
+ command = 'start'
+ elif args[1] == 'stop':
+ command = 'stop'
+if command:
+ args = args[2:]
+
+if os.name == 'nt':
+ args = subprocess.list2cmdline(args[1:])
+else:
+ import pipes # pipes module isn't available on Windows
+ args = " ".join([pipes.quote(v) for v in args[1:]])
+
+# HBase configuration folder path (where hbase-site.xml reside) for
+# HBase/Phoenix client side property override
+hbase_config_path = phoenix_utils.hbase_conf_dir
+
+# default paths ## TODO: add windows support
+java_home = os.getenv('JAVA_HOME')
+hbase_pid_dir = os.path.join(tempfile.gettempdir(), 'phoenix')
+phoenix_log_dir = os.path.join(tempfile.gettempdir(), 'phoenix')
+phoenix_file_basename = 'phoenix-%s-traceserver' % getpass.getuser()
+phoenix_log_file = '%s.log' % phoenix_file_basename
+phoenix_out_file = '%s.out' % phoenix_file_basename
+phoenix_pid_file = '%s.pid' % phoenix_file_basename
+opts = os.getenv('PHOENIX_TRACESERVER_OPTS', '')
+
+# load hbase-env.??? to extract JAVA_HOME, HBASE_PID_DIR, HBASE_LOG_DIR
+hbase_env_path = None
+hbase_env_cmd = None
+if os.name == 'posix':
+ hbase_env_path = os.path.join(hbase_config_path, 'hbase-env.sh')
+ hbase_env_cmd = ['bash', '-c', 'source %s && env' % hbase_env_path]
+elif os.name == 'nt':
+ hbase_env_path = os.path.join(hbase_config_path, 'hbase-env.cmd')
+ hbase_env_cmd = ['cmd.exe', '/c', 'call %s & set' % hbase_env_path]
+if not hbase_env_path or not hbase_env_cmd:
+ print >> sys.stderr, "hbase-env file unknown on platform %s" % os.name
+ sys.exit(-1)
+
+hbase_env = {}
+if os.path.isfile(hbase_env_path):
+ p = subprocess.Popen(hbase_env_cmd, stdout = subprocess.PIPE)
+ for x in p.stdout:
+ (k, _, v) = x.partition('=')
+ hbase_env[k.strip()] = v.strip()
+
+if hbase_env.has_key('JAVA_HOME'):
+ java_home = hbase_env['JAVA_HOME']
+if hbase_env.has_key('HBASE_PID_DIR'):
+ hbase_pid_dir = hbase_env['HBASE_PID_DIR']
+if hbase_env.has_key('HBASE_LOG_DIR'):
+ phoenix_log_dir = hbase_env['HBASE_LOG_DIR']
+if hbase_env.has_key('PHOENIX_TRACESERVER_OPTS'):
+ opts = hbase_env['PHOENIX_TRACESERVER_OPTS']
+
+log_file_path = os.path.join(phoenix_log_dir, phoenix_log_file)
+out_file_path = os.path.join(phoenix_log_dir, phoenix_out_file)
+pid_file_path = os.path.join(hbase_pid_dir, phoenix_pid_file)
+
+if java_home:
+ java = os.path.join(java_home, 'bin', 'java')
+else:
+ java = 'java'
+
+# " -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n "
+ \
+# " -XX:+UnlockCommercialFeatures -XX:+FlightRecorder
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true" + \
+java_cmd = '%(java)s -cp ' + hbase_config_path + os.pathsep +
phoenix_utils.phoenix_traceserver_jar + \
+ " -Dproc_phoenixtraceserver" + \
+ " -Dlog4j.configuration=file:" + os.path.join(phoenix_utils.current_dir,
"log4j.properties") + \
+ " -Dpsql.root.logger=%(root_logger)s" + \
+ " -Dpsql.log.dir=%(log_dir)s" + \
+ " -Dpsql.log.file=%(log_file)s" + \
+ " " + opts + \
+ " org.apache.phoenix.tracingwebapp.http.Main " + args
+
+if command == 'start':
+ if not daemon_supported:
+ print >> sys.stderr, "daemon mode not supported on this platform"
+ sys.exit(-1)
+
+ # run in the background
+ d = os.path.dirname(out_file_path)
+ if not os.path.exists(d):
+ os.makedirs(d)
+ with open(out_file_path, 'a+') as out:
+ context = daemon.DaemonContext(
+ pidfile = daemon.PidFile(pid_file_path, 'Trace Server already
running, PID file found: %s' % pid_file_path),
+ stdout = out,
+ stderr = out,
+ )
+ print 'starting Trace Server, logging to %s' % log_file_path
+ with context:
+ # this block is the main() for the forked daemon process
+ child = None
+ cmd = java_cmd % {'java': java, 'root_logger': 'INFO,DRFA',
'log_dir': phoenix_log_dir, 'log_file': phoenix_log_file}
+
+ # notify the child when we're killed
+ def handler(signum, frame):
+ if child:
+ child.send_signal(signum)
+ sys.exit(0)
+ signal.signal(signal.SIGTERM, handler)
+
+ print '%s launching %s' % (datetime.datetime.now(), cmd)
+ child = subprocess.Popen(cmd.split())
+ sys.exit(child.wait())
+
+elif command == 'stop':
+ if not daemon_supported:
+ print >> sys.stderr, "daemon mode not supported on this platform"
+ sys.exit(-1)
+
+ if not os.path.exists(pid_file_path):
+ print >> sys.stderr, "no Trace Server to stop because PID file not
found, %s" % pid_file_path
+ sys.exit(0)
+
+ if not os.path.isfile(pid_file_path):
+ print >> sys.stderr, "PID path exists but is not a file! %s" %
pid_file_path
+ sys.exit(1)
+
+ pid = None
+ with open(pid_file_path, 'r') as p:
+ pid = int(p.read())
+ if not pid:
+ sys.exit("cannot read PID file, %s" % pid_file_path)
+
+ print "stopping Trace Server pid %s" % pid
+ with open(out_file_path, 'a+') as out:
+ print >> out, "%s terminating Trace Server" % datetime.datetime.now()
+ os.kill(pid, signal.SIGTERM)
+
+else:
+ # run in the foreground using defaults from log4j.properties
+ cmd = java_cmd % {'java': java, 'root_logger': 'INFO,console', 'log_dir':
'.', 'log_file': 'psql.log'}
+ child = subprocess.Popen(cmd.split())
+ sys.exit(child.wait())
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/README.md
----------------------------------------------------------------------
diff --git a/phoenix-tracing-webapp/README.md b/phoenix-tracing-webapp/README.md
new file mode 100755
index 0000000..d2af448
--- /dev/null
+++ b/phoenix-tracing-webapp/README.md
@@ -0,0 +1,15 @@
+# TracingWebApp
+1. Build the web application-
+ *mvn clean install*
+
+2. Start the TracingWebApp
+ *java -jar target/phoenix-tracing-webapp-4.5.0-SNAPSHOT-runnable.jar*
+
+3. View the Content -
+ *http://localhost:8864/webapp/#*
+
+ ###Note
+ You can set the port of the trace app by
-Dphoenix.traceserver.http.port={portNo}
+
+ eg:
+ `-Dphoenix.traceserver.http.port=8887` server will start in 8887
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/pom.xml
----------------------------------------------------------------------
diff --git a/phoenix-tracing-webapp/pom.xml b/phoenix-tracing-webapp/pom.xml
new file mode 100755
index 0000000..cecb5c9
--- /dev/null
+++ b/phoenix-tracing-webapp/pom.xml
@@ -0,0 +1,122 @@
+<?xml version='1.0'?>
+ <!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you 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.
+
+-->
+
+ <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.phoenix</groupId>
+ <artifactId>phoenix</artifactId>
+ <version>4.6.0-HBase-0.98-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>phoenix-tracing-webapp</artifactId>
+ <name>Phoenix - Tracing Web Application</name>
+ <description>Tracing web application will visualize the phoenix
traces</description>
+
+ <properties>
+ <top.dir>${project.basedir}/..</top.dir>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-server</artifactId>
+ <!-- TODO : pick the same jetty version throughout the project
(PHOENIX-2211)-->
+ <version>${jettyVersion}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-webapp</artifactId>
+ <!-- TODO : pick the same jetty version throughout the project
(PHOENIX-2211)-->
+ <version>${jettyVersion}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-common</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.phoenix</groupId>
+ <artifactId>phoenix-core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.hbase</groupId>
+ <artifactId>hbase-common</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-core-asl</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-mapper-asl</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>runnable</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <attach>true</attach>
+ <archive>
+ <manifest>
+ <addClasspath>true</addClasspath>
+
<mainClass>org.apache.phoenix.tracingwebapp.http.Main</mainClass>
+ </manifest>
+ </archive>
+ <finalName>${project.artifactId}-${project.version}</finalName>
+ <descriptors>
+ <descriptor>src/build/trace-server-runnable.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ </project>
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/src/build/trace-server-runnable.xml
----------------------------------------------------------------------
diff --git a/phoenix-tracing-webapp/src/build/trace-server-runnable.xml
b/phoenix-tracing-webapp/src/build/trace-server-runnable.xml
new file mode 100755
index 0000000..21b3bde
--- /dev/null
+++ b/phoenix-tracing-webapp/src/build/trace-server-runnable.xml
@@ -0,0 +1,60 @@
+<?xml version='1.0'?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you 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.
+
+-->
+
+<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0
http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+ <id>runnable</id>
+ <formats>
+ <format>jar</format>
+ </formats>
+ <includeBaseDirectory>false</includeBaseDirectory>
+ <containerDescriptorHandlers>
+ <containerDescriptorHandler>
+ <!--
+ aggregate SPI's so that things like HDFS FileSystem works in uberjar
+ http://docs.oracle.com/javase/tutorial/sound/SPI-intro.html
+ -->
+ <handlerName>metaInf-services</handlerName>
+ </containerDescriptorHandler>
+ </containerDescriptorHandlers>
+ <dependencySets>
+ <dependencySet>
+ <outputDirectory>/</outputDirectory>
+ <useProjectArtifact>true</useProjectArtifact>
+ <unpack>true</unpack>
+ <scope>provided</scope>
+ </dependencySet>
+ </dependencySets>
+ <fileSets>
+ <fileSet>
+ <directory>src/main/webapp</directory>
+ </fileSet>
+ </fileSets>
+ <files>
+ <file>
+ <source>README.md</source>
+ <outputDirectory>/</outputDirectory>
+ <filtered>true</filtered>
+ </file>
+ </files>
+</assembly>
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/src/main/config/checkstyle/checker.xml
----------------------------------------------------------------------
diff --git a/phoenix-tracing-webapp/src/main/config/checkstyle/checker.xml
b/phoenix-tracing-webapp/src/main/config/checkstyle/checker.xml
new file mode 100755
index 0000000..ecf3946
--- /dev/null
+++ b/phoenix-tracing-webapp/src/main/config/checkstyle/checker.xml
@@ -0,0 +1,281 @@
+<?xml version="1.0"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to you 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.
+-->
+
+<!--
+ This version of checkstyle is based on the Apache Calcite checkstyle
+ checkstyle configuration, which in turn is based on Giraph and Hadoop and
+ common-math configurations.
+
+ The documentation for checkstyle is available at
+
+ http://checkstyle.sourceforge.net
+-->
+
+<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.1//EN"
"http://www.puppycrawl.com/dtds/configuration_1_1.dtd">
+
+<!-- Calcite customization of default Checkstyle behavior -->
+<module name="Checker">
+ <property name="localeLanguage" value="en"/>
+
+ <!-- Checks for headers -->
+ <!-- See http://checkstyle.sf.net/config_header.html -->
+ <!-- Verify that EVERY source file has the appropriate license -->
+ <module name="Header">
+ <property name="headerFile" value="${checkstyle.header.file}"/>
+ </module>
+
+ <!-- Checks for Javadoc comments (checker). -->
+ <!-- See http://checkstyle.sf.net/config_javadoc.html -->
+ <!-- Require package javadoc -->
+ <module name="JavadocPackage"/>
+
+ <!-- Miscellaneous other checks (checker). -->
+ <!-- See http://checkstyle.sf.net/config_misc.html -->
+ <!-- Require files to end with newline characters -->
+ <module name="NewlineAtEndOfFile">
+ <property name="lineSeparator" value="lf"/>
+ </module>
+
+ <!-- Checks for whitespace (tree walker) -->
+ <!-- See http://checkstyle.sf.net/config_whitespace.html -->
+ <!-- No tabs allowed! -->
+ <module name="FileTabCharacter"/>
+
+ <module name="TreeWalker">
+ <property name="cacheFile" value="target/checkstyle-cachefile"/>
+
+ <!-- Checks for blocks. You know, those {}'s -->
+ <!-- See http://checkstyle.sf.net/config_blocks.html -->
+ <!-- No empty blocks (i.e. catch); must contain at least a comment -->
+ <module name="EmptyBlock">
+ <property name="option" value="text"/>
+ </module>
+ <module name="AvoidNestedBlocks">
+ <property name="allowInSwitchCase" value="true"/>
+ </module>
+ <module name="LeftCurly"/>
+ <!-- No if/else/do/for/while without braces -->
+ <module name="NeedBraces"/>
+ <module name="RightCurly"/>
+
+ <!-- Checks for class design -->
+ <!-- See http://checkstyle.sf.net/config_design.html -->
+ <!-- Utility class should not be instantiated, they must have a
+ private constructor -->
+ <module name="HideUtilityClassConstructor"/>
+
+ <!-- Checks for common coding problems -->
+ <!-- See http://checkstyle.sf.net/config_coding.html -->
+ <module name="EmptyStatement"/>
+ <!-- Require hash code override when equals is -->
+ <module name="EqualsHashCode"/>
+ <!-- Disallow unnecessary instantiation of Boolean, String -->
+ <module name="IllegalInstantiation">
+ <property name="classes" value="java.lang.Boolean, java.lang.String"/>
+ </module>
+ <!-- Switch statements should be complete and with independent cases -->
+ <module name="FallThrough"/>
+ <!-- For hadoop_yarn profile, some YARN exceptions aren't loading in
checkstyle -->
+ <module name="RedundantThrows">
+ <property name="suppressLoadErrors" value="true" />
+ </module>
+ <module name="SimplifyBooleanExpression"/>
+ <module name="SimplifyBooleanReturn"/>
+ <!-- Only one statement per line allowed -->
+ <module name="OneStatementPerLine"/>
+ <!-- Don't add up parentheses when they are not required -->
+ <module name="UnnecessaryParentheses" />
+ <!-- Don't use = or != for string comparisons -->
+ <module name="StringLiteralEquality" />
+ <!-- Don't declare multiple variables in the same statement -->
+ <module name="MultipleVariableDeclarations" />
+ <!-- String literals more than one character long should not be
+ repeated several times -->
+ <!-- the "unchecked" string is also accepted to allow
+ @SuppressWarnings("unchecked") -->
+ <!-- Disabling for now until we have a better ignoreStringsRegexp -->
+ <!--
+ <module name="MultipleStringLiterals" >
+ <property name="ignoreStringsRegexp"
value='^(("")|(".")|("unchecked"))$'/>
+ </module>
+ -->
+
+ <!-- Checks for imports -->
+ <!-- See http://checkstyle.sf.net/config_import.html -->
+ <module name="RedundantImport"/>
+ <!-- Import should be explicit, and only from pure java packages.
+ But we allow imports that are only used in javadoc. -->
+ <module name="UnusedImports">
+ <property name="processJavadoc" value="true"/>
+ </module>
+ <module name="IllegalImport" />
+ <module name="AvoidStarImport" />
+ <module name="ImportOrder">
+ <property name="groups"
value="java,javax,lib,shared,common,platform,org,com,io,net,scala,clover"/>
+ <property name="ordered" value="true"/>
+ <property name="separated" value="true"/>
+ <property name="option" value="bottom"/>
+ </module>
+
+ <!-- Checks for Javadoc comments (tree walker). -->
+ <!-- See http://checkstyle.sf.net/config_javadoc.html -->
+ <!-- Javadoc must be formatted correctly -->
+ <module name="JavadocStyle">
+ <property name="checkFirstSentence" value="false"/>
+ </module>
+ <!-- Must have class / interface header comments -->
+ <module name="JavadocType"/>
+
+ <!-- Miscellaneous other checks (tree walker). -->
+ <!-- See http://checkstyle.sf.net/config_misc.html -->
+ <!-- Java style arrays -->
+ <module name="ArrayTypeStyle"/>
+ <!-- Indentation -->
+ <module name="Indentation">
+ <property name="caseIndent" value="0"/>
+ <property name="basicOffset" value="4"/>
+ <property name="braceAdjustment" value="0"/>
+ </module>
+ <!-- Turn this on to see what needs to be done
+ <module name="TodoComment"/>
+ -->
+ <module name="UpperEll"/>
+
+ <module name="OperatorWrap"/>
+
+ <!-- Modifier Checks -->
+ <!-- See http://checkstyle.sf.net/config_modifiers.html -->
+ <!-- Use a consistent way to put modifiers -->
+ <module name="ModifierOrder"/>
+ <module name="RedundantModifier"/>
+
+ <!-- Checks for Naming Conventions. -->
+ <!-- See http://checkstyle.sf.net/config_naming.html -->
+ <!-- Constant names should obey the traditional all uppercase
+ naming convention -->
+ <module name="ConstantName"/>
+ <module name="LocalFinalVariableName">
+ <!-- Allow '_' except first. -->
+ <property name="format" value="^[a-z][a-zA-Z0-9_]*$"/>
+ </module>
+ <module name="LocalVariableName">
+ <!-- Allow '_' except first. -->
+ <property name="format" value="^[a-z][a-zA-Z0-9_]*$"/>
+ </module>
+ <module name="MemberName"/>
+ <module name="MethodName">
+ <!-- Allow trailing '_', signifying private methods.
+ Also allow '_' prefix, indicating disabled method or junit test. -->
+ <property name="format" value="^_?[a-z][a-zA-Z0-9]*_?$"/>
+ </module>
+ <module name="PackageName"/>
+ <module name="ParameterName">
+ <!-- Allow trailing '_'. -->
+ <property name="format" value="^[a-z][a-zA-Z0-9]*_?$"/>
+ </module>
+ <module name="StaticVariableName"/>
+ <module name="TypeName"/>
+
+ <!-- Checks for regexp expressions. -->
+ <!-- See http://checkstyle.sf.net/config_regexp.html -->
+
+ <!-- No trailing whitespace -->
+ <module name="Regexp">
+ <property name="format" value="[ \t]+$"/>
+ <property name="illegalPattern" value="true"/>
+ <property name="message" value="Trailing whitespace"/>
+ </module>
+
+ <!-- Authors should be in pom.xml file -->
+ <module name="Regexp">
+ <property name="format" value="@author"/>
+ <property name="illegalPattern" value="true"/>
+ <property name="message" value="developers names should be in pom file"/>
+ </module>
+
+ <!-- No multi-line C-style comments except at start of line. -->
+ <module name="Regexp">
+ <property name="format" value="^ +/\*[^*][^/]$"/>
+ <property name="illegalPattern" value="true"/>
+ <property name="message" value="C-style comment"/>
+ </module>
+
+ <module name="Regexp">
+ <property name="format" value="^ +/\*$"/>
+ <property name="illegalPattern" value="true"/>
+ <property name="message" value="C-style comment"/>
+ </module>
+
+ <!-- Checks for Size Violations. -->
+ <!-- See http://checkstyle.sf.net/config_sizes.html -->
+ <!-- Lines cannot exceed 100 chars, except if they are hyperlinks
+ or strings (possibly preceded by '+' and followed by say '),'. -->
+ <module name="LineLength">
+ <property name="max" value="100"/>
+ <property name="ignorePattern"
value="^import|@see|@link|@BaseMessage|href|^[ +]*".*"[);,]*$"/>
+ </module>
+ <!-- Over time, we will revise this down -->
+ <module name="MethodLength">
+ <property name="max" value="390"/>
+ </module>
+
+ <!-- Checks for whitespace (tree walker) -->
+ <!-- See http://checkstyle.sf.net/config_whitespace.html -->
+ <module name="EmptyForIteratorPad"/>
+ <!-- Spacing around methods -->
+ <module name="MethodParamPad">
+ <property name="option" value="nospace"/>
+ <property name="allowLineBreaks" value="true"/>
+ </module>
+ <!-- No whitespace before a token -->
+ <module name="NoWhitespaceBefore"/>
+ <!-- Whitespace after tokens is required -->
+ <module name="WhitespaceAfter"/>
+ <!-- Whitespace around tokens is required -->
+ <module name="WhitespaceAround">
+ <property name="allowEmptyConstructors" value="true"/>
+ <property name="allowEmptyMethods" value="true"/>
+ </module>
+ <module name="ParenPad"/>
+ <module name="TypecastParenPad"/>
+ <!-- No extra whitespace around types -->
+ <module name="GenericWhitespace"/>
+
+ <!-- Required for SuppressionCommentFilter below -->
+ <module name="FileContentsHolder"/>
+ </module>
+
+ <!-- Setup special comments to suppress specific checks from source files -->
+ <module name="SuppressionCommentFilter">
+ <property name="offCommentFormat" value="CHECKSTYLE\: stop ([\w\|]+)"/>
+ <property name="onCommentFormat" value="CHECKSTYLE\: resume ([\w\|]+)"/>
+ <property name="checkFormat" value="$1"/>
+ </module>
+
+ <!-- Turn off all checks between OFF and ON -->
+ <module name="SuppressionCommentFilter">
+ <property name="offCommentFormat" value="CHECKSTYLE\: OFF"/>
+ <property name="onCommentFormat" value="CHECKSTYLE\: ON"/>
+ </module>
+
+ <!-- Turn off checks for the next N lines. -->
+ <module name="SuppressWithNearbyCommentFilter">
+ <property name="commentFormat" value="CHECKSTYLE: +IGNORE (\d+)"/>
+ <property name="influenceFormat" value="$1"/>
+ </module>
+</module>
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/src/main/config/checkstyle/header.txt
----------------------------------------------------------------------
diff --git a/phoenix-tracing-webapp/src/main/config/checkstyle/header.txt
b/phoenix-tracing-webapp/src/main/config/checkstyle/header.txt
new file mode 100755
index 0000000..2a42971
--- /dev/null
+++ b/phoenix-tracing-webapp/src/main/config/checkstyle/header.txt
@@ -0,0 +1,16 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you 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.
+ */
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/src/main/config/checkstyle/suppressions.xml
----------------------------------------------------------------------
diff --git a/phoenix-tracing-webapp/src/main/config/checkstyle/suppressions.xml
b/phoenix-tracing-webapp/src/main/config/checkstyle/suppressions.xml
new file mode 100755
index 0000000..6662eca
--- /dev/null
+++ b/phoenix-tracing-webapp/src/main/config/checkstyle/suppressions.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!DOCTYPE suppressions PUBLIC
+ "-//Puppy Crawl//DTD Suppressions 1.1//EN"
+ "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to you 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.
+-->
+<suppressions>
+ <!-- Suppress checks on generated files. -->
+ <suppress checks="Header" files="CalciteResource.properties"/>
+ <suppress checks=".*" files="org-apache-calcite-jdbc.properties"/>
+ <suppress checks=".*" files="Foo.java"/>
+ <suppress checks=".*" files=".*/target/maven-archiver/pom.properties"/>
+ <suppress checks=".*" files="git.properties"/>
+ <suppress checks=".*" files="trace.properties"/>
+ <suppress checks=".*" files="release.properties"/>
+
+ <!-- This file triggers https://github.com/checkstyle/checkstyle/issues/92,
+ through no fault of its own. -->
+ <suppress checks=".*" files="SqlSimpleParser.java"/>
+
+ <!-- Don't complain about field names such as cust_id -->
+ <suppress checks=".*Name" files="JdbcExample.java"/>
+
+ <!-- Suppress JavadocPackage in the test packages -->
+ <suppress checks="JavadocPackage" files="src[/\\]test[/\\]java[/\\]"/>
+
+ <!-- And likewise in ubenchmark -->
+ <suppress checks="JavadocPackage" files="StatementTest.java"/>
+
+ <!-- Method names in Resource can have underscores -->
+ <suppress checks="MethodName" files="CalciteResource.java"/>
+</suppressions>
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/ConnectionFactory.java
----------------------------------------------------------------------
diff --git
a/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/ConnectionFactory.java
b/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/ConnectionFactory.java
new file mode 100644
index 0000000..b7a1df1
--- /dev/null
+++
b/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/ConnectionFactory.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.phoenix.tracingwebapp.http;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+/**
+*
+* ConnectionFactory is to handle database connection
+*
+*/
+public class ConnectionFactory {
+
+ private static Connection con;
+ //TODO : need to get port and host from configuration
+ protected static String PHOENIX_HOST = "localhost";
+ protected static int PHOENIX_PORT = 2181;
+
+ public static Connection getConnection() throws SQLException,
ClassNotFoundException {
+ if (con == null || con.isClosed()) {
+ Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
+ con =
DriverManager.getConnection("jdbc:phoenix:"+PHOENIX_HOST+":"+PHOENIX_PORT);
+ }
+ return con;
+ }
+}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/EntityFactory.java
----------------------------------------------------------------------
diff --git
a/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/EntityFactory.java
b/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/EntityFactory.java
new file mode 100644
index 0000000..afb6312
--- /dev/null
+++
b/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/EntityFactory.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you 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.apache.phoenix.tracingwebapp.http;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * EntityFactory is used to get results entities For SQL query
+ */
+public class EntityFactory {
+
+ private String queryString;
+ protected Connection connection;
+
+ public EntityFactory(Connection connection, String queryString) {
+ this.queryString = queryString;
+ this.connection = connection;
+ }
+
+ public Map<String, Object> findSingle(Object[] params) throws SQLException {
+ List<Map<String, Object>> objects = this.findMultiple(params);
+
+ if (objects.size() != 1) {
+ throw new SQLException("Query did not produce one object it produced: "
+ + objects.size() + " objects.");
+ }
+
+ Map<String, Object> object = objects.get(0); // get first record;
+
+ return object;
+ }
+
+ public List<Map<String, Object>> findMultiple(Object[] params)
+ throws SQLException {
+ ResultSet rs = null;
+ PreparedStatement ps = null;
+ try {
+ ps = this.connection.prepareStatement(this.queryString);
+ for (int i = 0; i < params.length; ++i) {
+ ps.setObject(1, params[i]);
+ }
+
+ rs = ps.executeQuery();
+ return getEntitiesFromResultSet(rs);
+ } catch (SQLException e) {
+ throw (e);
+ } finally {
+ if (rs != null) {
+ rs.close();
+ }
+ if (ps != null) {
+ ps.close();
+ }
+ }
+ }
+
+ protected static List<Map<String, Object>> getEntitiesFromResultSet(
+ ResultSet resultSet) throws SQLException {
+ ArrayList<Map<String, Object>> entities = new ArrayList<>();
+ while (resultSet.next()) {
+ entities.add(getEntityFromResultSet(resultSet));
+ }
+ return entities;
+ }
+
+ protected static Map<String, Object> getEntityFromResultSet(ResultSet
resultSet)
+ throws SQLException {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ int columnCount = metaData.getColumnCount();
+ Map<String, Object> resultsMap = new HashMap<>();
+ for (int i = 1; i <= columnCount; ++i) {
+ String columnName = metaData.getColumnName(i).toLowerCase();
+ Object object = resultSet.getObject(i);
+ resultsMap.put(columnName, object);
+ }
+ return resultsMap;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/Main.java
----------------------------------------------------------------------
diff --git
a/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/Main.java
b/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/Main.java
new file mode 100755
index 0000000..5875fc1
--- /dev/null
+++
b/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/Main.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you 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.apache.phoenix.tracingwebapp.http;
+
+import java.net.URL;
+import java.security.ProtectionDomain;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configured;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.util.Tool;
+import org.apache.hadoop.util.ToolRunner;
+import org.apache.log4j.BasicConfigurator;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+/**
+ * tracing web app runner
+ */
+public final class Main extends Configured implements Tool {
+
+ protected static final Log LOG = LogFactory.getLog(Main.class);
+ public static final String PHONIX_DBSERVER_PORT_KEY =
+ "phoenix.dbserver.port";
+ public static final int DEFAULT_DBSERVER_PORT = 2181;
+ public static final String PHONIX_DBSERVER_HOST_KEY =
+ "phoenix.dbserver.host";
+ public static final String DEFAULT_DBSERVER_HOST = "localhost";
+ public static final String TRACE_SERVER_HTTP_PORT_KEY =
+ "phoenix.traceserver.http.port";
+ public static final int DEFAULT_HTTP_PORT = 8864;
+ public static final String TRACE_SERVER_HTTP_JETTY_HOME_KEY =
+ "phoenix.traceserver.http.home";
+ public static final String DEFAULT_HTTP_HOME = "/";
+
+ public static void main(String[] args) throws Exception {
+ int ret = ToolRunner.run(HBaseConfiguration.create(), new Main(),
args);
+ System.exit(ret);
+ }
+
+ @Override
+ public int run(String[] arg0) throws Exception {
+ // logProcessInfo(getConf());
+ final int port = getConf().getInt(TRACE_SERVER_HTTP_PORT_KEY,
+ DEFAULT_HTTP_PORT);
+ BasicConfigurator.configure();
+ final String home = getConf().get(TRACE_SERVER_HTTP_JETTY_HOME_KEY,
+ DEFAULT_HTTP_HOME);
+ //setting up the embedded server
+ ProtectionDomain domain = Main.class.getProtectionDomain();
+ URL location = domain.getCodeSource().getLocation();
+ String webappDirLocation = location.toString().split("target")[0]
+"src/main/webapp";
+ Server server = new Server(port);
+ WebAppContext root = new WebAppContext();
+
+ root.setContextPath(home);
+ root.setDescriptor(webappDirLocation + "/WEB-INF/web.xml");
+ root.setResourceBase(webappDirLocation);
+ root.setParentLoaderPriority(true);
+ server.setHandler(root);
+
+ server.start();
+ server.join();
+ return 0;
+ }
+}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/TraceServlet.java
----------------------------------------------------------------------
diff --git
a/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/TraceServlet.java
b/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/TraceServlet.java
new file mode 100755
index 0000000..de047ba
--- /dev/null
+++
b/phoenix-tracing-webapp/src/main/java/org/apache/phoenix/tracingwebapp/http/TraceServlet.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you 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.apache.phoenix.tracingwebapp.http;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.codehaus.jackson.map.ObjectMapper;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * Server to show trace information
+ *
+ */
+public class TraceServlet extends HttpServlet {
+
+ private static final long serialVersionUID = -354285100083055559L;
+ private static Connection con;
+ protected String DEFAULT_LIMIT = "25";
+ protected String DEFAULT_COUNTBY = "hostname";
+ protected String LOGIC_AND = "AND";
+ protected String LOGIC_OR = "OR";
+ protected String TRACING_TABLE = "SYSTEM.TRACING_STATS";
+
+
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse
response)
+ throws ServletException, IOException {
+
+ //reading url params
+ String action = request.getParameter("action");
+ String limit = request.getParameter("limit");
+ String traceid = request.getParameter("traceid");
+ String parentid = request.getParameter("parentid");
+ String jsonObject = "{}";
+ if ("getall".equals(action)) {
+ jsonObject = getAll(limit);
+ } else if ("getCount".equals(action)) {
+ jsonObject = getCount("description");
+ } else if ("getDistribution".equals(action)) {
+ jsonObject = getCount(DEFAULT_COUNTBY);
+ } else if ("searchTrace".equals(action)) {
+ jsonObject = searchTrace(parentid, traceid, LOGIC_OR);
+ } else {
+ jsonObject = "{ \"Server\": \"Phoenix Tracing Web App\", \"API
version\": 0.1 }";
+ }
+ //response send as json
+ response.setContentType("application/json");
+ String output = jsonObject;
+ PrintWriter out = response.getWriter();
+ out.print(output);
+ out.flush();
+ }
+
+ //get all trace results with limit count
+ protected String getAll(String limit) {
+ String json = null;
+ if(limit == null) {
+ limit = DEFAULT_LIMIT;
+ }
+ String sqlQuery = "SELECT * FROM " + TRACING_TABLE + " LIMIT "+limit;
+ json = getResults(sqlQuery);
+ return getJson(json);
+ }
+
+ //get count on traces can pick on param to count
+ protected String getCount(String countby) {
+ String json = null;
+ if(countby == null) {
+ countby = DEFAULT_COUNTBY;
+ }
+ String sqlQuery = "SELECT "+countby+", COUNT(*) AS count FROM " +
TRACING_TABLE + " GROUP BY "+countby+" HAVING COUNT(*) > 1 ";
+ json = getResults(sqlQuery);
+ return json;
+ }
+
+ //search the trace over parent id or trace id
+ protected String searchTrace(String parentId, String traceId,String logic) {
+ String json = null;
+ String query = null;
+ if(parentId != null && traceId != null) {
+ query = "SELECT * FROM " + TRACING_TABLE + " WHERE
parent_id="+parentId+" "+logic+" trace_id="+traceId;
+ }else if (parentId != null && traceId == null) {
+ query = "SELECT * FROM " + TRACING_TABLE + " WHERE parent_id="+parentId;
+ }else if(parentId == null && traceId != null) {
+ query = "SELECT * FROM " + TRACING_TABLE + " WHERE trace_id="+traceId;
+ }
+ json = getResults(query);
+ return getJson(json);
+ }
+
+ //return json string
+ protected String getJson(String json) {
+ String output = json.toString().replace("_id\":", "_id\":\"")
+ .replace(",\"hostname", "\",\"hostname")
+ .replace(",\"parent", "\",\"parent")
+ .replace(",\"end", "\",\"end");
+ return output;
+ }
+
+ //get results with passing sql query
+ protected String getResults(String sqlQuery) {
+ String json = null;
+ if(sqlQuery == null){
+ json = "{error:true,msg:'SQL was null'}";
+ }else{
+ try {
+ con = ConnectionFactory.getConnection();
+ EntityFactory nutrientEntityFactory = new EntityFactory(con,sqlQuery);
+ List<Map<String, Object>> nutrients = nutrientEntityFactory
+ .findMultiple(new Object[] {});
+ ObjectMapper mapper = new ObjectMapper();
+ json = mapper.writeValueAsString(nutrients);
+ } catch (Exception e) {
+ json = "{error:true,msg:'Serrver Error:"+e.getMessage()+"'}";
+ } finally {
+ if (con != null) {
+ try {
+ con.close();
+ } catch (SQLException e) {
+ json = "{error:true,msg:'SQL Serrver Error:"+e.getMessage()+"'}";
+ }
+ }
+ }
+ }
+ return json;
+ }
+}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/phoenix-tracing-webapp/src/main/webapp/WEB-INF/web.xml
b/phoenix-tracing-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100755
index 0000000..ed4ced2
--- /dev/null
+++ b/phoenix-tracing-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ version="2.5">
+ <servlet>
+ <servlet-name>Trace</servlet-name>
+
<servlet-class>org.apache.phoenix.tracingwebapp.http.TraceServlet</servlet-class>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>Trace</servlet-name>
+ <url-pattern>/trace/*</url-pattern>
+ </servlet-mapping>
+</web-app>
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/phoenix-tracing-webapp/src/main/webapp/index.html
----------------------------------------------------------------------
diff --git a/phoenix-tracing-webapp/src/main/webapp/index.html
b/phoenix-tracing-webapp/src/main/webapp/index.html
new file mode 100755
index 0000000..7f131fc
--- /dev/null
+++ b/phoenix-tracing-webapp/src/main/webapp/index.html
@@ -0,0 +1,16 @@
+<html>
+
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="description" content="Phoenix Tracing WebApp">
+ <meta name="author" content="nishani">
+ <title>Phoenix Tracing WebApp</title>
+ </head>
+
+ <body>
+ <h1>Phoenix Tracing Web App</h1>
+ </body>
+
+</html>
http://git-wip-us.apache.org/repos/asf/phoenix/blob/59391683/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index e22b526..fbe12b9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,6 +31,7 @@
<module>phoenix-pherf</module>
<module>phoenix-spark</module>
<module>phoenix-assembly</module>
+ <module>phoenix-tracing-webapp</module>
</modules>
<repositories>
@@ -110,6 +111,7 @@
<jodatime.version>2.7</jodatime.version>
<joni.version>2.1.2</joni.version>
<calcite.version>1.3.0-incubating</calcite.version>
+ <jettyVersion>8.1.7.v20120910</jettyVersion>
<!-- Test Dependencies -->
<mockito-all.version>1.8.5</mockito-all.version>