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

[sling-org-apache-sling-tracer] 08/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 c5e3f3245324ffc98d0978110bca3181cfa0a5fb
Author: Chetan Mehrotra <ch...@apache.org>
AuthorDate: Tue Feb 9 10:39:35 2016 +0000

    SLING-5459 - Recording of tracer logs
    
    Changed the approach to serialize the whole recording as json at the end of the request processing. This would help in conserving memory usage.  Also  then we can size the recording and enforce limit on size, keep json in compressed state etc
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/tracer@1729353 13f79535-47bb-0310-9956-ffa450edef68
---
 .../sling/tracer/internal/JSONRecording.java       | 74 +++++++++++++++-------
 .../apache/sling/tracer/internal/LogTracer.java    |  1 +
 .../apache/sling/tracer/internal/Recording.java    | 10 +++
 .../sling/tracer/internal/TracerLogServlet.java    |  5 +-
 .../sling/tracer/internal/JSONRecordingTest.java   |  6 +-
 .../sling/tracer/internal/LogTracerTest.java       | 10 ++-
 .../tracer/internal/TracerLogServletTest.java      |  1 +
 7 files changed, 79 insertions(+), 28 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 391684f..9c8340e 100644
--- a/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
+++ b/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
@@ -19,6 +19,8 @@
 
 package org.apache.sling.tracer.internal;
 
