You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ca...@apache.org on 2016/10/26 22:51:33 UTC

[1/4] curator git commit: [CURATOR-349] Expose extra metrics in TracerDriver

Repository: curator
Updated Branches:
  refs/heads/CURATOR-3.0 d034aeaed -> d8798c21d


[CURATOR-349] Expose extra metrics in TracerDriver


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/2f6e2177
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/2f6e2177
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/2f6e2177

Branch: refs/heads/CURATOR-3.0
Commit: 2f6e2177e98d0f418b47a664a48c87abf5a72595
Parents: 022de39
Author: allenlyu <al...@fb.com>
Authored: Tue Sep 20 14:56:47 2016 -0700
Committer: lvfangmin <lv...@gmail.com>
Committed: Wed Oct 19 17:38:29 2016 -0700

----------------------------------------------------------------------
 .../org/apache/curator/ConnectionState.java     |  37 ++++-
 .../apache/curator/CuratorZookeeperClient.java  |  15 +-
 .../main/java/org/apache/curator/RetryLoop.java |   7 +-
 .../curator/drivers/AdvancedTracerDriver.java   |  50 ++++++
 .../org/apache/curator/drivers/EventTrace.java  |  53 ++++++
 .../apache/curator/drivers/OperationTrace.java  | 162 +++++++++++++++++++
 .../framework/imps/BackgroundSyncImpl.java      |  11 +-
 .../framework/imps/CreateBuilderImpl.java       |  17 +-
 .../framework/imps/CuratorFrameworkImpl.java    |   4 +-
 .../framework/imps/DeleteBuilderImpl.java       |  10 +-
 .../framework/imps/ExistsBuilderImpl.java       |  14 +-
 .../FindAndDeleteProtectedNodeInBackground.java |   6 +-
 .../framework/imps/GetACLBuilderImpl.java       |  10 +-
 .../framework/imps/GetChildrenBuilderImpl.java  |  10 +-
 .../framework/imps/GetDataBuilderImpl.java      |  10 +-
 .../framework/imps/SetACLBuilderImpl.java       |  10 +-
 .../framework/imps/SetDataBuilderImpl.java      |  13 +-
 .../curator/framework/imps/SyncBuilderImpl.java |   6 +-
 .../framework/imps/TempGetDataBuilderImpl.java  |   6 +-
 src/site/confluence/logging.confluence          |   2 +-
 20 files changed, 380 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-client/src/main/java/org/apache/curator/ConnectionState.java
----------------------------------------------------------------------
diff --git a/curator-client/src/main/java/org/apache/curator/ConnectionState.java b/curator-client/src/main/java/org/apache/curator/ConnectionState.java
index dc6ac53..9712899 100644
--- a/curator-client/src/main/java/org/apache/curator/ConnectionState.java
+++ b/curator-client/src/main/java/org/apache/curator/ConnectionState.java
@@ -19,6 +19,8 @@
 package org.apache.curator;
 
 import org.apache.curator.utils.CloseableUtils;
+import org.apache.curator.drivers.EventTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.drivers.TracerDriver;
 import org.apache.curator.ensemble.EnsembleProvider;
 import org.apache.curator.utils.DebugUtils;
@@ -78,7 +80,7 @@ class ConnectionState implements Watcher, Closeable
         Exception exception = backgroundExceptions.poll();
         if ( exception != null )
         {
-            tracer.get().addCount("background-exceptions", 1);
+            new EventTrace("background-exceptions", tracer.get()).commit();
             throw exception;
         }
 
@@ -160,9 +162,10 @@ class ConnectionState implements Watcher, Closeable
 
         for ( Watcher parentWatcher : parentWatchers )
         {
-            TimeTrace timeTrace = new TimeTrace("connection-state-parent-process", tracer.get());
+
+            OperationTrace trace = new OperationTrace("connection-state-parent-process", tracer.get());
             parentWatcher.process(event);
-            timeTrace.commit();
+            trace.commit();
         }
     }
 
@@ -199,13 +202,31 @@ class ConnectionState implements Watcher, Closeable
                     {
                         log.error(String.format("Connection timed out for connection string (%s) and timeout (%d) / elapsed (%d)", zooKeeper.getConnectionString(), connectionTimeoutMs, elapsed), connectionLossException);
                     }
-                    tracer.get().addCount("connections-timed-out", 1);
+                    new EventTrace("connections-timed-out", tracer.get(), getSessionId()).commit();
                     throw connectionLossException;
                 }
             }
         }
     }
 
+    /**
+     * Return the current session id
+     */
+    public long getSessionId() {
+        long sessionId = -1;
+        if (isConnected()) {
+            try {
+                ZooKeeper zk = zooKeeper.getZooKeeper();
+                if (zk != null) {
+                    sessionId = zk.getSessionId();
+                }
+            } catch (Exception e) {
+                // Ignore the exception
+            }
+        }
+        return sessionId;
+    }
+
     private synchronized void reset() throws Exception
     {
         log.debug("reset");
@@ -259,6 +280,10 @@ class ConnectionState implements Watcher, Closeable
             break;
         }
         }
