You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@bookkeeper.apache.org by GitBox <gi...@apache.org> on 2018/12/12 01:23:09 UTC

[GitHub] sijie closed pull request #1878: [stats][doc] Add @StatsDoc annotation for bookkeeper client stats

sijie closed pull request #1878: [stats][doc] Add @StatsDoc annotation for bookkeeper client stats
URL: https://github.com/apache/bookkeeper/pull/1878
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperClientStats.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperClientStats.java
index 2fa6753b10..8b358b6ead 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperClientStats.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperClientStats.java
@@ -21,6 +21,7 @@
 
 package org.apache.bookkeeper.client;
 
+import org.apache.bookkeeper.client.impl.BookKeeperClientStatsImpl;
 import org.apache.bookkeeper.stats.Counter;
 import org.apache.bookkeeper.stats.Gauge;
 import org.apache.bookkeeper.stats.OpStatsLogger;
@@ -30,6 +31,8 @@
  * List of constants for defining client stats names.
  */
 public interface BookKeeperClientStats {
+    String CATEGORY_CLIENT = "client";
+
     String CLIENT_SCOPE = "bookkeeper_client";
 
     // Metadata Operations
@@ -114,119 +117,7 @@
     void registerPendingAddsGauge(Gauge<Integer> gauge);
 
     static BookKeeperClientStats newInstance(StatsLogger stats) {
-        OpStatsLogger createOpLogger = stats.getOpStatsLogger(CREATE_OP);
-        OpStatsLogger deleteOpLogger = stats.getOpStatsLogger(DELETE_OP);
-        OpStatsLogger openOpLogger = stats.getOpStatsLogger(OPEN_OP);
-        OpStatsLogger recoverOpLogger = stats.getOpStatsLogger(RECOVER_OP);
-        OpStatsLogger readOpLogger = stats.getOpStatsLogger(READ_OP);
-        Counter readOpDmCounter = stats.getCounter(READ_OP_DM);
-        OpStatsLogger readLacAndEntryOpLogger = stats.getOpStatsLogger(READ_LAST_CONFIRMED_AND_ENTRY);
-        OpStatsLogger readLacAndEntryRespLogger = stats.getOpStatsLogger(READ_LAST_CONFIRMED_AND_ENTRY_RESPONSE);
-        OpStatsLogger addOpLogger = stats.getOpStatsLogger(ADD_OP);
-        OpStatsLogger forceOpLogger = stats.getOpStatsLogger(FORCE_OP);
-        Counter addOpUrCounter = stats.getCounter(ADD_OP_UR);
-        OpStatsLogger writeLacOpLogger = stats.getOpStatsLogger(WRITE_LAC_OP);
-        OpStatsLogger readLacOpLogger = stats.getOpStatsLogger(READ_LAC_OP);
-        OpStatsLogger recoverAddEntriesStats = stats.getOpStatsLogger(LEDGER_RECOVER_ADD_ENTRIES);
-        OpStatsLogger recoverReadEntriesStats = stats.getOpStatsLogger(LEDGER_RECOVER_READ_ENTRIES);
-
-        Counter ensembleChangeCounter = stats.getCounter(ENSEMBLE_CHANGES);
-        Counter lacUpdateHitsCounter = stats.getCounter(LAC_UPDATE_HITS);
-        Counter lacUpdateMissesCounter = stats.getCounter(LAC_UPDATE_MISSES);
-        OpStatsLogger clientChannelWriteWaitStats = stats.getOpStatsLogger(CLIENT_CHANNEL_WRITE_WAIT);
-
-        Counter speculativeReadCounter = stats.getCounter(SPECULATIVE_READ_COUNT);
-
-        return new BookKeeperClientStats() {
-            @Override
-            public OpStatsLogger getCreateOpLogger() {
-                return createOpLogger;
-            }
-            @Override
-            public OpStatsLogger getOpenOpLogger() {
-                return openOpLogger;
-            }
-            @Override
-            public OpStatsLogger getDeleteOpLogger() {
-                return deleteOpLogger;
-            }
-            @Override
-            public OpStatsLogger getRecoverOpLogger() {
-                return recoverOpLogger;
-            }
-            @Override
-            public OpStatsLogger getReadOpLogger() {
-                return readOpLogger;
-            }
-            @Override
-            public OpStatsLogger getReadLacAndEntryOpLogger() {
-                return readLacAndEntryOpLogger;
-            }
-            @Override
-            public OpStatsLogger getReadLacAndEntryRespLogger() {
-                return readLacAndEntryRespLogger;
-            }
-            @Override
-            public OpStatsLogger getAddOpLogger() {
-                return addOpLogger;
-            }
-            @Override
-            public OpStatsLogger getForceOpLogger() {
-                return forceOpLogger;
-            }
-            @Override
-            public OpStatsLogger getWriteLacOpLogger() {
-                return writeLacOpLogger;
-            }
-            @Override
-            public OpStatsLogger getReadLacOpLogger() {
-                return readLacOpLogger;
-            }
-            @Override
-            public OpStatsLogger getRecoverAddCountLogger() {
-                return recoverAddEntriesStats;
-            }
-            @Override
-            public OpStatsLogger getRecoverReadCountLogger() {
-                return recoverReadEntriesStats;
-            }
-            @Override
-            public Counter getReadOpDmCounter() {
-                return readOpDmCounter;
-            }
-            @Override
-            public Counter getAddOpUrCounter() {
-                return addOpUrCounter;
-            }
-            @Override
-            public Counter getSpeculativeReadCounter() {
-                return speculativeReadCounter;
-            }
-            @Override
-            public Counter getEnsembleChangeCounter() {
-                return ensembleChangeCounter;
-            }
-            @Override
-            public Counter getLacUpdateHitsCounter() {
-                return lacUpdateHitsCounter;
-            }
-            @Override
-            public Counter getLacUpdateMissesCounter() {
-                return lacUpdateMissesCounter;
-            }
-            @Override
-            public OpStatsLogger getClientChannelWriteWaitLogger() {
-                return clientChannelWriteWaitStats;
-            }
-            @Override
-            public Counter getEnsembleBookieDistributionCounter(String bookie) {
-                return stats.getCounter(LEDGER_ENSEMBLE_BOOKIE_DISTRIBUTION + "-" + bookie);
-            }
-            @Override
-            public void registerPendingAddsGauge(Gauge<Integer> gauge) {
-                stats.registerGauge(PENDING_ADDS, gauge);
-            }
-        };
+        return new BookKeeperClientStatsImpl(stats);
     }
 
 }
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieWatcherImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieWatcherImpl.java
index 2941a41fa1..8b14b77174 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieWatcherImpl.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieWatcherImpl.java
@@ -19,6 +19,8 @@
 
 import static org.apache.bookkeeper.bookie.BookKeeperServerStats.NEW_ENSEMBLE_TIME;
 import static org.apache.bookkeeper.bookie.BookKeeperServerStats.REPLACE_BOOKIE_TIME;
