You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jx...@apache.org on 2016/01/11 17:13:39 UTC

hive git commit: HIVE-12761: Add stack trace servlet to HS2 web ui (Shinichi Yamashita via Jimmy Xiang)

Repository: hive
Updated Branches:
  refs/heads/master 358691a43 -> 104dc3195


HIVE-12761: Add stack trace servlet to HS2 web ui (Shinichi Yamashita via Jimmy Xiang)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/104dc319
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/104dc319
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/104dc319

Branch: refs/heads/master
Commit: 104dc3195f99dd9a339679c467b7b1153d7edb44
Parents: 358691a
Author: Jimmy Xiang <jx...@apache.org>
Authored: Mon Jan 11 08:08:43 2016 -0800
Committer: Jimmy Xiang <jx...@apache.org>
Committed: Mon Jan 11 08:10:00 2016 -0800

----------------------------------------------------------------------
 .../java/org/apache/hive/http/HttpServer.java   |   1 +
 .../java/org/apache/hive/http/StackServlet.java | 103 +++++++++++++++++++
 .../hive-webapps/hiveserver2/hiveserver2.jsp    |   1 +
 .../hive/service/server/TestHS2HttpServer.java  |  73 +++++++++++++
 4 files changed, 178 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/104dc319/common/src/java/org/apache/hive/http/HttpServer.java
