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/03/14 18:16:24 UTC

[GitHub] sijie closed pull request #1257: Issue 762: copy codahale files to org.apache.bookkeeper.stats.codahale

sijie closed pull request #1257: Issue 762: copy codahale files to org.apache.bookkeeper.stats.codahale
URL: https://github.com/apache/bookkeeper/pull/1257
 
 
   

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-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleMetricsProvider.java b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleMetricsProvider.java
index dc789ffc7..01658c765 100644
--- a/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleMetricsProvider.java
+++ b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleMetricsProvider.java
@@ -40,6 +40,7 @@
 /**
  * A {@link StatsProvider} implemented based on <i>Codahale</i> metrics library.
  */
+@Deprecated
 @SuppressWarnings("deprecation")
 public class CodahaleMetricsProvider implements StatsProvider {
 
diff --git a/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleOpStatsLogger.java b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleOpStatsLogger.java
index 9af35bf2f..690f2b51d 100644
--- a/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleOpStatsLogger.java
+++ b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleOpStatsLogger.java
@@ -21,6 +21,7 @@
 import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
 
+@Deprecated
 class CodahaleOpStatsLogger implements OpStatsLogger {
     final Timer success;
     final Timer fail;
diff --git a/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleStatsLogger.java b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleStatsLogger.java
index 7d765ae15..7a75258ea 100644
--- a/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleStatsLogger.java
+++ b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/CodahaleStatsLogger.java
@@ -24,6 +24,7 @@
 /**
  * A {@link StatsLogger} implemented based on <i>Codahale</i> metrics library.
  */
+@Deprecated
 public class CodahaleStatsLogger implements StatsLogger {
     protected final String basename;
     final MetricRegistry metrics;
diff --git a/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleMetricsProvider.java b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleMetricsProvider.java
new file mode 100644
index 000000000..f4ca952f2
--- /dev/null
+++ b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleMetricsProvider.java
@@ -0,0 +1,144 @@
+/**
+ * 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.stats.codahale;
+
+import com.codahale.metrics.CsvReporter;
+import com.codahale.metrics.JmxReporter;
+import com.codahale.metrics.MetricFilter;
+import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.ScheduledReporter;
+import com.codahale.metrics.Slf4jReporter;
+import com.codahale.metrics.graphite.Graphite;
+import com.codahale.metrics.graphite.GraphiteReporter;
+import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
+import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
+import com.google.common.base.Strings;
+import com.google.common.net.HostAndPort;
+import java.io.File;
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import org.apache.bookkeeper.stats.StatsLogger;
+import org.apache.bookkeeper.stats.StatsProvider;
+import org.apache.commons.configuration.Configuration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A {@link StatsProvider} implemented based on <i>Codahale</i> metrics library.
+ */
+@SuppressWarnings("deprecation")
+public class CodahaleMetricsProvider implements StatsProvider {
+
+    static final Logger LOG = LoggerFactory.getLogger(CodahaleMetricsProvider.class);
+
+    MetricRegistry metrics = null;
+    List<ScheduledReporter> reporters = new ArrayList<ScheduledReporter>();
+    JmxReporter jmx = null;
+
+    synchronized void initIfNecessary() {
+        if (metrics == null) {
+            metrics = new MetricRegistry();
+            metrics.registerAll(new MemoryUsageGaugeSet());
+            metrics.registerAll(new GarbageCollectorMetricSet());
+        }
+    }
+
+    public synchronized MetricRegistry getMetrics() {
+        return metrics;
+    }
+
+    @Override
+    public void start(Configuration conf) {
+        initIfNecessary();
+
+        int metricsOutputFrequency = conf.getInt("codahaleStatsOutputFrequencySeconds", 60);
+        String prefix = conf.getString("codahaleStatsPrefix", "");
+        String graphiteHost = conf.getString("codahaleStatsGraphiteEndpoint");
+        String csvDir = conf.getString("codahaleStatsCSVEndpoint");
+        String slf4jCat = conf.getString("codahaleStatsSlf4jEndpoint");
+        String jmxDomain = conf.getString("codahaleStatsJmxEndpoint");
+
+        if (!Strings.isNullOrEmpty(graphiteHost)) {
+            LOG.info("Configuring stats with graphite");
+            HostAndPort addr = HostAndPort.fromString(graphiteHost);
+            final Graphite graphite = new Graphite(
+                    new InetSocketAddress(addr.getHostText(), addr.getPort()));
+            reporters.add(GraphiteReporter.forRegistry(getMetrics())
+                          .prefixedWith(prefix)
+                          .convertRatesTo(TimeUnit.SECONDS)
+                          .convertDurationsTo(TimeUnit.MILLISECONDS)
+                          .filter(MetricFilter.ALL)
+                          .build(graphite));
+        }
+        if (!Strings.isNullOrEmpty(csvDir)) {
+            // NOTE: 1/ metrics output files are exclusive to a given process
+            // 2/ the output directory must exist
+            // 3/ if output files already exist they are not overwritten and there is no metrics output
+            File outdir;
+            if (!Strings.isNullOrEmpty(prefix)) {
+                outdir = new File(csvDir, prefix);
+            } else {
+                outdir = new File(csvDir);
+            }
+            LOG.info("Configuring stats with csv output to directory [{}]", outdir.getAbsolutePath());
+            reporters.add(CsvReporter.forRegistry(getMetrics())
+                          .convertRatesTo(TimeUnit.SECONDS)
+                          .convertDurationsTo(TimeUnit.MILLISECONDS)
+                          .build(outdir));
+        }
+        if (!Strings.isNullOrEmpty(slf4jCat)) {
+            LOG.info("Configuring stats with slf4j");
+            reporters.add(Slf4jReporter.forRegistry(getMetrics())
+                          .outputTo(LoggerFactory.getLogger(slf4jCat))
+                          .convertRatesTo(TimeUnit.SECONDS)
+                          .convertDurationsTo(TimeUnit.MILLISECONDS)
+                          .build());
+        }
+        if (!Strings.isNullOrEmpty(jmxDomain)) {
+            LOG.info("Configuring stats with jmx");
+            jmx = JmxReporter.forRegistry(getMetrics())
+                .inDomain(jmxDomain)
+                .convertRatesTo(TimeUnit.SECONDS)
+                .convertDurationsTo(TimeUnit.MILLISECONDS)
+                .build();
+            jmx.start();
+        }
+
+        for (ScheduledReporter r : reporters) {
+            r.start(metricsOutputFrequency, TimeUnit.SECONDS);
+        }
+    }
+
+    @Override
+    public void stop() {
+        for (ScheduledReporter r : reporters) {
+            r.report();
+            r.stop();
+        }
+        if (jmx != null) {
+            jmx.stop();
+        }
+    }
+
+    @Override
+    public StatsLogger getStatsLogger(String name) {
+        initIfNecessary();
+        return new CodahaleStatsLogger(getMetrics(), name);
+    }
+}
diff --git a/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleOpStatsLogger.java b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleOpStatsLogger.java
new file mode 100644
index 000000000..ae97c7858
--- /dev/null
+++ b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleOpStatsLogger.java
@@ -0,0 +1,75 @@
+/**
+ * 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.stats.codahale;
+
+import com.codahale.metrics.Snapshot;
+import com.codahale.metrics.Timer;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+import org.apache.bookkeeper.stats.OpStatsData;
+import org.apache.bookkeeper.stats.OpStatsLogger;
+
+class CodahaleOpStatsLogger implements OpStatsLogger {
+    final Timer success;
+    final Timer fail;
+
+    CodahaleOpStatsLogger(Timer success, Timer fail) {
+        this.success = success;
+        this.fail = fail;
+    }
+
+    // OpStatsLogger functions
+    public void registerFailedEvent(long eventLatency, TimeUnit unit) {
+        fail.update(eventLatency, unit);
+    }
+
+    public void registerSuccessfulEvent(long eventLatency, TimeUnit unit) {
+        success.update(eventLatency, unit);
+    }
+
+    public void registerSuccessfulValue(long value) {
+        // Values are inserted as millis, which is the unit they will be presented, to maintain 1:1 scale
+        success.update(value, TimeUnit.MILLISECONDS);
+    }
+
+    public void registerFailedValue(long value) {
+        // Values are inserted as millis, which is the unit they will be presented, to maintain 1:1 scale
+        fail.update(value, TimeUnit.MILLISECONDS);
+    }
+
+    public synchronized void clear() {
+        // can't clear a timer
+    }
+
+    /**
+     * This function should go away soon (hopefully).
+     */
+    public synchronized OpStatsData toOpStatsData() {
+        long numFailed = fail.getCount();
+        long numSuccess = success.getCount();
+        Snapshot s = success.getSnapshot();
+        double avgLatencyMillis = s.getMean();
+
+        double[] defaultPercentiles = {10, 50, 90, 99, 99.9, 99.99};
+        long[] latenciesMillis = new long[defaultPercentiles.length];
+        Arrays.fill(latenciesMillis, Long.MAX_VALUE);
+        for (int i = 0; i < defaultPercentiles.length; i++) {
+            latenciesMillis[i] = (long) s.getValue(defaultPercentiles[i] / 100);
+        }
+        return new OpStatsData(numSuccess, numFailed, avgLatencyMillis, latenciesMillis);
+    }
+}
diff --git a/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleStatsLogger.java b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleStatsLogger.java
new file mode 100644
index 000000000..1f6bc1853
--- /dev/null
+++ b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleStatsLogger.java
@@ -0,0 +1,112 @@
+/**
+ * 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.stats.codahale;
+
+import static com.codahale.metrics.MetricRegistry.name;
+
+import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.Timer;
+import org.apache.bookkeeper.stats.Counter;
+import org.apache.bookkeeper.stats.Gauge;
+import org.apache.bookkeeper.stats.OpStatsLogger;
+import org.apache.bookkeeper.stats.StatsLogger;
+
+/**
+ * A {@link StatsLogger} implemented based on <i>Codahale</i> metrics library.
+ */
+public class CodahaleStatsLogger implements StatsLogger {
+    protected final String basename;
+    final MetricRegistry metrics;
+
+    CodahaleStatsLogger(MetricRegistry metrics, String basename) {
+        this.metrics = metrics;
+        this.basename = basename;
+    }
+
+    @Override
+    public OpStatsLogger getOpStatsLogger(String statName) {
+        Timer success = metrics.timer(name(basename, statName));
+        Timer failure = metrics.timer(name(basename, statName + "-fail"));
+        return new CodahaleOpStatsLogger(success, failure);
+    }
+
+    @Override
+    public Counter getCounter(String statName) {
+        final com.codahale.metrics.Counter c = metrics.counter(name(basename, statName));
+        return new Counter() {
+            @Override
+            public synchronized void clear() {
+                long cur = c.getCount();
+                c.dec(cur);
+            }
+
+            @Override
+            public Long get() {
+                return c.getCount();
+            }
+
+            @Override
+            public void inc() {
+                c.inc();
+            }
+
+            @Override
+            public void dec() {
+                c.dec();
+            }
+
+            @Override
+            public void add(long delta) {
+                c.inc(delta);
+            }
+        };
+    }
+
+    @Override
+    public <T extends Number> void registerGauge(final String statName, final Gauge<T> gauge) {
+        String metricName = name(basename, statName);
+        metrics.remove(metricName);
+
+        metrics.register(metricName, new com.codahale.metrics.Gauge<T>() {
+                @Override
+                public T getValue() {
+                    return gauge.getSample();
+                }
+            });
+    }
+
+    @Override
+    public <T extends Number> void unregisterGauge(String statName, Gauge<T> gauge) {
+        // do nothing right now as the Codahale doesn't support conditional removal
+    }
+
+    @Override
+    public StatsLogger scope(String scope) {
+        String scopeName;
+        if (0 == basename.length()) {
+            scopeName = scope;
+        } else {
+            scopeName = name(basename, scope);
+        }
+        return new CodahaleStatsLogger(metrics, scopeName);
+    }
+
+    @Override
+    public void removeScope(String name, StatsLogger statsLogger) {
+        // no-op. the codahale stats logger doesn't have the references for stats logger.
+    }
+}
diff --git a/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/package-info.java b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/package-info.java
new file mode 100644
index 000000000..1afa43899
--- /dev/null
+++ b/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+/**
+ * A lightweight stats library implemention based on <i>Codahale</i> metrics library.
+ */
+package org.apache.bookkeeper.stats.codahale;
diff --git a/bookkeeper-stats-providers/codahale-metrics-provider/src/test/java/org/apache/bookkeeper/stats/CodahaleOpStatsTest.java b/bookkeeper-stats-providers/codahale-metrics-provider/src/test/java/org/apache/bookkeeper/stats/codahale/CodahaleOpStatsTest.java
similarity index 90%
rename from bookkeeper-stats-providers/codahale-metrics-provider/src/test/java/org/apache/bookkeeper/stats/CodahaleOpStatsTest.java
rename to bookkeeper-stats-providers/codahale-metrics-provider/src/test/java/org/apache/bookkeeper/stats/codahale/CodahaleOpStatsTest.java
index 90c0dd6ef..54efaeeea 100644
--- a/bookkeeper-stats-providers/codahale-metrics-provider/src/test/java/org/apache/bookkeeper/stats/CodahaleOpStatsTest.java
+++ b/bookkeeper-stats-providers/codahale-metrics-provider/src/test/java/org/apache/bookkeeper/stats/codahale/CodahaleOpStatsTest.java
@@ -14,17 +14,19 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.bookkeeper.stats;
+package org.apache.bookkeeper.stats.codahale;
 
 import static org.junit.Assert.assertEquals;
 
+import org.apache.bookkeeper.stats.OpStatsData;
+import org.apache.bookkeeper.stats.OpStatsLogger;
 import org.junit.Test;
 
 /**
  * Unit test of {@link CodahaleOpStatsLogger}.
  */
-public class CodahaleOpStatsTest {
 
+public class CodahaleOpStatsTest {
     @Test
     public void testToOpStatsData() {
         OpStatsLogger logger = new CodahaleMetricsProvider().getStatsLogger("test").getOpStatsLogger("testLogger");
diff --git a/pom.xml b/pom.xml
index db154551e..c0f3e9bcd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -742,12 +742,13 @@
             <group>
               <title>Bookkeeper Stats API</title>
               <!-- currently codahale is placed under `stats` package unfortunately.
-                   we might consider rename them to their own packages in future. {@link https://github.com/apache/bookkeeper/issues/762} -->
+                   we have done a copy to its own package in future in 4.7.0, will remove it in 4.8.0.
+                   {@link https://github.com/apache/bookkeeper/issues/762} -->
               <packages>org.apache.bookkeeper.stats</packages>
             </group>
             <group>
               <title>Bookkeeper Stats Providers</title>
-              <packages>org.apache.bookkeeper.stats.twitter.finagle:org.apache.bookkeeper.stats.twitter.ostrich:org.apache.bookkeeper.stats.twitter.science:org.apache.bookkeeper.stats.prometheus</packages>
+              <packages>org.apache.bookkeeper.stats.codahale:org.apache.bookkeeper.stats.twitter.finagle:org.apache.bookkeeper.stats.twitter.ostrich:org.apache.bookkeeper.stats.twitter.science:org.apache.bookkeeper.stats.prometheus</packages>
             </group>
           </groups>
           <doctitle>BookKeeper Java API (version ${project.version})</doctitle>
diff --git a/site/_data/config/bk_server.yaml b/site/_data/config/bk_server.yaml
index f843dfbfc..93ba270e5 100644
--- a/site/_data/config/bk_server.yaml
+++ b/site/_data/config/bk_server.yaml
@@ -341,7 +341,7 @@ groups:
     default: true
   - param: statsProviderClass
     description: Stats provider class.
-    default: org.apache.bookkeeper.stats.CodahaleMetricsProvider
+    default: org.apache.bookkeeper.stats.codahale.CodahaleMetricsProvider
 
 - name: Read-only mode support
   params:


 

----------------------------------------------------------------
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