This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tracer.git
commit 27f5400172d34991d7a66734c11d846aec5018c3 Author: Chetan Mehrotra <[email protected]> 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@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 "[email protected]" <[email protected]>.
