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:15 UTC

[sling-org-apache-sling-tracer] 15/30: SLING-5504 - Reduce memory footprint of stored recording data

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 0f98bb63d7c02081907b939f2216a45f05562afe
Author: Chetan Mehrotra <ch...@apache.org>
AuthorDate: Wed Feb 10 05:53:31 2016 +0000

    SLING-5504 - Reduce memory footprint of stored recording data
    
    Enable compression for in memory json data
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/tracer@1729534 13f79535-47bb-0310-9956-ffa450edef68
---
 .../sling/tracer/internal/JSONRecording.java       | 26 ++++++++++++++++++----
 .../sling/tracer/internal/TracerLogServlet.java    |  4 +++-
 .../sling/tracer/internal/JSONRecordingTest.java   |  6 ++---
 .../sling/tracer/internal/LogTracerTest.java       | 10 +++++++++
 4 files changed, 38 insertions(+), 8 deletions(-)

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 592477b..507d130 100644
--- a/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
+++ b/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
@@ -22,6 +22,7 @@ package org.apache.sling.tracer.internal;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
@@ -33,6 +34,8 @@ import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -51,20 +54,22 @@ class JSONRecording implements Recording {
     private final String method;
     private final String requestId;
     private final String uri;
+    private final boolean compress;
     private final List<String> queries = new ArrayList<String>();
     private final List<LogEntry> logs = new ArrayList<LogEntry>();
     private RequestProgressTracker tracker;
     private byte[] json;
 
-    public JSONRecording(String requestId, HttpServletRequest r) {
+    public JSONRecording(String requestId, HttpServletRequest r, boolean compress) {
         this.requestId = requestId;
+        this.compress = compress;
         this.method = r.getMethod();
         this.uri = r.getRequestURI();
     }
 
     public boolean render(Writer w) throws IOException {
         if (json != null) {
-            Reader r = new InputStreamReader(new ByteArrayInputStream(json), "UTF-8");
+            Reader r = new InputStreamReader(getInputStream(), "UTF-8");
             IOUtils.copy(r, w);
             return true;
         }
@@ -73,7 +78,7 @@ class JSONRecording implements Recording {
 
     public boolean render(OutputStream os) throws IOException {
         if (json != null) {
-            os.write(json);
+            IOUtils.copyLarge(getInputStream(), os);
             return true;
         }
         return false;
@@ -130,7 +135,11 @@ class JSONRecording implements Recording {
 
     private byte[] toJSON() throws JSONException, IOException {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        OutputStreamWriter osw = new OutputStreamWriter(baos, "UTF-8");
+        OutputStream os = baos;
+        if (compress) {
+            os = new GZIPOutputStream(os);
+        }
+        OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");
         JSONWriter jw = new JSONWriter(osw);
         jw.setTidy(true);
         jw.object();
@@ -157,6 +166,7 @@ class JSONRecording implements Recording {
         addJson(jw, "logs", logs);
         jw.endObject();
         osw.flush();
+        os.close();
         return baos.toByteArray();
     }
 
@@ -171,6 +181,14 @@ class JSONRecording implements Recording {
         jw.endArray();
     }
 
+    private InputStream getInputStream() throws IOException {
+        InputStream is = new ByteArrayInputStream(json);
+        if (compress) {
+            is = new GZIPInputStream(is);
+        }
+        return is;
+    }
+
     private interface JsonEntry {
         void toJson(JSONWriter jw) 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 827d890..fa31a30 100644
--- a/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java
+++ b/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java
@@ -53,6 +53,8 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde
 
     private final Cache<String, JSONRecording> cache;
 
+    private boolean compressRecording = true;
+
     public TracerLogServlet(BundleContext context) {
         super(LABEL, "Sling Tracer", "Sling", null);
         //TODO Make things configurable
@@ -196,7 +198,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde
     }
 
     private JSONRecording record(String requestId, HttpServletRequest request) {
-        JSONRecording data = new JSONRecording(requestId, request);
+        JSONRecording data = new JSONRecording(requestId, request, compressRecording);
         cache.put(requestId, data);
         return data;
     }
diff --git a/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java b/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
index 82116fc..473b7e7 100644
--- a/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
+++ b/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
@@ -43,7 +43,7 @@ public class JSONRecordingTest {
         StringWriter sw = new StringWriter();
 
         when(request.getMethod()).thenReturn("GET");
-        JSONRecording r = new JSONRecording("abc", request);
+        JSONRecording r = new JSONRecording("abc", request, true);
 
         r.log(Level.INFO, TracerContext.QUERY_LOGGER, MessageFormatter.arrayFormat("foo bar", new Object[]{"x" , "y"}));
         r.log(Level.INFO, TracerContext.QUERY_LOGGER, MessageFormatter.arrayFormat("foo bar", new Object[]{"x" , "z"}));
@@ -59,7 +59,7 @@ public class JSONRecordingTest {
     @Test
     public void requestTrackerLogs() throws Exception{
         StringWriter sw = new StringWriter();
-        JSONRecording r = new JSONRecording("abc", request);
+        JSONRecording r = new JSONRecording("abc", request, true);
 
         r.registerTracker(TestUtil.createTracker("x", "y"));
 
@@ -73,7 +73,7 @@ public class JSONRecordingTest {
     @Test
     public void logs() throws Exception{
         StringWriter sw = new StringWriter();
-        JSONRecording r = new JSONRecording("abc", request);
+        JSONRecording r = new JSONRecording("abc", request, true);
 
         FormattingTuple tp1 = MessageFormatter.arrayFormat("{} is going", new Object[]{"Jack"});
         r.log(Level.INFO, "foo", tp1);
diff --git a/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java b/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
index c6b9e42..416b8e2 100644
--- a/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
+++ b/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
@@ -235,6 +235,11 @@ public class LogTracerTest {
             public RequestProgressTracker getRequestProgressTracker() {
                 return createTracker("x", "y");
             }
+
+            @Override
+            public String getRequestURI() {
+                return "foo";
+            }
         };
         request.setHeader(TracerLogServlet.HEADER_TRACER_RECORDING, "true");
 
@@ -272,6 +277,11 @@ public class LogTracerTest {
             public RequestProgressTracker getRequestProgressTracker() {
                 return createTracker("x", "y");
             }
+
+            @Override
+            public String getRequestURI() {
+                return "foo";
+            }
         };
         request.setHeader(TracerLogServlet.HEADER_TRACER_RECORDING, "true");
         request.setHeader(LogTracer.HEADER_TRACER_CONFIG, "a.b.c;level=trace,a.b;level=debug");

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