+        // the session expired is logged in handleExpiredSession, so not log here
+        if (state != Event.KeeperState.Expired) {
+            new EventTrace(state.toString(), tracer.get(), getSessionId()).commit();
+        }
 
         if ( checkNewConnectionString && zooKeeper.hasNewConnectionString() )
         {
@@ -271,7 +296,7 @@ class ConnectionState implements Watcher, Closeable
     private void handleNewConnectionString()
     {
         log.info("Connection string changed");
-        tracer.get().addCount("connection-string-changed", 1);
+        new EventTrace("connection-string-changed", tracer.get(), getSessionId()).commit();
 
         try
         {
@@ -287,7 +312,7 @@ class ConnectionState implements Watcher, Closeable
     private void handleExpiredSession()
     {
         log.warn("Session expired event received");
-        tracer.get().addCount("session-expired", 1);
+        new EventTrace("session-expired", tracer.get(), getSessionId()).commit();
 
         try
         {

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-client/src/main/java/org/apache/curator/CuratorZookeeperClient.java
----------------------------------------------------------------------
diff --git a/curator-client/src/main/java/org/apache/curator/CuratorZookeeperClient.java b/curator-client/src/main/java/org/apache/curator/CuratorZookeeperClient.java
index c9f5199..9c1c3d0 100644
--- a/curator-client/src/main/java/org/apache/curator/CuratorZookeeperClient.java
+++ b/curator-client/src/main/java/org/apache/curator/CuratorZookeeperClient.java
@@ -19,6 +19,7 @@
 package org.apache.curator;
 
 import com.google.common.base.Preconditions;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.drivers.TracerDriver;
 import org.apache.curator.ensemble.EnsembleProvider;
 import org.apache.curator.ensemble.fixed.FixedEnsembleProvider;
@@ -160,7 +161,7 @@ public class CuratorZookeeperClient implements Closeable
         Preconditions.checkState(started.get(), "Client is not started");
 
         log.debug("blockUntilConnectedOrTimedOut() start");
-        TimeTrace       trace = startTracer("blockUntilConnectedOrTimedOut");
+        OperationTrace       trace = startAdvancedTracer("blockUntilConnectedOrTimedOut");
 
         internalBlockUntilConnectedOrTimedOut();
 
@@ -242,6 +243,16 @@ public class CuratorZookeeperClient implements Closeable
     }
 
     /**
+     * Start a new advanced tracer with more metrics being recorded
+     * @param name name of the event
+     * @return the new tracer ({@link OperationTrace#commit()} must be called)
+     */
+    public OperationTrace          startAdvancedTracer(String name)
+    {
+        return new OperationTrace(name, tracer.get(), state.getSessionId());
+    }
+
+    /**
      * Return the current tracing driver
      *
      * @return tracing driver
@@ -317,7 +328,7 @@ public class CuratorZookeeperClient implements Closeable
                     latch.countDown();
                 }
             };
-            
+
             state.addParentWatcher(tempWatcher);
             long        startTimeMs = System.currentTimeMillis();
             try

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-client/src/main/java/org/apache/curator/RetryLoop.java
----------------------------------------------------------------------
diff --git a/curator-client/src/main/java/org/apache/curator/RetryLoop.java b/curator-client/src/main/java/org/apache/curator/RetryLoop.java
index 48d4d5c..ea34349 100644
--- a/curator-client/src/main/java/org/apache/curator/RetryLoop.java
+++ b/curator-client/src/main/java/org/apache/curator/RetryLoop.java
@@ -18,6 +18,7 @@
  */
 package org.apache.curator;
 
+import org.apache.curator.drivers.EventTrace;
 import org.apache.curator.drivers.TracerDriver;
 import org.apache.curator.utils.DebugUtils;
 import org.apache.curator.utils.ThreadUtils;
@@ -104,7 +105,7 @@ public class RetryLoop
             try
             {
                 client.internalBlockUntilConnectedOrTimedOut();
-                
+
                 result = proc.call();
                 retryLoop.markComplete();
             }
@@ -189,7 +190,7 @@ public class RetryLoop
 
             if ( retryPolicy.allowRetry(retryCount++, System.currentTimeMillis() - startTimeMs, sleeper) )
             {
-                tracer.get().addCount("retries-allowed", 1);
+                new EventTrace("retries-allowed", tracer.get()).commit();
                 if ( !Boolean.getBoolean(DebugUtils.PROPERTY_DONT_LOG_CONNECTION_ISSUES) )
                 {
                     log.debug("Retrying operation");
@@ -198,7 +199,7 @@ public class RetryLoop
             }
             else
             {
-                tracer.get().addCount("retries-disallowed", 1);
+                new EventTrace("retries-disallowed", tracer.get()).commit();
                 if ( !Boolean.getBoolean(DebugUtils.PROPERTY_DONT_LOG_CONNECTION_ISSUES) )
                 {
                     log.debug("Retry policy not allowing retry");

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-client/src/main/java/org/apache/curator/drivers/AdvancedTracerDriver.java
----------------------------------------------------------------------
diff --git a/curator-client/src/main/java/org/apache/curator/drivers/AdvancedTracerDriver.java b/curator-client/src/main/java/org/apache/curator/drivers/AdvancedTracerDriver.java
new file mode 100644
index 0000000..40faa99
--- /dev/null
+++ b/curator-client/src/main/java/org/apache/curator/drivers/AdvancedTracerDriver.java
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.curator.drivers;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ *  Expose more metrics for the operations and events
+ */
+public abstract class AdvancedTracerDriver implements TracerDriver
+{
+    /**
+     * Record the given trace event
+     *
+     * @param trace the metrics of the operation
+     */
+    public abstract void     addTrace(OperationTrace trace);
+
+    /**
+     * Add to a named counter
+     *
+     * @param name name of the counter
+     * @param increment amount to increment
+     */
+    public abstract void     addEvent(EventTrace trace);
+
+    @Deprecated
+    @Override
+    public final void     addTrace(String name, long time, TimeUnit unit) {}
+
+    @Deprecated
+    @Override
+    public final void     addCount(String name, int increment) {}
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-client/src/main/java/org/apache/curator/drivers/EventTrace.java
----------------------------------------------------------------------
diff --git a/curator-client/src/main/java/org/apache/curator/drivers/EventTrace.java b/curator-client/src/main/java/org/apache/curator/drivers/EventTrace.java
new file mode 100644
index 0000000..1c6e031
--- /dev/null
+++ b/curator-client/src/main/java/org/apache/curator/drivers/EventTrace.java
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.curator.drivers;
+
+public class EventTrace
+{
+  private final String name;
+  private final TracerDriver driver;
+  private final long sessionId;
+
+  public EventTrace(String name, TracerDriver driver) {
+    this(name, driver, -1);
+  }
+
+  public EventTrace(String name, TracerDriver driver, long sessionId) {
+    this.name = name;
+    this.driver = driver;
+    this.sessionId = sessionId;
+  }
+
+  public String getName() {
+    return this.name;
+  }
+
+  public long getSessionId() {
+    return this.sessionId;
+  }
+
+  public void commit() {
+    if (this.driver instanceof AdvancedTracerDriver) {
+      ((AdvancedTracerDriver) this.driver).addEvent(this);
+    } else {
+      this.driver.addCount(this.name, 1);
+    }
+  }
+}
+

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-client/src/main/java/org/apache/curator/drivers/OperationTrace.java
----------------------------------------------------------------------
diff --git a/curator-client/src/main/java/org/apache/curator/drivers/OperationTrace.java b/curator-client/src/main/java/org/apache/curator/drivers/OperationTrace.java
new file mode 100644
index 0000000..b8de3a3
--- /dev/null
+++ b/curator-client/src/main/java/org/apache/curator/drivers/OperationTrace.java
@@ -0,0 +1,162 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.curator.drivers;
+
+import org.apache.curator.drivers.TracerDriver;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.data.Stat;
+
+import java.io.UnsupportedEncodingException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Used to trace the metrics of a certain Zookeeper operation.
+ */
+public class OperationTrace
+{
+    private final String name;
+    private final TracerDriver driver;
+
+    private int returnCode = KeeperException.Code.OK.intValue();
+    private long latencyMs;
+    private long requestBytesLength;
+    private long responseBytesLength;
+    private String path;
+    private boolean withWatcher;
+    private long sessionId;
+    private Stat stat;
+
+    private final long startTimeNanos = System.nanoTime();
+
+    public OperationTrace(String name, TracerDriver driver) {
+      this(name, driver, -1);
+    }
+
+    public OperationTrace(String name, TracerDriver driver, long sessionId) {
+      this.name = name;
+      this.driver = driver;
+      this.sessionId = sessionId;
+    }
+
+    public OperationTrace setReturnCode(int returnCode) {
+      this.returnCode = returnCode;
+      return this;
+    }
+
+    public OperationTrace setRequestBytesLength(long length) {
+      this.requestBytesLength = length;
+      return this;
+    }
+
+    public OperationTrace setRequestBytesLength(String data) {
+      if (data == null) {
+        return this;
+      }
+
+      try {
+        this.setRequestBytesLength(data.getBytes("UTF-8").length);
+      } catch (UnsupportedEncodingException e) {
+        // Ignore the exception.
+      }
+
+      return this;
+    }
+
+    public OperationTrace setRequestBytesLength(byte[] data) {
+      if (data == null) {
+        return this;
+      }
+
+      return this.setRequestBytesLength(data.length);
+    }
+
+    public OperationTrace setResponseBytesLength(long length) {
+      this.responseBytesLength = length;
+      return this;
+    }
+
+    public OperationTrace setResponseBytesLength(byte[] data) {
+      if (data == null) {
+        return this;
+      }
+
+      return this.setResponseBytesLength(data.length);
+    }
+
+    public OperationTrace setPath(String path) {
+      this.path = path;
+      return this;
+    }
+
+    public OperationTrace setWithWatcher(boolean withWatcher) {
+      this.withWatcher = withWatcher;
+      return this;
+    }
+
+    public OperationTrace setStat(Stat stat) {
+      this.stat = stat;
+      return this;
+    }
+
+    public String getName() {
+      return this.name;
+    }
+
+    public int getReturnCode() {
+      return this.returnCode;
+    }
+
+    public long getLatencyMs() {
+      return this.latencyMs;
+    }
+
+    public long getRequestBytesLength() {
+      return this.requestBytesLength;
+    }
+
+    public long getResponseBytesLength() {
+      return this.responseBytesLength;
+    }
+
+    public long getSessionId() {
+      return this.sessionId;
+    }
+
+    public String getPath() {
+      return this.path;
+    }
+
+    public boolean isWithWatcher() {
+      return this.withWatcher;
+    }
+
+    public Stat getStat() {
+      return this.stat;
+    }
+
+    public void commit() {
+      long elapsed = System.nanoTime() - startTimeNanos;
+      this.latencyMs = TimeUnit.MILLISECONDS.convert(elapsed, TimeUnit.NANOSECONDS);
+      if (this.driver instanceof AdvancedTracerDriver) {
+        ((AdvancedTracerDriver) this.driver).addTrace(this);
+      } else {
+        this.driver.addTrace(this.name, elapsed, TimeUnit.NANOSECONDS);
+      }
+    }
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/BackgroundSyncImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/BackgroundSyncImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/BackgroundSyncImpl.java
index af8e458..fe1b16c 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/BackgroundSyncImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/BackgroundSyncImpl.java
@@ -18,10 +18,12 @@
  */
 package org.apache.curator.framework.imps;
 
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.CuratorEventType;
 import org.apache.zookeeper.AsyncCallback;
 
+import java.io.UnsupportedEncodingException;
+
 class BackgroundSyncImpl implements BackgroundOperation<String>
 {
     private final CuratorFrameworkImpl client;
@@ -36,16 +38,17 @@ class BackgroundSyncImpl implements BackgroundOperation<String>
     @Override
     public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
     {
-        final TimeTrace trace = client.getZookeeperClient().startTracer("BackgroundSyncImpl");
+        final OperationTrace trace = client.getZookeeperClient().startAdvancedTracer("BackgroundSyncImpl");
+        final String data = operationAndData.getData();
         client.getZooKeeper().sync
         (
-            operationAndData.getData(),
+            data,
             new AsyncCallback.VoidCallback()
             {
                 @Override
                 public void processResult(int rc, String path, Object ctx)
                 {
-                    trace.commit();
+                    trace.setReturnCode(rc).setRequestBytesLength(data).commit();
                     CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.SYNC, rc, path, null, ctx, null, null, null, null, null);
                     client.processBackgroundOperation(operationAndData, event);
                 }

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
index 0f893d8..d59ba69 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
@@ -23,7 +23,7 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import org.apache.curator.RetryLoop;
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.*;
 import org.apache.curator.framework.api.transaction.CuratorTransactionBridge;
 import org.apache.curator.framework.api.transaction.OperationType;
@@ -510,11 +510,12 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt
     {
         try
         {
-            final TimeTrace trace = client.getZookeeperClient().startTracer("CreateBuilderImpl-Background");
+            final OperationTrace trace = client.getZookeeperClient().startAdvancedTracer("CreateBuilderImpl-Background");
+            final byte[] data = operationAndData.getData().getData();
             client.getZooKeeper().create
                 (
                     operationAndData.getData().getPath(),
-                    operationAndData.getData().getData(),
+                    data,
                     acling.getAclList(operationAndData.getData().getPath()),
                     createMode,
                     new AsyncCallback.StringCallback()
@@ -522,7 +523,7 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt
                         @Override
                         public void processResult(int rc, String path, Object ctx, String name)
                         {
-                            trace.commit();
+                            trace.setReturnCode(rc).setRequestBytesLength(data).setPath(path).commit();
 
                             if ( (rc == KeeperException.Code.NONODE.intValue()) && createParentsIfNeeded )
                             {
@@ -708,7 +709,7 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt
 
     private String pathInForeground(final String path, final byte[] data) throws Exception
     {
-        TimeTrace trace = client.getZookeeperClient().startTracer("CreateBuilderImpl-Foreground");
+        OperationTrace trace = client.getZookeeperClient().startAdvancedTracer("CreateBuilderImpl-Foreground");
 
         final AtomicBoolean firstTime = new AtomicBoolean(true);
         String returnPath = RetryLoop.callWithRetry
@@ -758,13 +759,13 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt
                 }
             );
 
-        trace.commit();
+        trace.setRequestBytesLength(data).setPath(path).commit();
         return returnPath;
     }
 
     private String findProtectedNodeInForeground(final String path) throws Exception
     {
-        TimeTrace trace = client.getZookeeperClient().startTracer("CreateBuilderImpl-findProtectedNodeInForeground");
+        OperationTrace trace = client.getZookeeperClient().startAdvancedTracer("CreateBuilderImpl-findProtectedNodeInForeground");
 
         String returnPath = RetryLoop.callWithRetry
             (
@@ -791,7 +792,7 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt
                 }
             );
 
-        trace.commit();
+        trace.setPath(path).commit();
         return returnPath;
     }
 

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
index 442579d..6aa9f66 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
@@ -27,7 +27,7 @@ import com.google.common.collect.ImmutableList;
 import org.apache.curator.CuratorConnectionLossException;
 import org.apache.curator.CuratorZookeeperClient;
 import org.apache.curator.RetryLoop;
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.AuthInfo;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -884,7 +884,7 @@ public class CuratorFrameworkImpl implements CuratorFramework
             {
                 try
                 {
-                    TimeTrace trace = client.startTracer("EventListener");
+                    OperationTrace trace = client.startAdvancedTracer("EventListener");
                     listener.eventReceived(CuratorFrameworkImpl.this, curatorEvent);
                     trace.commit();
                 }

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
index 833904b..7fbe36e 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
@@ -19,7 +19,7 @@
 package org.apache.curator.framework.imps;
 
 import org.apache.curator.RetryLoop;
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.*;
 import org.apache.curator.framework.api.transaction.CuratorTransactionBridge;
 import org.apache.curator.framework.api.transaction.OperationType;
@@ -145,7 +145,7 @@ class DeleteBuilderImpl implements DeleteBuilder, BackgroundOperation<String>, E
     {
         try
         {
-            final TimeTrace trace = client.getZookeeperClient().startTracer("DeleteBuilderImpl-Background");
+            final OperationTrace trace = client.getZookeeperClient().startAdvancedTracer("DeleteBuilderImpl-Background");
             client.getZooKeeper().delete
                 (
                     operationAndData.getData(),
@@ -155,7 +155,7 @@ class DeleteBuilderImpl implements DeleteBuilder, BackgroundOperation<String>, E
                         @Override
                         public void processResult(int rc, String path, Object ctx)
                         {
-                            trace.commit();
+                            trace.setReturnCode(rc).setPath(path).commit();
                             if ( (rc == KeeperException.Code.NOTEMPTY.intValue()) && deletingChildrenIfNeeded )
                             {
                                 backgroundDeleteChildrenThenNode(operationAndData);
@@ -234,7 +234,7 @@ class DeleteBuilderImpl implements DeleteBuilder, BackgroundOperation<String>, E
 
     private void pathInForeground(final String path, String unfixedPath) throws Exception
     {
-        TimeTrace trace = client.getZookeeperClient().startTracer("DeleteBuilderImpl-Foreground");
+        OperationTrace trace = client.getZookeeperClient().startAdvancedTracer("DeleteBuilderImpl-Foreground");
         try
         {
             RetryLoop.callWithRetry
@@ -275,6 +275,6 @@ class DeleteBuilderImpl implements DeleteBuilder, BackgroundOperation<String>, E
             }
             throw e;
         }
-        trace.commit();
+        trace.setPath(path).commit();
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
index da9b0ce..757e8fe 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
@@ -19,7 +19,7 @@
 package org.apache.curator.framework.imps;
 
 import org.apache.curator.RetryLoop;
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.*;
 import org.apache.curator.utils.ZKPaths;
 import org.apache.zookeeper.AsyncCallback;
@@ -126,13 +126,13 @@ class ExistsBuilderImpl implements ExistsBuilder, BackgroundOperation<String>, E
     {
         try
         {
-            final TimeTrace   trace = client.getZookeeperClient().startTracer("ExistsBuilderImpl-Background");
+            final OperationTrace   trace = client.getZookeeperClient().startAdvancedTracer("ExistsBuilderImpl-Background");
             AsyncCallback.StatCallback callback = new AsyncCallback.StatCallback()
             {
                 @Override
                 public void processResult(int rc, String path, Object ctx, Stat stat)
                 {
-                    trace.commit();
+                    trace.setReturnCode(rc).setPath(path).setWithWatcher(watching.getWatcher() != null).setStat(stat).commit();
                     CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.EXISTS, rc, path, null, ctx, stat, null, null, null, null);
                     client.processBackgroundOperation(operationAndData, event);
                 }
@@ -185,7 +185,7 @@ class ExistsBuilderImpl implements ExistsBuilder, BackgroundOperation<String>, E
             final String parent = ZKPaths.getPathAndNode(path).getPath();
             if ( !parent.equals(ZKPaths.PATH_SEPARATOR) )
             {
-                TimeTrace   trace = client.getZookeeperClient().startTracer("ExistsBuilderImpl-Foreground-CreateParents");
+                OperationTrace   trace = client.getZookeeperClient().startAdvancedTracer("ExistsBuilderImpl-Foreground-CreateParents");
                 RetryLoop.callWithRetry
                 (
                     client.getZookeeperClient(),
@@ -210,7 +210,7 @@ class ExistsBuilderImpl implements ExistsBuilder, BackgroundOperation<String>, E
                         }
                     }
                 );
-                trace.commit();
+                trace.setPath(path).commit();
             }
         }
         return pathInForegroundStandard(path);
@@ -218,7 +218,7 @@ class ExistsBuilderImpl implements ExistsBuilder, BackgroundOperation<String>, E
 
     private Stat pathInForegroundStandard(final String path) throws Exception
     {
-        TimeTrace   trace = client.getZookeeperClient().startTracer("ExistsBuilderImpl-Foreground");
+        OperationTrace   trace = client.getZookeeperClient().startAdvancedTracer("ExistsBuilderImpl-Foreground");
         Stat        returnStat = RetryLoop.callWithRetry
         (
             client.getZookeeperClient(),
@@ -240,7 +240,7 @@ class ExistsBuilderImpl implements ExistsBuilder, BackgroundOperation<String>, E
                 }
             }
         );
-        trace.commit();
+        trace.setPath(path).setWithWatcher(watching.getWatcher() != null).setStat(returnStat).commit();
         return returnStat;
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/FindAndDeleteProtectedNodeInBackground.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/FindAndDeleteProtectedNodeInBackground.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/FindAndDeleteProtectedNodeInBackground.java
index 5b0f47c..6a2fe71 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/FindAndDeleteProtectedNodeInBackground.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/FindAndDeleteProtectedNodeInBackground.java
@@ -19,7 +19,7 @@
 package org.apache.curator.framework.imps;
 
 import com.google.common.annotations.VisibleForTesting;
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.CuratorEventType;
 import org.apache.curator.utils.ThreadUtils;
 import org.apache.curator.utils.ZKPaths;
@@ -66,13 +66,13 @@ class FindAndDeleteProtectedNodeInBackground implements BackgroundOperation<Void
     @Override
     public void performBackgroundOperation(final OperationAndData<Void> operationAndData) throws Exception
     {
-        final TimeTrace trace = client.getZookeeperClient().startTracer("FindAndDeleteProtectedNodeInBackground");
+        final OperationTrace trace = client.getZookeeperClient().startAdvancedTracer("FindAndDeleteProtectedNodeInBackground");
         AsyncCallback.Children2Callback callback = new AsyncCallback.Children2Callback()
         {
             @Override
             public void processResult(int rc, String path, Object o, List<String> strings, Stat stat)
             {
-                trace.commit();
+                trace.setReturnCode(rc).setPath(path).setStat(stat).commit();
 
                 if ( debugInsertError.compareAndSet(true, false) )
                 {

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
index 351a8c5..7ac3557 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
@@ -19,7 +19,7 @@
 package org.apache.curator.framework.imps;
 
 import org.apache.curator.RetryLoop;
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.BackgroundCallback;
 import org.apache.curator.framework.api.CuratorEventType;
 import org.apache.curator.framework.api.ErrorListenerPathable;
@@ -108,13 +108,13 @@ class GetACLBuilderImpl implements GetACLBuilder, BackgroundOperation<String>, E
     {
         try
         {
-            final TimeTrace             trace = client.getZookeeperClient().startTracer("GetACLBuilderImpl-Background");
+            final OperationTrace             trace = client.getZookeeperClient().startAdvancedTracer("GetACLBuilderImpl-Background");
             AsyncCallback.ACLCallback   callback = new AsyncCallback.ACLCallback()
             {
                 @Override
                 public void processResult(int rc, String path, Object ctx, List<ACL> acl, Stat stat)
                 {
-                    trace.commit();
+                    trace.setReturnCode(rc).setPath(path).setStat(stat).commit();
                     CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.GET_ACL, rc, path, null, ctx, stat, null, null, null, acl);
                     client.processBackgroundOperation(operationAndData, event);
                 }
@@ -146,7 +146,7 @@ class GetACLBuilderImpl implements GetACLBuilder, BackgroundOperation<String>, E
 
     private List<ACL> pathInForeground(final String path) throws Exception
     {
-        TimeTrace    trace = client.getZookeeperClient().startTracer("GetACLBuilderImpl-Foreground");
+        OperationTrace    trace = client.getZookeeperClient().startAdvancedTracer("GetACLBuilderImpl-Foreground");
         List<ACL>    result = RetryLoop.callWithRetry
         (
             client.getZookeeperClient(),
@@ -159,7 +159,7 @@ class GetACLBuilderImpl implements GetACLBuilder, BackgroundOperation<String>, E
                 }
             }
         );
-        trace.commit();
+        trace.setPath(path).setStat(responseStat).commit();
         return result;
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
index 745800d..5430546 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
@@ -20,7 +20,7 @@ package org.apache.curator.framework.imps;
 
 import com.google.common.collect.Lists;
 import org.apache.curator.RetryLoop;
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.BackgroundCallback;
 import org.apache.curator.framework.api.BackgroundPathable;
 import org.apache.curator.framework.api.CuratorEventType;
@@ -162,13 +162,13 @@ class GetChildrenBuilderImpl implements GetChildrenBuilder, BackgroundOperation<
     {
         try
         {
-            final TimeTrace       trace = client.getZookeeperClient().startTracer("GetChildrenBuilderImpl-Background");
+            final OperationTrace       trace = client.getZookeeperClient().startAdvancedTracer("GetChildrenBuilderImpl-Background");
             AsyncCallback.Children2Callback callback = new AsyncCallback.Children2Callback()
             {
                 @Override
                 public void processResult(int rc, String path, Object o, List<String> strings, Stat stat)
                 {
-                    trace.commit();
+                    trace.setReturnCode(rc).setPath(path).setWithWatcher(watching.getWatcher() != null).setStat(stat).commit();
                     if ( strings == null )
                     {
                         strings = Lists.newArrayList();
@@ -211,7 +211,7 @@ class GetChildrenBuilderImpl implements GetChildrenBuilder, BackgroundOperation<
 
     private List<String> pathInForeground(final String path) throws Exception
     {
-        TimeTrace       trace = client.getZookeeperClient().startTracer("GetChildrenBuilderImpl-Foreground");
+        OperationTrace       trace = client.getZookeeperClient().startAdvancedTracer("GetChildrenBuilderImpl-Foreground");
         List<String>    children = RetryLoop.callWithRetry
         (
             client.getZookeeperClient(),
@@ -233,7 +233,7 @@ class GetChildrenBuilderImpl implements GetChildrenBuilder, BackgroundOperation<
                 }
             }
         );
-        trace.commit();
+        trace.setPath(path).setWithWatcher(watching.getWatcher() != null).setStat(responseStat).commit();
         return children;
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
index 94d27ad..c841792 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
@@ -19,7 +19,7 @@
 package org.apache.curator.framework.imps;
 
 import org.apache.curator.RetryLoop;
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.*;
 import org.apache.curator.utils.ThreadUtils;
 import org.apache.zookeeper.AsyncCallback;
@@ -233,13 +233,13 @@ class GetDataBuilderImpl implements GetDataBuilder, BackgroundOperation<String>,
     {
         try
         {
-            final TimeTrace   trace = client.getZookeeperClient().startTracer("GetDataBuilderImpl-Background");
+            final OperationTrace   trace = client.getZookeeperClient().startAdvancedTracer("GetDataBuilderImpl-Background");
             AsyncCallback.DataCallback callback = new AsyncCallback.DataCallback()
             {
                 @Override
                 public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat)
                 {
-                    trace.commit();
+                    trace.setReturnCode(rc).setResponseBytesLength(data).setPath(path).setWithWatcher(watching.getWatcher() != null).setStat(stat).commit();
                     if ( decompress && (data != null) )
                     {
                         try
@@ -291,7 +291,7 @@ class GetDataBuilderImpl implements GetDataBuilder, BackgroundOperation<String>,
 
     private byte[] pathInForeground(final String path) throws Exception
     {
-        TimeTrace   trace = client.getZookeeperClient().startTracer("GetDataBuilderImpl-Foreground");
+        OperationTrace   trace = client.getZookeeperClient().startAdvancedTracer("GetDataBuilderImpl-Foreground");
         byte[]      responseData = RetryLoop.callWithRetry
         (
             client.getZookeeperClient(),
@@ -313,7 +313,7 @@ class GetDataBuilderImpl implements GetDataBuilder, BackgroundOperation<String>,
                 }
             }
         );
-        trace.commit();
+        trace.setResponseBytesLength(responseData).setPath(path).setWithWatcher(watching.getWatcher() != null).setStat(responseStat).commit();
 
         return decompress ? client.getCompressionProvider().decompress(path, responseData) : responseData;
     }

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
index 5507529..522a927 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
@@ -19,7 +19,7 @@
 package org.apache.curator.framework.imps;
 
 import org.apache.curator.RetryLoop;
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.*;
 import org.apache.curator.framework.api.BackgroundCallback;
 import org.apache.curator.framework.api.CuratorEventType;
@@ -133,7 +133,7 @@ class SetACLBuilderImpl implements SetACLBuilder, BackgroundPathable<Stat>, Back
     {
         try
         {
-            final TimeTrace     trace = client.getZookeeperClient().startTracer("SetACLBuilderImpl-Background");
+            final OperationTrace     trace = client.getZookeeperClient().startAdvancedTracer("SetACLBuilderImpl-Background");
             String              path = operationAndData.getData();
             client.getZooKeeper().setACL
             (
@@ -146,7 +146,7 @@ class SetACLBuilderImpl implements SetACLBuilder, BackgroundPathable<Stat>, Back
                     @Override
                     public void processResult(int rc, String path, Object ctx, Stat stat)
                     {
-                        trace.commit();
+                        trace.setReturnCode(rc).setPath(path).setStat(stat).commit();
                         CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_ACL, rc, path, null, ctx, stat, null, null, null, null);
                         client.processBackgroundOperation(operationAndData, event);
                     }
@@ -162,7 +162,7 @@ class SetACLBuilderImpl implements SetACLBuilder, BackgroundPathable<Stat>, Back
 
     private Stat pathInForeground(final String path) throws Exception
     {
-        TimeTrace   trace = client.getZookeeperClient().startTracer("SetACLBuilderImpl-Foreground");
+        OperationTrace   trace = client.getZookeeperClient().startAdvancedTracer("SetACLBuilderImpl-Foreground");
         Stat        resultStat = RetryLoop.callWithRetry
         (
             client.getZookeeperClient(),
@@ -175,7 +175,7 @@ class SetACLBuilderImpl implements SetACLBuilder, BackgroundPathable<Stat>, Back
                 }
             }
         );
-        trace.commit();
+        trace.setPath(path).setStat(resultStat).commit();
         return resultStat;
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
index 62e39cf..2286565 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
@@ -19,7 +19,7 @@
 package org.apache.curator.framework.imps;
 
 import org.apache.curator.RetryLoop;
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.*;
 import org.apache.curator.framework.api.transaction.CuratorTransactionBridge;
 import org.apache.curator.framework.api.transaction.OperationType;
@@ -208,11 +208,12 @@ class SetDataBuilderImpl implements SetDataBuilder, BackgroundOperation<PathAndB
     {
         try
         {
-            final TimeTrace   trace = client.getZookeeperClient().startTracer("SetDataBuilderImpl-Background");
+            final OperationTrace   trace = client.getZookeeperClient().startAdvancedTracer("SetDataBuilderImpl-Background");
+            final byte[] data = operationAndData.getData().getData();
             client.getZooKeeper().setData
             (
                 operationAndData.getData().getPath(),
-                operationAndData.getData().getData(),
+                data,
                 version,
                 new AsyncCallback.StatCallback()
                 {
@@ -220,7 +221,7 @@ class SetDataBuilderImpl implements SetDataBuilder, BackgroundOperation<PathAndB
                     @Override
                     public void processResult(int rc, String path, Object ctx, Stat stat)
                     {
-                        trace.commit();
+                        trace.setReturnCode(rc).setRequestBytesLength(data).setPath(path).setStat(stat).commit();
                         CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_DATA, rc, path, null, ctx, stat, null, null, null, null);
                         client.processBackgroundOperation(operationAndData, event);
                     }
@@ -269,7 +270,7 @@ class SetDataBuilderImpl implements SetDataBuilder, BackgroundOperation<PathAndB
 
     private Stat pathInForeground(final String path, final byte[] data) throws Exception
     {
-        TimeTrace   trace = client.getZookeeperClient().startTracer("SetDataBuilderImpl-Foreground");
+        OperationTrace   trace = client.getZookeeperClient().startAdvancedTracer("SetDataBuilderImpl-Foreground");
         Stat        resultStat = RetryLoop.callWithRetry
         (
             client.getZookeeperClient(),
@@ -282,7 +283,7 @@ class SetDataBuilderImpl implements SetDataBuilder, BackgroundOperation<PathAndB
                 }
             }
         );
-        trace.commit();
+        trace.setRequestBytesLength(data).setPath(path).setStat(resultStat).commit();
         return resultStat;
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
index 1e5f371..b108099 100755
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
@@ -18,7 +18,7 @@
  */
 package org.apache.curator.framework.imps;
 
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.BackgroundCallback;
 import org.apache.curator.framework.api.CuratorEvent;
 import org.apache.curator.framework.api.CuratorEventType;
@@ -94,7 +94,7 @@ public class SyncBuilderImpl implements SyncBuilder, BackgroundOperation<String>
     {
         try
         {
-            final TimeTrace trace = client.getZookeeperClient().startTracer("SyncBuilderImpl-Background");
+            final OperationTrace trace = client.getZookeeperClient().startAdvancedTracer("SyncBuilderImpl-Background");
             final String path = operationAndData.getData();
             String adjustedPath = client.fixForNamespace(path);
 
@@ -103,7 +103,7 @@ public class SyncBuilderImpl implements SyncBuilder, BackgroundOperation<String>
                 @Override
                 public void processResult(int rc, String path, Object ctx)
                 {
-                    trace.commit();
+                    trace.setReturnCode(rc).setPath(path).commit();
                     CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SYNC, rc, path, path, ctx, null, null, null, null, null);
                     client.processBackgroundOperation(operationAndData, event);
                 }

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/curator-framework/src/main/java/org/apache/curator/framework/imps/TempGetDataBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/TempGetDataBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/TempGetDataBuilderImpl.java
index 061794b..8ee527e 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/TempGetDataBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/TempGetDataBuilderImpl.java
@@ -19,7 +19,7 @@
 package org.apache.curator.framework.imps;
 
 import org.apache.curator.RetryLoop;
-import org.apache.curator.TimeTrace;
+import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.api.Pathable;
 import org.apache.curator.framework.api.StatPathable;
 import org.apache.curator.framework.api.TempGetDataBuilder;
@@ -58,7 +58,7 @@ class TempGetDataBuilderImpl implements TempGetDataBuilder
     {
         final String    localPath = client.fixForNamespace(path);
 
-        TimeTrace       trace = client.getZookeeperClient().startTracer("GetDataBuilderImpl-Foreground");
+        OperationTrace       trace = client.getZookeeperClient().startAdvancedTracer("GetDataBuilderImpl-Foreground");
         byte[]          responseData = RetryLoop.callWithRetry
         (
             client.getZookeeperClient(),
@@ -71,7 +71,7 @@ class TempGetDataBuilderImpl implements TempGetDataBuilder
                 }
             }
         );
-        trace.commit();
+        trace.setResponseBytesLength(responseData).setPath(path).setStat(responseStat).commit();
 
         return decompress ? client.getCompressionProvider().decompress(path, responseData) : responseData;
     }

http://git-wip-us.apache.org/repos/asf/curator/blob/2f6e2177/src/site/confluence/logging.confluence
----------------------------------------------------------------------
diff --git a/src/site/confluence/logging.confluence b/src/site/confluence/logging.confluence
index 002c655..9f87c52 100644
--- a/src/site/confluence/logging.confluence
+++ b/src/site/confluence/logging.confluence
@@ -9,6 +9,6 @@ Curator uses SLF4J ([[http://www.slf4j.org/]]) for logging. SLF4J is a facade ov
 plug in any (or no) logging framework. See the SLF4J website for details.
 
 h2. Tracing
-Connect Curator tracing to your tracing framework via an instance of {{TracerDriver}}.
+Connect Curator tracing to your tracing framework via an instance of {{TracerDriver}} or {{AdvancedTracerDriver}}.
 Curator calls the various methods (e.g. addTrace() or addCount() ) and your instance proxies the calls to your tracing
 framework. Inform Curator of your tracing driver instance by calling {{CuratorZookeeperClient.setTracerDriver()}}.


[2/4] curator git commit: Merge branch 'CURATOR-349' of github.com:lvfangmin/curator into CURATOR-349

Posted by ca...@apache.org.
Merge branch 'CURATOR-349' of github.com:lvfangmin/curator into CURATOR-349


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/b51bb011
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/b51bb011
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/b51bb011

Branch: refs/heads/CURATOR-3.0
Commit: b51bb01176940896cad5408a453c524fcfe0fc49
Parents: 8c1b4be 2f6e217
Author: randgalt <ra...@apache.org>
Authored: Tue Oct 25 10:14:04 2016 -0500
Committer: randgalt <ra...@apache.org>
Committed: Tue Oct 25 10:14:04 2016 -0500

----------------------------------------------------------------------
 .../org/apache/curator/ConnectionState.java     |  37 ++++-
 .../apache/curator/CuratorZookeeperClient.java  |  15 +-
 .../main/java/org/apache/curator/RetryLoop.java |   7 +-
 .../curator/drivers/AdvancedTracerDriver.java   |  50 ++++++
 .../org/apache/curator/drivers/EventTrace.java  |  53 ++++++
 .../apache/curator/drivers/OperationTrace.java  | 162 +++++++++++++++++++
 .../framework/imps/BackgroundSyncImpl.java      |  11 +-
 .../framework/imps/CreateBuilderImpl.java       |  17 +-
 .../framework/imps/CuratorFrameworkImpl.java    |   4 +-
 .../framework/imps/DeleteBuilderImpl.java       |  10 +-
 .../framework/imps/ExistsBuilderImpl.java       |  14 +-
 .../FindAndDeleteProtectedNodeInBackground.java |   6 +-
 .../framework/imps/GetACLBuilderImpl.java       |  10 +-
 .../framework/imps/GetChildrenBuilderImpl.java  |  10 +-
 .../framework/imps/GetDataBuilderImpl.java      |  10 +-
 .../framework/imps/SetACLBuilderImpl.java       |  10 +-
 .../framework/imps/SetDataBuilderImpl.java      |  13 +-
 .../curator/framework/imps/SyncBuilderImpl.java |   6 +-
 .../framework/imps/TempGetDataBuilderImpl.java  |   6 +-
 src/site/confluence/logging.confluence          |   2 +-
 20 files changed, 380 insertions(+), 73 deletions(-)
----------------------------------------------------------------------



[3/4] curator git commit: CURATOR-356 Allow SASL configuration for TestingServer

Posted by ca...@apache.org.
CURATOR-356 Allow SASL configuration for TestingServer


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/dd20f1db
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/dd20f1db
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/dd20f1db

Branch: refs/heads/CURATOR-3.0
Commit: dd20f1dbed3879372483d7e8f7eb05d920707168
Parents: b51bb01
Author: eolivelli <eo...@gmail.com>
Authored: Wed Oct 26 13:43:21 2016 +0200
Committer: eolivelli <eo...@gmail.com>
Committed: Wed Oct 26 13:43:21 2016 +0200

----------------------------------------------------------------------
 .../org/apache/curator/test/InstanceSpec.java   | 28 ++++++++++-
 .../curator/test/QuorumConfigBuilder.java       |  7 +++
 .../curator/test/TestQuorumConfigBuilder.java   | 49 ++++++++++++++++++++
 3 files changed, 82 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/dd20f1db/curator-test/src/main/java/org/apache/curator/test/InstanceSpec.java
----------------------------------------------------------------------
diff --git a/curator-test/src/main/java/org/apache/curator/test/InstanceSpec.java b/curator-test/src/main/java/org/apache/curator/test/InstanceSpec.java
index b39a949..32b1738 100644
--- a/curator-test/src/main/java/org/apache/curator/test/InstanceSpec.java
+++ b/curator-test/src/main/java/org/apache/curator/test/InstanceSpec.java
@@ -25,6 +25,8 @@ import java.io.IOException;
 import java.net.InetAddress;
 import java.net.ServerSocket;
 import java.net.UnknownHostException;
+import java.util.Collections;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -69,6 +71,7 @@ public class InstanceSpec
     private final int serverId;
     private final int tickTime;
     private final int maxClientCnxns;
+    private final Map<String,Object> customProperties;
 
     public static InstanceSpec newInstanceSpec()
     {
@@ -113,7 +116,7 @@ public class InstanceSpec
      */
     public InstanceSpec(File dataDirectory, int port, int electionPort, int quorumPort, boolean deleteDataDirectoryOnClose, int serverId)
     {
-        this(dataDirectory, port, electionPort, quorumPort, deleteDataDirectoryOnClose, serverId, -1, -1);
+        this(dataDirectory, port, electionPort, quorumPort, deleteDataDirectoryOnClose, serverId, -1, -1, null);
     }
 
     /**
@@ -126,7 +129,22 @@ public class InstanceSpec
      * @param tickTime                   tickTime. Set -1 to used fault server configuration
      * @param maxClientCnxns             max number of client connections from the same IP. Set -1 to use default server configuration
      */
-    public InstanceSpec(File dataDirectory, int port, int electionPort, int quorumPort, boolean deleteDataDirectoryOnClose, int serverId, int tickTime, int maxClientCnxns)
+    public InstanceSpec(File dataDirectory, int port, int electionPort, int quorumPort, boolean deleteDataDirectoryOnClose, int serverId, int tickTime, int maxClientCnxns) {
+        this(dataDirectory, port, electionPort, quorumPort, deleteDataDirectoryOnClose, serverId, tickTime, maxClientCnxns, null);
+    }
+
+    /**
+     * @param dataDirectory              where to store data/logs/etc.
+     * @param port                       the port to listen on - each server in the ensemble must use a unique port
+     * @param electionPort               the electionPort to listen on - each server in the ensemble must use a unique electionPort
+     * @param quorumPort                 the quorumPort to listen on - each server in the ensemble must use a unique quorumPort
+     * @param deleteDataDirectoryOnClose if true, the data directory will be deleted when {@link TestingCluster#close()} is called
+     * @param serverId                   the server ID for the instance
+     * @param tickTime                   tickTime. Set -1 to used fault server configuration
+     * @param maxClientCnxns             max number of client connections from the same IP. Set -1 to use default server configuration
+     * @param customProperties           other properties to be passed to the server
+     */
+    public InstanceSpec(File dataDirectory, int port, int electionPort, int quorumPort, boolean deleteDataDirectoryOnClose, int serverId, int tickTime, int maxClientCnxns, Map<String,Object> customProperties)
     {
         this.dataDirectory = (dataDirectory != null) ? dataDirectory : Files.createTempDir();
         this.port = (port >= 0) ? port : getRandomPort();
@@ -136,6 +154,7 @@ public class InstanceSpec
         this.serverId = (serverId >= 0) ? serverId : nextServerId.getAndIncrement();
         this.tickTime = (tickTime > 0 ? tickTime : -1); // -1 to set default value
         this.maxClientCnxns = (maxClientCnxns >= 0 ? maxClientCnxns : -1); // -1 to set default value
+        this.customProperties = customProperties != null ? Collections.<String,Object>unmodifiableMap(customProperties) : Collections.<String,Object>emptyMap();
     }
 
     public int getServerId()
@@ -183,6 +202,10 @@ public class InstanceSpec
         return deleteDataDirectoryOnClose;
     }
 
+    public Map<String, Object> getCustomProperties() {
+        return customProperties;
+    }
+
     @Override
     public String toString()
     {
@@ -195,6 +218,7 @@ public class InstanceSpec
             ", serverId=" + serverId +
             ", tickTime=" + tickTime +
             ", maxClientCnxns=" + maxClientCnxns +
+            ", customProperties=" + customProperties +
             "} " + super.toString();
     }
 

http://git-wip-us.apache.org/repos/asf/curator/blob/dd20f1db/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java
----------------------------------------------------------------------
diff --git a/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java b/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java
index 8add08e..4e20163 100644
--- a/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java
+++ b/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java
@@ -25,6 +25,7 @@ import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
 import java.io.File;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
 @SuppressWarnings("UnusedDeclaration")
@@ -102,6 +103,12 @@ public class QuorumConfigBuilder
                 properties.setProperty("server." + thisSpec.getServerId(), String.format("localhost:%d:%d", thisSpec.getQuorumPort(), thisSpec.getElectionPort()));
             }
         }
+        Map<String,Object> customProperties = spec.getCustomProperties();
+        if (customProperties != null) {
+            for (Map.Entry<String,Object> property : customProperties.entrySet()) {
+                properties.put(property.getKey(), property.getValue());
+            }
+        }
 
         QuorumPeerConfig config = new QuorumPeerConfig();
         config.parseProperties(properties);

http://git-wip-us.apache.org/repos/asf/curator/blob/dd20f1db/curator-test/src/test/java/org/apache/curator/test/TestQuorumConfigBuilder.java
----------------------------------------------------------------------
diff --git a/curator-test/src/test/java/org/apache/curator/test/TestQuorumConfigBuilder.java b/curator-test/src/test/java/org/apache/curator/test/TestQuorumConfigBuilder.java
new file mode 100644
index 0000000..cfb89c5
--- /dev/null
+++ b/curator-test/src/test/java/org/apache/curator/test/TestQuorumConfigBuilder.java
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package org.apache.curator.test;
+
+import java.util.HashMap;
+import java.util.Map;
+import static org.testng.AssertJUnit.assertEquals;
+import org.testng.annotations.Test;
+
+/**
+ * Test QuorumConfigBuilder
+ */
+public class TestQuorumConfigBuilder {
+
+    @Test
+    public void testCustomProperties() throws Exception {
+        Map<String,Object> customProperties = new HashMap<String,Object>();
+        customProperties.put("authProvider.1", "org.apache.zookeeper.server.auth.SASLAuthenticationProvider");
+        customProperties.put("kerberos.removeHostFromPrincipal", "true");
+        customProperties.put("kerberos.removeRealmFromPrincipal", "true");
+        InstanceSpec spec = new InstanceSpec(null, -1, -1, -1, true, 1,-1, -1,customProperties);
+        TestingServer server = new TestingServer(spec, true);
+        try {
+            assertEquals("org.apache.zookeeper.server.auth.SASLAuthenticationProvider", System.getProperty("zookeeper.authProvider.1"));
+            assertEquals("true", System.getProperty("zookeeper.kerberos.removeHostFromPrincipal"));
+            assertEquals("true", System.getProperty("zookeeper.kerberos.removeRealmFromPrincipal"));
+        } finally {
+            server.close();
+        }
+    }
+}
\ No newline at end of file


[4/4] curator git commit: Merge branch 'master' into CURATOR-3.0

Posted by ca...@apache.org.
Merge branch 'master' into CURATOR-3.0

Conflicts:
	curator-client/src/main/java/org/apache/curator/ConnectionState.java
	curator-client/src/main/java/org/apache/curator/CuratorZookeeperClient.java
	curator-client/src/main/java/org/apache/curator/RetryLoop.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/BackgroundSyncImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/d8798c21
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/d8798c21
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/d8798c21

Branch: refs/heads/CURATOR-3.0
Commit: d8798c21de10926cecd2ffc11f1ed7ce695c330a
Parents: d034aea dd20f1d
Author: Cam McKenzie <ca...@apache.org>
Authored: Thu Oct 27 09:51:02 2016 +1100
Committer: Cam McKenzie <ca...@apache.org>
Committed: Thu Oct 27 09:51:02 2016 +1100

----------------------------------------------------------------------
 .../org/apache/curator/test/InstanceSpec.java   | 28 ++++++++++-
 .../curator/test/QuorumConfigBuilder.java       |  7 +++
 .../curator/test/TestQuorumConfigBuilder.java   | 49 ++++++++++++++++++++
 3 files changed, 82 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/d8798c21/curator-test/src/main/java/org/apache/curator/test/InstanceSpec.java
----------------------------------------------------------------------
diff --cc curator-test/src/main/java/org/apache/curator/test/InstanceSpec.java
index 6d495df,32b1738..0a71161
--- a/curator-test/src/main/java/org/apache/curator/test/InstanceSpec.java
+++ b/curator-test/src/main/java/org/apache/curator/test/InstanceSpec.java
@@@ -69,11 -71,8 +71,12 @@@ public class InstanceSpe
      private final int serverId;
      private final int tickTime;
      private final int maxClientCnxns;
+     private final Map<String,Object> customProperties;
  
 +    public static void reset() {
 +        nextServerId.set(1);
 +    }
 +
      public static InstanceSpec newInstanceSpec()
      {
          return new InstanceSpec(null, -1, -1, -1, true, -1, -1, -1);

http://git-wip-us.apache.org/repos/asf/curator/blob/d8798c21/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java
----------------------------------------------------------------------
diff --cc curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java
index 17bb185,4e20163..5baf5ce
--- a/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java
+++ b/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java
@@@ -23,11 -22,10 +23,12 @@@ import com.google.common.base.Throwable
  import com.google.common.collect.ImmutableList;
  import com.google.common.io.Files;
  import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
 +import java.io.Closeable;
  import java.io.File;
 +import java.io.IOException;
  import java.util.Collection;
  import java.util.List;
+ import java.util.Map;
  import java.util.Properties;
  
  @SuppressWarnings("UnusedDeclaration")
@@@ -123,19 -100,17 +124,25 @@@ public class QuorumConfigBuilder implem
          {
              for ( InstanceSpec thisSpec : instanceSpecs )
              {
 -                properties.setProperty("server." + thisSpec.getServerId(), String.format("localhost:%d:%d", thisSpec.getQuorumPort(), thisSpec.getElectionPort()));
 +                properties.setProperty("server." + thisSpec.getServerId(), String.format("localhost:%d:%d;localhost:%d", thisSpec.getQuorumPort(), thisSpec.getElectionPort(), thisSpec.getPort()));
              }
          }
+         Map<String,Object> customProperties = spec.getCustomProperties();
+         if (customProperties != null) {
+             for (Map.Entry<String,Object> property : customProperties.entrySet()) {
+                 properties.put(property.getKey(), property.getValue());
+             }
+         }
  
 -        QuorumPeerConfig config = new QuorumPeerConfig();
 +        QuorumPeerConfig config = new QuorumPeerConfig()
 +        {
 +            {
 +                if ( fakeConfigFile != null )
 +                {
 +                    configFileStr = fakeConfigFile.getPath();
 +                }
 +            }
 +        };
          config.parseProperties(properties);
          return config;
      }