+import static org.apache.bookkeeper.bookie.BookKeeperServerStats.WATCHER_SCOPE;
+import static org.apache.bookkeeper.client.BookKeeperClientStats.CREATE_OP;
 
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
@@ -43,6 +45,7 @@
 import org.apache.bookkeeper.net.BookieSocketAddress;
 import org.apache.bookkeeper.stats.OpStatsLogger;
 import org.apache.bookkeeper.stats.StatsLogger;
+import org.apache.bookkeeper.stats.annotations.StatsDoc;
 
 /**
  * This class is responsible for maintaining a consistent view of what bookies
@@ -51,6 +54,10 @@
  * replacement
  *
  */
+@StatsDoc(
+    name = WATCHER_SCOPE,
+    help = "Bookie watcher related stats"
+)
 @Slf4j
 class BookieWatcherImpl implements BookieWatcher {
 
@@ -70,7 +77,16 @@
     private final ClientConfiguration conf;
     private final RegistrationClient registrationClient;
     private final EnsemblePlacementPolicy placementPolicy;
+    @StatsDoc(
+        name = NEW_ENSEMBLE_TIME,
+        help = "operation stats of new ensembles",
+        parent = CREATE_OP
+    )
     private final OpStatsLogger newEnsembleTimer;
+    @StatsDoc(
+        name = REPLACE_BOOKIE_TIME,
+        help = "operation stats of replacing bookie in an ensemble"
+    )
     private final OpStatsLogger replaceBookieTimer;
 
     // Bookies that will not be preferred to be chosen in a new ensemble
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java
index 28929cf9a8..765dec026e 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java
@@ -20,6 +20,11 @@
 package org.apache.bookkeeper.client;
 
 import static org.apache.bookkeeper.client.LedgerHandle.INVALID_ENTRY_ID;
+import static org.apache.bookkeeper.replication.ReplicationStats.NUM_BYTES_READ;
+import static org.apache.bookkeeper.replication.ReplicationStats.NUM_BYTES_WRITTEN;
+import static org.apache.bookkeeper.replication.ReplicationStats.NUM_ENTRIES_READ;
+import static org.apache.bookkeeper.replication.ReplicationStats.NUM_ENTRIES_WRITTEN;
+import static org.apache.bookkeeper.replication.ReplicationStats.REPLICATION_WORKER_SCOPE;
 
 import io.netty.buffer.Unpooled;
 
@@ -41,11 +46,11 @@
 import org.apache.bookkeeper.proto.BookieProtocol;
 import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.MultiCallback;
 import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.WriteCallback;
-import org.apache.bookkeeper.replication.ReplicationStats;
 import org.apache.bookkeeper.stats.Counter;
 import org.apache.bookkeeper.stats.NullStatsLogger;
 import org.apache.bookkeeper.stats.OpStatsLogger;
 import org.apache.bookkeeper.stats.StatsLogger;
+import org.apache.bookkeeper.stats.annotations.StatsDoc;
 import org.apache.bookkeeper.util.ByteBufList;
 import org.apache.zookeeper.AsyncCallback;
 import org.slf4j.Logger;
@@ -55,23 +60,43 @@
  * This is the helper class for replicating the fragments from one bookie to
  * another.
  */
+@StatsDoc(
+    name = REPLICATION_WORKER_SCOPE,
+    help = "Ledger fragment replicator related stats"
+)
 public class LedgerFragmentReplicator {
 
     // BookKeeper instance
     private BookKeeper bkc;
     private StatsLogger statsLogger;
+    @StatsDoc(
+        name = NUM_ENTRIES_READ,
+        help = "Number of entries read by the replicator"
+    )
     private final Counter numEntriesRead;
+    @StatsDoc(
+        name = NUM_BYTES_READ,
+        help = "The distribution of size of entries read by the replicator"
+    )
     private final OpStatsLogger numBytesRead;
+    @StatsDoc(
+        name = NUM_ENTRIES_WRITTEN,
+        help = "Number of entries written by the replicator"
+    )
     private final Counter numEntriesWritten;
+    @StatsDoc(
+        name = NUM_BYTES_WRITTEN,
+        help = "The distribution of size of entries written by the replicator"
+    )
     private final OpStatsLogger numBytesWritten;
 
     public LedgerFragmentReplicator(BookKeeper bkc, StatsLogger statsLogger) {
         this.bkc = bkc;
         this.statsLogger = statsLogger;
-        numEntriesRead = this.statsLogger.getCounter(ReplicationStats.NUM_ENTRIES_READ);
-        numBytesRead = this.statsLogger.getOpStatsLogger(ReplicationStats.NUM_BYTES_READ);
-        numEntriesWritten = this.statsLogger.getCounter(ReplicationStats.NUM_ENTRIES_WRITTEN);
-        numBytesWritten = this.statsLogger.getOpStatsLogger(ReplicationStats.NUM_BYTES_WRITTEN);
+        numEntriesRead = this.statsLogger.getCounter(NUM_ENTRIES_READ);
+        numBytesRead = this.statsLogger.getOpStatsLogger(NUM_BYTES_READ);
+        numEntriesWritten = this.statsLogger.getCounter(NUM_ENTRIES_WRITTEN);
+        numBytesWritten = this.statsLogger.getOpStatsLogger(NUM_BYTES_WRITTEN);
     }
 
     public LedgerFragmentReplicator(BookKeeper bkc) {
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java
index 578d49e7ed..7578c416ee 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java
@@ -18,6 +18,10 @@
 package org.apache.bookkeeper.client;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.bookkeeper.bookie.BookKeeperServerStats.BOOKIES_JOINED;
+import static org.apache.bookkeeper.bookie.BookKeeperServerStats.BOOKIES_LEFT;
+import static org.apache.bookkeeper.client.BookKeeperClientStats.CLIENT_SCOPE;
+import static org.apache.bookkeeper.client.BookKeeperClientStats.READ_REQUESTS_REORDERED;
 import static org.apache.bookkeeper.client.RegionAwareEnsemblePlacementPolicy.UNKNOWN_REGION;
 
 import com.google.common.cache.Cache;
@@ -44,7 +48,6 @@
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.function.Supplier;
 
-import org.apache.bookkeeper.bookie.BookKeeperServerStats;
 import org.apache.bookkeeper.client.BKException.BKNotEnoughBookiesException;
 import org.apache.bookkeeper.client.BookieInfoReader.BookieInfo;
 import org.apache.bookkeeper.client.WeightedRandomSelection.WeightedObject;
@@ -63,6 +66,7 @@
 import org.apache.bookkeeper.net.StabilizeNetworkTopology;
 import org.apache.bookkeeper.stats.OpStatsLogger;
 import org.apache.bookkeeper.stats.StatsLogger;
+import org.apache.bookkeeper.stats.annotations.StatsDoc;
 import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -72,6 +76,10 @@
  *
  * <p>Make most of the class and methods as protected, so it could be extended to implement other algorithms.
  */
+@StatsDoc(
+    name = CLIENT_SCOPE,
+    help = "BookKeeper client stats"
+)
 public class RackawareEnsemblePlacementPolicyImpl extends TopologyAwareEnsemblePlacementPolicy {
 
     static final Logger LOG = LoggerFactory.getLogger(RackawareEnsemblePlacementPolicyImpl.class);
@@ -204,8 +212,20 @@ public void reloadCachedMappings() {
     // looks like these only assigned in the same thread as constructor, immediately after constructor;
     // no need to make volatile
     protected StatsLogger statsLogger = null;
+    @StatsDoc(
+        name = BOOKIES_JOINED,
+        help = "The distribution of number of bookies joined the cluster on each network topology change"
+    )
     protected OpStatsLogger bookiesJoinedCounter = null;
+    @StatsDoc(
+        name = BOOKIES_LEFT,
+        help = "The distribution of number of bookies left the cluster on each network topology change"
+    )
     protected OpStatsLogger bookiesLeftCounter = null;
+    @StatsDoc(
+        name = READ_REQUESTS_REORDERED,
+        help = "The distribution of number of bookies reordered on each read request"
+    )
     protected OpStatsLogger readReorderedCounter = null;
 
     private String defaultRack = NetworkTopology.DEFAULT_RACK;
@@ -244,9 +264,9 @@ protected RackawareEnsemblePlacementPolicyImpl initialize(DNSToSwitchMapping dns
                                                               StatsLogger statsLogger) {
         checkNotNull(statsLogger, "statsLogger should not be null, use NullStatsLogger instead.");
         this.statsLogger = statsLogger;
-        this.bookiesJoinedCounter = statsLogger.getOpStatsLogger(BookKeeperServerStats.BOOKIES_JOINED);
-        this.bookiesLeftCounter = statsLogger.getOpStatsLogger(BookKeeperServerStats.BOOKIES_LEFT);
-        this.readReorderedCounter = statsLogger.getOpStatsLogger(BookKeeperClientStats.READ_REQUESTS_REORDERED);
+        this.bookiesJoinedCounter = statsLogger.getOpStatsLogger(BOOKIES_JOINED);
+        this.bookiesLeftCounter = statsLogger.getOpStatsLogger(BOOKIES_LEFT);
+        this.readReorderedCounter = statsLogger.getOpStatsLogger(READ_REQUESTS_REORDERED);
         this.reorderReadsRandom = reorderReadsRandom;
         this.stabilizePeriodSeconds = stabilizePeriodSeconds;
         this.reorderThresholdPendingRequests = reorderThresholdPendingRequests;
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/impl/BookKeeperClientStatsImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/impl/BookKeeperClientStatsImpl.java
new file mode 100644
index 0000000000..a29621a0d0
--- /dev/null
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/impl/BookKeeperClientStatsImpl.java
@@ -0,0 +1,259 @@
+/*
+ * 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.bookkeeper.client.impl;
+
+import static org.apache.bookkeeper.client.BookKeeperClientStats.CATEGORY_CLIENT;
+import static org.apache.bookkeeper.client.BookKeeperClientStats.CLIENT_SCOPE;
+
+import org.apache.bookkeeper.client.BookKeeperClientStats;
+import org.apache.bookkeeper.stats.Counter;
+import org.apache.bookkeeper.stats.Gauge;
+import org.apache.bookkeeper.stats.OpStatsLogger;
+import org.apache.bookkeeper.stats.StatsLogger;
+import org.apache.bookkeeper.stats.annotations.StatsDoc;
+
+/**
+ * The default implementation of {@link BookKeeperClientStats}.
+ */
+@StatsDoc(
+    name = CLIENT_SCOPE,
+    category = CATEGORY_CLIENT,
+    help = "BookKeeper client stats"
+)
+public class BookKeeperClientStatsImpl implements BookKeeperClientStats {
+    private final StatsLogger stats;
+    @StatsDoc(
+        name = CREATE_OP,
+        help = "operation stats of creating ledgers"
+    )
+    private final OpStatsLogger createOpLogger;
+    @StatsDoc(
+        name = DELETE_OP,
+        help = "operation stats of deleting ledgers"
+    )
+    private final OpStatsLogger deleteOpLogger;
+    @StatsDoc(
+        name = OPEN_OP,
+        help = "operation stats of opening ledgers"
+    )
+    private final OpStatsLogger openOpLogger;
+    @StatsDoc(
+        name = RECOVER_OP,
+        help = "operation stats of recovering ledgers"
+    )
+    private final OpStatsLogger recoverOpLogger;
+    @StatsDoc(
+        name = READ_OP,
+        help = "operation stats of reading entries requests"
+    )
+    private final OpStatsLogger readOpLogger;
+    @StatsDoc(
+        name = READ_OP_DM,
+        help = "the number of read entries hitting DigestMismatch errors"
+    )
+    private final Counter readOpDmCounter;
+    @StatsDoc(
+        name = READ_LAST_CONFIRMED_AND_ENTRY,
+        help = "operation stats of read_last_confirmed_and_entry requests"
+    )
+    private final OpStatsLogger readLacAndEntryOpLogger;
+    @StatsDoc(
+        name = READ_LAST_CONFIRMED_AND_ENTRY_RESPONSE,
+        help = "operation stats of read_last_confirmed_and_entry responses"
+    )
+    private final OpStatsLogger readLacAndEntryRespLogger;
+    @StatsDoc(
+        name = ADD_OP,
+        help = "operation stats of adding entries requests"
+    )
+    private final OpStatsLogger addOpLogger;
+    @StatsDoc(
+        name = FORCE_OP,
+        help = "operation stats of force requests"
+    )
+    private final OpStatsLogger forceOpLogger;
+    @StatsDoc(
+        name = ADD_OP_UR,
+        help = "the number of add entries under replication"
+    )
+    private final Counter addOpUrCounter;
+    @StatsDoc(
+        name = WRITE_LAC_OP,
+        help = "operation stats of write_lac requests"
+    )
+    private final OpStatsLogger writeLacOpLogger;
+    @StatsDoc(
+        name = READ_LAC_OP,
+        help = "operation stats of read_lac requests"
+    )
+    private final OpStatsLogger readLacOpLogger;
+    @StatsDoc(
+        name = LEDGER_RECOVER_ADD_ENTRIES,
+        help = "the distribution of entries written in ledger recovery requests"
+    )
+    private final OpStatsLogger recoverAddEntriesStats;
+    @StatsDoc(
+        name = LEDGER_RECOVER_READ_ENTRIES,
+        help = "the distribution of entries read in ledger recovery requests"
+    )
+    private final OpStatsLogger recoverReadEntriesStats;
+
+    @StatsDoc(
+        name = ENSEMBLE_CHANGES,
+        help = "The number of ensemble changes"
+    )
+    private final Counter ensembleChangeCounter;
+    @StatsDoc(
+        name = LAC_UPDATE_HITS,
+        help = "The number of successful lac updates on piggybacked responses"
+    )
+    private final Counter lacUpdateHitsCounter;
+    @StatsDoc(
+        name = LAC_UPDATE_MISSES,
+        help = "The number of unsuccessful lac updates on piggybacked responses"
+    )
+    private final Counter lacUpdateMissesCounter;
+    @StatsDoc(
+        name = CLIENT_CHANNEL_WRITE_WAIT,
+        help = " The latency distribution of waiting time on channel being writable"
+    )
+    private final OpStatsLogger clientChannelWriteWaitStats;
+    @StatsDoc(
+        name = SPECULATIVE_READ_COUNT,
+        help = "The number of speculative read requests"
+    )
+    private final Counter speculativeReadCounter;
+
+
+    public BookKeeperClientStatsImpl(StatsLogger stats) {
+        this.stats = stats;
+        this.createOpLogger = stats.getOpStatsLogger(CREATE_OP);
+        this.deleteOpLogger = stats.getOpStatsLogger(DELETE_OP);
+        this.openOpLogger = stats.getOpStatsLogger(OPEN_OP);
+        this.recoverOpLogger = stats.getOpStatsLogger(RECOVER_OP);
+        this.readOpLogger = stats.getOpStatsLogger(READ_OP);
+        this.readOpDmCounter = stats.getCounter(READ_OP_DM);
+        this.readLacAndEntryOpLogger = stats.getOpStatsLogger(READ_LAST_CONFIRMED_AND_ENTRY);
+        this.readLacAndEntryRespLogger = stats.getOpStatsLogger(READ_LAST_CONFIRMED_AND_ENTRY_RESPONSE);
+        this.addOpLogger = stats.getOpStatsLogger(ADD_OP);
+        this.forceOpLogger = stats.getOpStatsLogger(FORCE_OP);
+        this.addOpUrCounter = stats.getCounter(ADD_OP_UR);
+        this.writeLacOpLogger = stats.getOpStatsLogger(WRITE_LAC_OP);
+        this.readLacOpLogger = stats.getOpStatsLogger(READ_LAC_OP);
+        this.recoverAddEntriesStats = stats.getOpStatsLogger(LEDGER_RECOVER_ADD_ENTRIES);
+        this.recoverReadEntriesStats = stats.getOpStatsLogger(LEDGER_RECOVER_READ_ENTRIES);
+
+        this.ensembleChangeCounter = stats.getCounter(ENSEMBLE_CHANGES);
+        this.lacUpdateHitsCounter = stats.getCounter(LAC_UPDATE_HITS);
+        this.lacUpdateMissesCounter = stats.getCounter(LAC_UPDATE_MISSES);
+        this.clientChannelWriteWaitStats = stats.getOpStatsLogger(CLIENT_CHANNEL_WRITE_WAIT);
+
+        speculativeReadCounter = stats.getCounter(SPECULATIVE_READ_COUNT);
+    }
+
+    @Override
+    public OpStatsLogger getCreateOpLogger() {
+        return createOpLogger;
+    }
+    @Override
+    public OpStatsLogger getOpenOpLogger() {
+        return openOpLogger;
+    }
+    @Override
+    public OpStatsLogger getDeleteOpLogger() {
+        return deleteOpLogger;
+    }
+    @Override
+    public OpStatsLogger getRecoverOpLogger() {
+        return recoverOpLogger;
+    }
+    @Override
+    public OpStatsLogger getReadOpLogger() {
+        return readOpLogger;
+    }
+    @Override
+    public OpStatsLogger getReadLacAndEntryOpLogger() {
+        return readLacAndEntryOpLogger;
+    }
+    @Override
+    public OpStatsLogger getReadLacAndEntryRespLogger() {
+        return readLacAndEntryRespLogger;
+    }
+    @Override
+    public OpStatsLogger getAddOpLogger() {
+        return addOpLogger;
+    }
+    @Override
+    public OpStatsLogger getForceOpLogger() {
+        return forceOpLogger;
+    }
+    @Override
+    public OpStatsLogger getWriteLacOpLogger() {
+        return writeLacOpLogger;
+    }
+    @Override
+    public OpStatsLogger getReadLacOpLogger() {
+        return readLacOpLogger;
+    }
+    @Override
+    public OpStatsLogger getRecoverAddCountLogger() {
+        return recoverAddEntriesStats;
+    }
+    @Override
+    public OpStatsLogger getRecoverReadCountLogger() {
+        return recoverReadEntriesStats;
+    }
+    @Override
+    public Counter getReadOpDmCounter() {
+        return readOpDmCounter;
+    }
+    @Override
+    public Counter getAddOpUrCounter() {
+        return addOpUrCounter;
+    }
+    @Override
+    public Counter getSpeculativeReadCounter() {
+        return speculativeReadCounter;
+    }
+    @Override
+    public Counter getEnsembleChangeCounter() {
+        return ensembleChangeCounter;
+    }
+    @Override
+    public Counter getLacUpdateHitsCounter() {
+        return lacUpdateHitsCounter;
+    }
+    @Override
+    public Counter getLacUpdateMissesCounter() {
+        return lacUpdateMissesCounter;
+    }
+    @Override
+    public OpStatsLogger getClientChannelWriteWaitLogger() {
+        return clientChannelWriteWaitStats;
+    }
+    @Override
+    public Counter getEnsembleBookieDistributionCounter(String bookie) {
+        return stats.getCounter(LEDGER_ENSEMBLE_BOOKIE_DISTRIBUTION + "-" + bookie);
+    }
+    @Override
+    public void registerPendingAddsGauge(Gauge<Integer> gauge) {
+        stats.registerGauge(PENDING_ADDS, gauge);
+    }
+}
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java
index 917f6f3323..6839afc8f2 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java
@@ -125,6 +125,7 @@
 import org.apache.bookkeeper.stats.NullStatsLogger;
 import org.apache.bookkeeper.stats.OpStatsLogger;
 import org.apache.bookkeeper.stats.StatsLogger;
+import org.apache.bookkeeper.stats.annotations.StatsDoc;
 import org.apache.bookkeeper.tls.SecurityException;
 import org.apache.bookkeeper.tls.SecurityHandlerFactory;
 import org.apache.bookkeeper.tls.SecurityHandlerFactory.NodeType;
@@ -142,6 +143,10 @@
  * This class manages all details of connection to a particular bookie. It also
  * has reconnect logic if a connection to a bookie fails.
  */
+@StatsDoc(
+    name = BookKeeperClientStats.CHANNEL_SCOPE,
+    help = "Per channel bookie client stats"
+)
 @Sharable
 public class PerChannelBookieClient extends ChannelInboundHandlerAdapter {
 
@@ -177,29 +182,121 @@
         new SynchronizedHashMultiMap<>();
 
     private final StatsLogger statsLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_READ_OP,
+        help = "channel stats of read entries requests"
+    )
     private final OpStatsLogger readEntryOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_TIMEOUT_READ,
+        help = "timeout stats of read entries requests"
+    )
     private final OpStatsLogger readTimeoutOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_ADD_OP,
+        help = "channel stats of add entries requests"
+    )
     private final OpStatsLogger addEntryOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_WRITE_LAC_OP,
+        help = "channel stats of write_lac requests"
+    )
     private final OpStatsLogger writeLacOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_FORCE_OP,
+        help = "channel stats of force requests"
+    )
     private final OpStatsLogger forceLedgerOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_READ_LAC_OP,
+        help = "channel stats of read_lac requests"
+    )
     private final OpStatsLogger readLacOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_TIMEOUT_ADD,
+        help = "timeout stats of add entries requests"
+    )
     private final OpStatsLogger addTimeoutOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_TIMEOUT_WRITE_LAC,