+import java.io.IOException;
+import java.io.StringWriter;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -29,18 +31,64 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.sling.api.request.RequestProgressTracker;
 import org.apache.sling.commons.json.JSONException;
 import org.apache.sling.commons.json.io.JSONWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 class JSONRecording implements Recording {
+    private static final Logger log = LoggerFactory.getLogger(JSONRecording.class);
     private final String method;
+    private final String requestId;
     private final List<String> queries = new ArrayList<String>();
     private RequestProgressTracker tracker;
+    private String json;
 
-    public JSONRecording(HttpServletRequest r) {
+    public JSONRecording(String requestId, HttpServletRequest r) {
+        this.requestId = requestId;
         this.method = r.getMethod();
     }
 
-    public void render(Writer pw) throws JSONException {
-        JSONWriter jw = new JSONWriter(pw);
+    public boolean render(Writer pw) throws IOException {
+        if (json != null) {
+            pw.write(json);
+            return true;
+        }
+        return false;
+    }
+
+    //~---------------------------------------< Recording >
+
+    @Override
+    public void log(String logger, String format, Object[] params) {
+        if (TracerContext.QUERY_LOGGER.equals(logger)
+                && params != null && params.length == 2) {
+            queries.add((String) params[1]);
+        }
+    }
+
+    @Override
+    public void registerTracker(RequestProgressTracker tracker) {
+        this.tracker = tracker;
+    }
+
+    @Override
+    public void done() {
+        try {
+            if (json == null) {
+                json = toJSON();
+
+                //Let the tracker and other references go to
+                //not occupy memory
+                tracker = null;
+                queries.clear();
+            }
+        } catch (JSONException 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);
         jw.setTidy(true);
         jw.object();
         jw.key("method").value(method);
@@ -63,24 +111,6 @@ class JSONRecording implements Recording {
         }
         jw.endArray();
         jw.endObject();
-    }
-
-    //~---------------------------------------< Recording >
-
-    @Override
-    public void log(String logger, String format, Object[] params) {
-        if (TracerContext.QUERY_LOGGER.equals(logger)
-                && params != null && params.length == 2) {
-            queries.add((String) params[1]);
-        }
-    }
-
-    @Override
-    public void registerTracker(RequestProgressTracker tracker) {
-        this.tracker = tracker;
-    }
-
-    RequestProgressTracker getTracker() {
-        return tracker;
+        return sw.toString();
     }
 }
diff --git a/src/main/java/org/apache/sling/tracer/internal/LogTracer.java b/src/main/java/org/apache/sling/tracer/internal/LogTracer.java
index 9cfedf9..9489671 100644
--- a/src/main/java/org/apache/sling/tracer/internal/LogTracer.java
+++ b/src/main/java/org/apache/sling/tracer/internal/LogTracer.java
@@ -318,6 +318,7 @@ public class LogTracer {
                 if (tracerContext != null) {
                     disableCollector();
                 }
+                recording.done();
             }
         }
 
diff --git a/src/main/java/org/apache/sling/tracer/internal/Recording.java b/src/main/java/org/apache/sling/tracer/internal/Recording.java
index 947da83..1e6f058 100644
--- a/src/main/java/org/apache/sling/tracer/internal/Recording.java
+++ b/src/main/java/org/apache/sling/tracer/internal/Recording.java
@@ -32,6 +32,11 @@ interface Recording {
         public void registerTracker(RequestProgressTracker tracker) {
 
         }
+
+        @Override
+        public void done() {
+
+        }
     };
 
     void log(String logger, String format, Object[] params);
@@ -42,4 +47,9 @@ interface Recording {
      * @param tracker from current request
      */
     void registerTracker(RequestProgressTracker tracker);
+
+    /**
+     * Invoked at the end of request processing
+     */
+    void done();
 }
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 7af8dfc..2684f40 100644
--- a/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java
+++ b/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java
@@ -79,8 +79,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde
                 if (requestId != null) {
                     JSONRecording recording = cache.getIfPresent(requestId);
                     if (recording != null){
-                        recording.render(pw);
-                        responseDone = true;
+                        responseDone = recording.render(pw);
                     }
                 }
 
@@ -184,7 +183,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde
     }
 
     private JSONRecording record(String requestId, HttpServletRequest request) {
-        JSONRecording data = new JSONRecording(request);
+        JSONRecording data = new JSONRecording(requestId, request);
         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 560dc2d..9ebd544 100644
--- a/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
+++ b/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
@@ -38,11 +38,12 @@ public class JSONRecordingTest {
         StringWriter sw = new StringWriter();
 
         when(request.getMethod()).thenReturn("GET");
-        JSONRecording r = new JSONRecording(request);
+        JSONRecording r = new JSONRecording("abc", request);
 
         r.log(TracerContext.QUERY_LOGGER, "foo bar", new Object[]{"x" , "y"});
         r.log(TracerContext.QUERY_LOGGER, "foo bar", new Object[]{"x" , "z"});
 
+        r.done();
         r.render(sw);
 
         JSONObject json = new JSONObject(sw.toString());
@@ -53,10 +54,11 @@ public class JSONRecordingTest {
     @Test
     public void requestTrackerLogs() throws Exception{
         StringWriter sw = new StringWriter();
-        JSONRecording r = new JSONRecording(request);
+        JSONRecording r = new JSONRecording("abc", request);
 
         r.registerTracker(TestUtil.createTracker("x", "y"));
 
+        r.done();
         r.render(sw);
 
         JSONObject json = new JSONObject(sw.toString());
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 ba0f5ab..e23ac13 100644
--- a/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
+++ b/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
@@ -20,6 +20,7 @@
 package org.apache.sling.tracer.internal;
 
 import java.io.IOException;
+import java.io.StringWriter;
 import java.util.Collection;
 import java.util.List;
 
@@ -41,6 +42,7 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.request.RequestProgressTracker;
+import org.apache.sling.commons.json.JSONObject;
 import org.apache.sling.testing.mock.osgi.MockOsgi;
 import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
 import org.apache.sling.testing.mock.osgi.junit.OsgiContextCallback;
@@ -253,7 +255,13 @@ public class LogTracerTest {
         assertNotNull(requestId);
         Recording r = ((TracerLogServlet)context.getService(Servlet.class)).getRecording(requestId);
         assertTrue(r instanceof JSONRecording);
-        assertNotNull(((JSONRecording)r).getTracker());
+        JSONRecording jr = (JSONRecording) r;
+
+        StringWriter sw = new StringWriter();
+        jr.render(sw);
+        JSONObject json = new JSONObject(sw.toString());
+
+        assertEquals(2, json.getJSONArray("logs").length());
     }
 
 
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 5a3c24b..d2090fe 100644
--- a/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java
+++ b/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java
@@ -95,6 +95,7 @@ public class TracerLogServletTest {
 
         Recording recording = logServlet.startRecording(request, response);
         recording.registerTracker(createTracker("x" ,"y"));
+        recording.done();
 
         ArgumentCaptor<String> requestIdCaptor = ArgumentCaptor.forClass(String.class);
         verify(response).setHeader(eq(TracerLogServlet.HEADER_TRACER_REQUEST_ID), requestIdCaptor.capture());

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