This is an automated email from the ASF dual-hosted git repository.

abstractdog pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 521c5fdeea2 HIVE-28305: ProfileServlet: add html to output formats and 
prepare for profiler 3.0 (#5281) (Laszlo Bodor reviewed by Denys Kuzmenko, 
Ayush Saxena, Kokila N)
521c5fdeea2 is described below

commit 521c5fdeea2d07f7bb10dd18b489c0669d051068
Author: Bodor Laszlo <[email protected]>
AuthorDate: Thu Jun 6 14:41:30 2024 +0200

    HIVE-28305: ProfileServlet: add html to output formats and prepare for 
profiler 3.0 (#5281) (Laszlo Bodor reviewed by Denys Kuzmenko, Ayush Saxena, 
Kokila N)
---
 .../java/org/apache/hive/http/ProfileServlet.java  | 35 +++++++++++++++-------
 1 file changed, 25 insertions(+), 10 deletions(-)

diff --git a/common/src/java/org/apache/hive/http/ProfileServlet.java 
b/common/src/java/org/apache/hive/http/ProfileServlet.java
index c2ff2712938..c1260e4a3fd 100644
--- a/common/src/java/org/apache/hive/http/ProfileServlet.java
+++ b/common/src/java/org/apache/hive/http/ProfileServlet.java
@@ -17,6 +17,9 @@ package org.apache.hive.http;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
@@ -45,19 +48,19 @@ import com.google.common.base.Joiner;
  * //  -m method         fully qualified method name: 'ClassName.methodName'
  * //  -t                profile different threads separately
  * //  -s                simple class names instead of FQN
- * //  -o fmt[,fmt...]   output format: 
summary|traces|flat|collapsed|svg|tree|jfr
+ * //  -o fmt[,fmt...]   output format: 
summary|traces|flat|collapsed|svg|tree|jfr|html
  * //  --width px        SVG width pixels (integer)
  * //  --height px       SVG frame height pixels (integer)
  * //  --minwidth px     skip frames smaller than px (double)
  * //  --reverse         generate stack-reversed FlameGraph / Call tree
  * Example:
- * - To collect 30 second CPU profile of current process (returns FlameGraph 
svg)
+ * - To collect 10 second CPU profile of current process (returns FlameGraph 
html)
  * curl "http://localhost:10002/prof";
  * - To collect 1 minute CPU profile of current process and output in tree 
format (html)
  * curl "http://localhost:10002/prof?output=tree&amp;duration=60";
- * - To collect 30 second heap allocation profile of current process (returns 
FlameGraph svg)
+ * - To collect 10 second heap allocation profile of current process (returns 
FlameGraph html)
  * curl "http://localhost:10002/prof?event=alloc";
- * - To collect lock contention profile of current process (returns FlameGraph 
svg)
+ * - To collect lock contention profile of current process (returns FlameGraph 
html)
  * curl "http://localhost:10002/prof?event=lock";
  * Following event types are supported (default is 'cpu') (NOTE: not all OS'es 
support all events)
  * // Perf events:
@@ -89,7 +92,6 @@ public class ProfileServlet extends HttpServlet {
   private static final String CONTENT_TYPE_TEXT = "text/plain; charset=utf-8";
   private static final String ASYNC_PROFILER_HOME_ENV = "ASYNC_PROFILER_HOME";
   private static final String ASYNC_PROFILER_HOME_SYSTEM_PROPERTY = 
"async.profiler.home";
-  private static final String PROFILER_SCRIPT = "/profiler.sh";
   private static final int DEFAULT_DURATION_SECONDS = 10;
   private static final AtomicInteger ID_GEN = new AtomicInteger(0);
   static final String OUTPUT_DIR = System.getProperty("java.io.tmpdir") + 
"/prof-output";
@@ -141,7 +143,8 @@ public class ProfileServlet extends HttpServlet {
     COLLAPSED,
     SVG,
     TREE,
-    JFR
+    JFR,
+    HTML
   }
 
   private Lock profilerLock = new ReentrantLock();
@@ -213,7 +216,7 @@ public class ProfileServlet extends HttpServlet {
               (method == null ? event.name().toLowerCase() : method) + "-" + 
ID_GEN.incrementAndGet() + "." +
               output.name().toLowerCase());
             List<String> cmd = new ArrayList<>();
-            cmd.add(asyncProfilerHome + PROFILER_SCRIPT);
+            cmd.add(getProfilerScriptPath());
             cmd.add("-e");
             cmd.add(method == null ? event.getInternalName() : method);
             cmd.add("-d");
@@ -293,6 +296,16 @@ public class ProfileServlet extends HttpServlet {
     }
   }
 
+  /**
+   * Get the path of the profiler script to be executed.
+   * Before async-profiler 3.0, the script was named profiler.sh, and after 
3.0 it's bin/asprof
+   * @return
+   */
+  private String getProfilerScriptPath() {
+    Path defaultPath = Paths.get(asyncProfilerHome + "/bin/asprof");
+    return Files.exists(defaultPath)? defaultPath.toString() : 
asyncProfilerHome + "/profiler.sh";
+  }
+
   private Integer getInteger(final HttpServletRequest req, final String param, 
final Integer defaultValue) {
     final String value = req.getParameter(param);
     if (value != null) {
@@ -340,14 +353,16 @@ public class ProfileServlet extends HttpServlet {
 
   private Output getOutput(final HttpServletRequest req) {
     final String outputArg = req.getParameter("output");
+    String outputFormat = outputArg.trim().toUpperCase();
     if (req.getParameter("output") != null) {
       try {
-        return Output.valueOf(outputArg.trim().toUpperCase());
+        return Output.valueOf(outputFormat);
       } catch (IllegalArgumentException e) {
-        return Output.SVG;
+        LOG.warn("Output format value '{}' is invalid, returning with default 
HTML", outputFormat);
+        return Output.HTML;
       }
     }
-    return Output.SVG;
+    return Output.HTML;
   }
 
   private void setResponseHeader(final HttpServletResponse response) {

Reply via email to