+        help = "timeout stats of write_lac requests"
+    )
     private final OpStatsLogger writeLacTimeoutOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_TIMEOUT_FORCE,
+        help = "timeout stats of force requests"
+    )
     private final OpStatsLogger forceLedgerTimeoutOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_TIMEOUT_READ_LAC,
+        help = "timeout stats of read_lac requests"
+    )
     private final OpStatsLogger readLacTimeoutOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.GET_BOOKIE_INFO_OP,
+        help = "channel stats of get_bookie_info requests"
+    )
     private final OpStatsLogger getBookieInfoOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.TIMEOUT_GET_BOOKIE_INFO,
+        help = "timeout stats of get_bookie_info requests"
+    )
     private final OpStatsLogger getBookieInfoTimeoutOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_START_TLS_OP,
+        help = "channel stats of start_tls requests"
+    )
     private final OpStatsLogger startTLSOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CHANNEL_TIMEOUT_START_TLS_OP,
+        help = "timeout stats of start_tls requests"
+    )
     private final OpStatsLogger startTLSTimeoutOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.CLIENT_CONNECT_TIMER,
+        help = "channel stats of connect requests"
+    )
     private final OpStatsLogger connectTimer;
+    @StatsDoc(
+        name = BookKeeperClientStats.NETTY_EXCEPTION_CNT,
+        help = "the number of exceptions received from this channel"
+    )
     private final Counter exceptionCounter;
