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

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

commit a040126226cc61c6b44d073e37b710164be73a12
Author: sky76093016 <[email protected]>
AuthorDate: Thu Mar 18 10:32:25 2021 +0800

    HDDS-4984. Support async profiler 2.0 (#2048)
---
 .../hadoop/hdds/server/http/ProfileServlet.java    | 47 +++++++++++++++-------
 .../hdds/server/http/TestProfileServlet.java       |  9 ++++-
 2 files changed, 41 insertions(+), 15 deletions(-)

diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/ProfileServlet.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/ProfileServlet.java
index 02e00fd..56c4f78 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/ProfileServlet.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/ProfileServlet.java
@@ -46,20 +46,33 @@ import org.slf4j.LoggerFactory;
  * Source: https://github.com/apache/hive/blob/master/common/src/java/org
  * /apache/hive/http/ProfileServlet.java
  * <p>
- * Following options from async-profiler can be specified as query paramater.
+ * Following options from async-profiler can be specified as query parameter.
  * //  -e event          profiling event: cpu|alloc|lock|cache-misses etc.
- * //  -d duration       run profiling for <duration> seconds (integer)
- * //  -i interval       sampling interval in nanoseconds (long)
- * //  -j jstackdepth    maximum Java stack depth (integer)
- * //  -b bufsize        frame buffer size (long)
+ * //  -d duration       run profiling for <duration> seconds
+ * //  -f filename       dump output to <filename>
+ * //  -i interval       sampling interval in nanoseconds
+ * //  -j jstackdepth    maximum Java stack depth
  * //  -t                profile different threads separately
  * //  -s                simple class names instead of FQN
- * //  -o fmt[,fmt...]   output format:
- * summary|traces|flat|collapsed|svg|tree|jfr
- * //  --width px        SVG width pixels (integer)
- * //  --height px       SVG frame height pixels (integer)
- * //  --minwidth px     skip frames smaller than px (double)
+ * //  -g                print method signatures
+ * //  -a                annotate Java method names
+ * //  -o fmt            output format:
+ * flat|traces|collapsed|flamegraph|tree|jfr
+ * //  -I include        output only stack traces
+ * containing the specified pattern
+ * //  -X exclude        exclude stack traces with the specified pattern
+ * //  -v, --version     display version string
+ * //  --title string    FlameGraph title
+ * //  --minwidth pct    skip frames smaller than pct%
  * //  --reverse         generate stack-reversed FlameGraph / Call tree
+ * //  --alloc bytes     allocation profiling interval in bytes
+ * //  --lock duration   lock profiling threshold in nanoseconds
+ * //  --total           accumulate the total value (time, bytes, etc.)
+ * //  --all-user        only include user-mode events
+ * //  --cstack mode     how to traverse C stack: fp|lbr|no
+ * //  --begin function  begin profiling when function is executed
+ * //  --end function    end profiling when function is executed
+ * //  --ttsp            time-to-safepoint profiling
  * Example:
  * - To collect 30 second CPU profile of current process (returns FlameGraph
  * svg)
@@ -174,10 +187,13 @@ public class ProfileServlet extends HttpServlet {
   @VisibleForTesting
   protected static String generateFileName(Integer pid, Output output,
       Event event) {
+    String outputFormat = output.name().toLowerCase();
+    if(output == Output.FLAMEGRAPH) {
+      outputFormat = "html";
+    }
     return FILE_PREFIX + pid + "-" +
         event.name().toLowerCase() + "-" + ID_GEN.incrementAndGet()
-        + "." +
-        output.name().toLowerCase();
+        + "." + outputFormat;
   }
 
   @VisibleForTesting
@@ -365,7 +381,9 @@ public class ProfileServlet extends HttpServlet {
           "This page will auto-refresh every 2 second until output file is "
               + "ready..");
     } else {
-      if (safeFileName.endsWith(".svg")) {
+      if (safeFileName.endsWith(".html")) {
+        resp.setContentType("text/html");
+      } else if (safeFileName.endsWith(".svg")) {
         resp.setContentType("image/svg+xml");
       } else if (safeFileName.endsWith(".tree")) {
         resp.setContentType("text/html");
@@ -500,7 +518,8 @@ public class ProfileServlet extends HttpServlet {
     COLLAPSED,
     SVG,
     TREE,
-    JFR
+    JFR,
+    FLAMEGRAPH
   }
 
 }
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/http/TestProfileServlet.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/http/TestProfileServlet.java
index 8890c1c..a7fcba4 100644
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/http/TestProfileServlet.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/http/TestProfileServlet.java
@@ -32,8 +32,9 @@ public class TestProfileServlet {
   @Test
   public void testNameValidation() throws IOException {
     ProfileServlet.validateFileName(
+        ProfileServlet.generateFileName(1, Output.FLAMEGRAPH, Event.ALLOC));
+    ProfileServlet.validateFileName(
         ProfileServlet.generateFileName(1, Output.SVG, Event.ALLOC));
-
     ProfileServlet.validateFileName(
         ProfileServlet.generateFileName(23, Output.COLLAPSED,
             Event.L1_DCACHE_LOAD_MISSES));
@@ -42,12 +43,18 @@ public class TestProfileServlet {
   @Test(expected = IllegalArgumentException.class)
   public void testNameValidationWithNewLine() throws IOException {
     ProfileServlet.validateFileName(
+        "test\n" + ProfileServlet.generateFileName(1, Output.FLAMEGRAPH,
+            Event.ALLOC));
+    ProfileServlet.validateFileName(
         "test\n" + ProfileServlet.generateFileName(1, Output.SVG, 
Event.ALLOC));
   }
 
   @Test(expected = IllegalArgumentException.class)
   public void testNameValidationWithSlash() throws IOException {
     ProfileServlet.validateFileName(
+        "../" + ProfileServlet.generateFileName(1, Output.FLAMEGRAPH,
+            Event.ALLOC));
+    ProfileServlet.validateFileName(
         "../" + ProfileServlet.generateFileName(1, Output.SVG, Event.ALLOC));
   }
 

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to