You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 10:24:13 UTC

[sling-org-apache-sling-tracer] 13/30: SLING-5459 - Recording of tracer logs

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

rombert pushed a commit to annotated tag org.apache.sling.tracer-1.0.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tracer.git

commit bdc2fb698d5e125cc0d403f9376ad1dedf452fc0
Author: Chetan Mehrotra <ch...@apache.org>
AuthorDate: Wed Feb 10 05:52:55 2016 +0000

    SLING-5459 - Recording of tracer logs
    
    Changed the storage to byte[] instead of string. This would further reduce the memory footprint of the recording
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/tracer@1729532 13f79535-47bb-0310-9956-ffa450edef68
---
 pom.xml                                            |  6 ++++
 .../sling/tracer/internal/JSONRecording.java       | 37 ++++++++++++++++++----
 .../sling/tracer/internal/TracerLogServlet.java    |  5 +--
 .../tracer/internal/TracerLogServletTest.java      | 22 +++++++++++--
 4 files changed, 58 insertions(+), 12 deletions(-)

diff --git a/pom.xml b/pom.xml
index 2918dd9..1a0bf46 100644
--- a/pom.xml
+++ b/pom.xml
@@ -121,6 +121,12 @@
       <version>4.2.0</version>
     </dependency>
     <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>1.4</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.commons.json</artifactId>
       <version>2.0.8</version>
diff --git a/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java b/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
index cf1cea3..a7b29d9 100644
--- a/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
+++ b/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
@@ -19,9 +19,16 @@
 
 package org.apache.sling.tracer.internal;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
+import java.io.Reader;
 import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -30,6 +37,7 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 
 import ch.qos.logback.classic.Level;
+import org.apache.commons.io.IOUtils;
 import org.apache.sling.api.request.RequestProgressTracker;
 import org.apache.sling.commons.json.JSONException;
 import org.apache.sling.commons.json.io.JSONWriter;
@@ -45,16 +53,25 @@ class JSONRecording implements Recording {
     private final List<String> queries = new ArrayList<String>();
     private final List<LogEntry> logs = new ArrayList<LogEntry>();
     private RequestProgressTracker tracker;
-    private String json;
+    private byte[] json;
 
     public JSONRecording(String requestId, HttpServletRequest r) {
         this.requestId = requestId;
         this.method = r.getMethod();
     }
 
-    public boolean render(Writer pw) throws IOException {
+    public boolean render(Writer w) throws IOException {
         if (json != null) {
-            pw.write(json);
+            Reader r = new InputStreamReader(new ByteArrayInputStream(json), "UTF-8");
+            IOUtils.copy(r, w);
+            return true;
+        }
+        return false;
+    }
+
+    public boolean render(OutputStream os) throws IOException {
+        if (json != null) {
+            os.write(json);
             return true;
         }
         return false;
@@ -91,12 +108,17 @@ class JSONRecording implements Recording {
             }
         } catch (JSONException e) {
             log.warn("Error occurred while converting the log data for request {} to JSON", requestId, e);
+        } catch (UnsupportedEncodingException e) {
+            log.warn("Error occurred while converting the log data for request {} to JSON", requestId, e);
+        } catch (IOException e) {
+            log.warn("Error occurred while converting the log data for request {} to JSON", requestId, e);
         }
     }
 
-    private String toJSON() throws JSONException {
-        StringWriter sw = new StringWriter();
-        JSONWriter jw = new JSONWriter(sw);
+    private byte[] toJSON() throws JSONException, IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        OutputStreamWriter osw = new OutputStreamWriter(baos, "UTF-8");
+        JSONWriter jw = new JSONWriter(osw);
         jw.setTidy(true);
         jw.object();
         jw.key("method").value(method);
@@ -121,7 +143,8 @@ class JSONRecording implements Recording {
 
         addJson(jw, "logs", logs);
         jw.endObject();
-        return sw.toString();
+        osw.flush();
+        return baos.toByteArray();
     }
 
     private void addJson(JSONWriter jw, String name, List<? extends JsonEntry> entries) throws JSONException {
diff --git a/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java b/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java
index 2684f40..ae9d1b8 100644
--- a/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java
+++ b/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java
@@ -67,8 +67,8 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde
 
     @Override
     protected void renderContent(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-        final PrintWriter pw = response.getWriter();
         if (isHtmlRequest(request)){
+            PrintWriter pw = response.getWriter();
             renderStatus(pw);
             renderRequests(pw);
         } else {
@@ -79,11 +79,12 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde
                 if (requestId != null) {
                     JSONRecording recording = cache.getIfPresent(requestId);
                     if (recording != null){
-                        responseDone = recording.render(pw);
+                        responseDone = recording.render(response.getOutputStream());
                     }
                 }
 
                 if (!responseDone) {
+                    PrintWriter pw = response.getWriter();
                     JSONWriter jw = new JSONWriter(pw);
                     jw.object();
                     jw.key("error").value("Not found");
diff --git a/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java b/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java
index 5514dd1..7866544 100644
--- a/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java
+++ b/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java
@@ -19,9 +19,12 @@
 
 package org.apache.sling.tracer.internal;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -102,12 +105,12 @@ public class TracerLogServletTest {
         verify(response).setHeader(TracerLogServlet.HEADER_TRACER_PROTOCOL_VERSION,
                 String.valueOf(TracerLogServlet.TRACER_PROTOCOL_VERSION));
 
-        StringWriter sw = new StringWriter();
-        when(response.getWriter()).thenReturn(new PrintWriter(sw));
+        ByteArrayServletOutputStream sos = new ByteArrayServletOutputStream();
+        when(response.getOutputStream()).thenReturn(sos);
         when(request.getRequestURI()).thenReturn("/system/console/" + requestIdCaptor.getValue() + ".json" );
 
         logServlet.renderContent(request, response);
-        JSONObject json = new JSONObject(sw.toString());
+        JSONObject json = new JSONObject(sos.baos.toString("UTF-8"));
         assertEquals("GET", json.getString("method"));
         assertEquals(2, json.getJSONArray("requestProgressLogs").length());
     }
@@ -123,4 +126,17 @@ public class TracerLogServletTest {
 
         assertThat(sw.toString(), containsString("Log Tracer"));
     }
+
+    private static class ByteArrayServletOutputStream extends ServletOutputStream {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        @Override
+        public void write(int b) throws IOException {
+            baos.write(b);
+        }
+
+        @Override
+        public void write(byte[] b, int off, int len) throws IOException {
+            baos.write(b, off, len);
+        }
+    }
 }

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.