+    @StatsDoc(
+        name = BookKeeperClientStats.ADD_OP_OUTSTANDING,
+        help = "the number of outstanding add_entry requests"
+    )
     private final Counter addEntryOutstanding;
+    @StatsDoc(
+        name = BookKeeperClientStats.READ_OP_OUTSTANDING,
+        help = "the number of outstanding add_entry requests"
+    )
     private final Counter readEntryOutstanding;
     /* collect stats on all Ops that flows through netty pipeline */
+    @StatsDoc(
+        name = BookKeeperClientStats.NETTY_OPS,
+        help = "channel stats for all operations flowing through netty pipeline"
+    )
     private final OpStatsLogger nettyOpLogger;
+    @StatsDoc(
+        name = BookKeeperClientStats.ACTIVE_NON_TLS_CHANNEL_COUNTER,
+        help = "the number of active non-tls channels"
+    )
     private final Counter activeNonTlsChannelCounter;
+    @StatsDoc(
+        name = BookKeeperClientStats.ACTIVE_TLS_CHANNEL_COUNTER,
+        help = "the number of active tls channels"
+    )
     private final Counter activeTlsChannelCounter;
+    @StatsDoc(
+        name = BookKeeperClientStats.FAILED_CONNECTION_COUNTER,
+        help = "the number of failed connections"
+    )
     private final Counter failedConnectionCounter;
+    @StatsDoc(
+        name = BookKeeperClientStats.FAILED_TLS_HANDSHAKE_COUNTER,
+        help = "the number of failed tls handshakes"
+    )
     private final Counter failedTlsHandshakeCounter;
 
     private final boolean useV2WireProtocol;


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services