----------------------------------------------------------------------
diff --git a/common/src/java/org/apache/hive/http/HttpServer.java b/common/src/java/org/apache/hive/http/HttpServer.java
index 68730af..9e23b11 100644
--- a/common/src/java/org/apache/hive/http/HttpServer.java
+++ b/common/src/java/org/apache/hive/http/HttpServer.java
@@ -372,6 +372,7 @@ public class HttpServer {
 
     addServlet("jmx", "/jmx", JMXJsonServlet.class);
     addServlet("conf", "/conf", ConfServlet.class);
+    addServlet("stacks", "/stacks", StackServlet.class);
 
     ServletContextHandler staticCtx =
       new ServletContextHandler(contexts, "/static");

http://git-wip-us.apache.org/repos/asf/hive/blob/104dc319/common/src/java/org/apache/hive/http/StackServlet.java
----------------------------------------------------------------------
diff --git a/common/src/java/org/apache/hive/http/StackServlet.java b/common/src/java/org/apache/hive/http/StackServlet.java
new file mode 100644
index 0000000..610b391
--- /dev/null
+++ b/common/src/java/org/apache/hive/http/StackServlet.java
@@ -0,0 +1,103 @@
+/**
+ * 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.hive.http;
+
+import java.io.IOException;
+import java.io.PrintStream;
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * A servlet to print out the current stack traces.
+ */
+public class StackServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+  private static ThreadMXBean threadBean =
+      ManagementFactory.getThreadMXBean();
+
+  @Override
+  public void doGet(HttpServletRequest request, HttpServletResponse response)
+    throws ServletException, IOException {
+    if (!HttpServer.isInstrumentationAccessAllowed(getServletContext(),
+        request, response)) {
+      return;
+    }
+    response.setContentType("text/plain; charset=UTF-8");
+    try (PrintStream out = new PrintStream(
+        response.getOutputStream(), false, "UTF-8")) {
+      printThreadInfo(out, "");
+    }
+  }
+
+  /**
+   * Print all of the thread's information and stack traces.
+   *
+   * @param stream the stream to
+   * @param title a string title for the stack trace
+   */
+  private synchronized void printThreadInfo(
+      PrintStream stream, String title) {
+    final int STACK_DEPTH = 20;
+    boolean contention = threadBean.isThreadContentionMonitoringEnabled();
+    long[] threadIds = threadBean.getAllThreadIds();
+    stream.println("Process Thread Dump: " + title);
+    stream.println(threadIds.length + " active threads");
+    for (long tid : threadIds) {
+      ThreadInfo info = threadBean.getThreadInfo(tid, STACK_DEPTH);
+      if (info == null) {
+        stream.println("  Inactive");
+        continue;
+      }
+      stream.println("Thread " +
+          getTaskName(info.getThreadId(), info.getThreadName()) + ":");
+      Thread.State state = info.getThreadState();
+      stream.println("  State: " + state);
+      stream.println("  Blocked count: " + info.getBlockedCount());
+      stream.println("  Wtaited count: " + info.getWaitedCount());
+      if (contention) {
+        stream.println("  Blocked time: " + info.getBlockedTime());
+        stream.println("  Waited time: " + info.getWaitedTime());
+      }
+      if (state == Thread.State.WAITING) {
+        stream.println("  Waiting on " + info.getLockName());
+      } else if (state == Thread.State.BLOCKED) {
+        stream.println("  Blocked on " + info.getLockName());
+        stream.println("  Blocked by " +
+            getTaskName(info.getLockOwnerId(), info.getLockOwnerName()));
+      }
+      stream.println("  Stack:");
+      for (StackTraceElement frame : info.getStackTrace()) {
+        stream.println("    " + frame.toString());
+      }
+    }
+    stream.flush();
+  }
+
+  private String getTaskName(long id, String name) {
+    if (name == null) {
+      return Long.toString(id);
+    }
+    return id + " (" + name + ")";
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/104dc319/service/src/resources/hive-webapps/hiveserver2/hiveserver2.jsp
----------------------------------------------------------------------
diff --git a/service/src/resources/hive-webapps/hiveserver2/hiveserver2.jsp b/service/src/resources/hive-webapps/hiveserver2/hiveserver2.jsp
index 4fad63c..0b437dd 100644
--- a/service/src/resources/hive-webapps/hiveserver2/hiveserver2.jsp
+++ b/service/src/resources/hive-webapps/hiveserver2/hiveserver2.jsp
@@ -70,6 +70,7 @@ SessionManager sessionManager =
                 <li><a href="/logs/">Local logs</a></li>
                 <li><a href="/jmx">Metrics Dump</a></li>
                 <li><a href="/conf">Hive Configuration</a></li>
+                <li><a href="/stacks">Stack Trace</a></li>
             </ul>
           </div><!--/.nav-collapse -->
         </div>

http://git-wip-us.apache.org/repos/asf/hive/blob/104dc319/service/src/test/org/apache/hive/service/server/TestHS2HttpServer.java
----------------------------------------------------------------------
diff --git a/service/src/test/org/apache/hive/service/server/TestHS2HttpServer.java b/service/src/test/org/apache/hive/service/server/TestHS2HttpServer.java
new file mode 100644
index 0000000..c06ea26
--- /dev/null
+++ b/service/src/test/org/apache/hive/service/server/TestHS2HttpServer.java
@@ -0,0 +1,73 @@
+/**
+ * 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.hive.service.server;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * TestHS2HttpServer -- executes tests of HiveServer2 HTTP Server
+ */
+public class TestHS2HttpServer {
+
+  private static HiveServer2 hiveServer2 = null;
+
+  @BeforeClass
+  public static void beforeTests() throws Exception {
+    HiveConf hiveConf = new HiveConf();
+    hiveConf.setBoolVar(ConfVars.HIVE_IN_TEST, false);
+    hiveServer2 = new HiveServer2();
+    hiveServer2.init(hiveConf);
+    hiveServer2.start();
+    Thread.sleep(5000);
+  }
+
+  @Test
+  public void testStackServket() throws Exception {
+    String baseURL = "http://localhost:"
+      + ConfVars.HIVE_SERVER2_WEBUI_PORT.getDefaultValue() + "/stacks";
+    URL url = new URL(baseURL);
+    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+    Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode());
+    BufferedReader reader =
+        new BufferedReader(new InputStreamReader(conn.getInputStream()));
+    boolean contents = false;
+    String line;
+    while ((line = reader.readLine()) != null) {
+      if (line.contains("Process Thread Dump:")) {
+        contents = true;
+      }
+    }
+    Assert.assertTrue(contents);
+  }
+
+  @AfterClass
+  public static void afterTests() throws Exception {
+    hiveServer2.stop();
+  }
+}