You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2016/09/07 06:29:47 UTC

svn commit: r1759546 - in /jackrabbit/oak/trunk/oak-run: ./ src/main/java/org/apache/jackrabbit/oak/benchmark/ src/main/java/org/apache/jackrabbit/oak/fixture/

Author: chetanm
Date: Wed Sep  7 06:29:47 2016
New Revision: 1759546

URL: http://svn.apache.org/viewvc?rev=1759546&view=rev
Log:
OAK-4768 - Provide an option to enable Metrics collection for benchmark run

Metrics can be enabled via new '--metrics=true' arg and the report would be added to console

Modified:
    jackrabbit/oak/trunk/oak-run/README.md
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/OakFixture.java
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/OakRepositoryFixture.java
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/SegmentTarFixture.java

Modified: jackrabbit/oak/trunk/oak-run/README.md
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/README.md?rev=1759546&r1=1759545&r2=1759546&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/README.md (original)
+++ jackrabbit/oak/trunk/oak-run/README.md Wed Sep  7 06:29:47 2016
@@ -453,6 +453,7 @@ The following benchmark options (with de
     --report false         - Whether to output intermediate results
     --csvFile <file>       - Optional csv file to report the benchmark results
     --concurrency <levels> - Comma separated list of concurrency levels
+    --metrics false        - Enable metrics based stats collection
     --rdbjdbcuri           - JDBC URL for RDB persistence (defaults to local file-based H2)
     --rdbjdbcuser          - JDBC username (defaults to "")
     --rdbjdbcpasswd        - JDBC password (defaults to "")

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java?rev=1759546&r1=1759545&r2=1759546&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java Wed Sep  7 06:29:47 2016
@@ -16,8 +16,6 @@
  */
 package org.apache.jackrabbit.oak.benchmark;
 
-import static java.util.Arrays.asList;
-
 import java.io.File;
 import java.io.PrintStream;
 import java.util.ArrayList;
@@ -25,9 +23,18 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+
+import com.codahale.metrics.ConsoleReporter;
+import com.codahale.metrics.Counting;
+import com.codahale.metrics.Metric;
+import com.codahale.metrics.MetricFilter;
+import com.codahale.metrics.MetricRegistry;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.MoreExecutors;
 import joptsimple.OptionParser;
 import joptsimple.OptionSet;
 import joptsimple.OptionSpec;
@@ -40,7 +47,11 @@ import org.apache.jackrabbit.oak.fixture
 import org.apache.jackrabbit.oak.fixture.OakFixture;
 import org.apache.jackrabbit.oak.fixture.OakRepositoryFixture;
 import org.apache.jackrabbit.oak.fixture.RepositoryFixture;
+import org.apache.jackrabbit.oak.plugins.metric.MetricStatisticsProvider;
 import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
+import org.apache.jackrabbit.oak.stats.StatisticsProvider;
+
+import static java.util.Arrays.asList;
 
 public class BenchmarkRunner {
 
@@ -83,6 +94,10 @@ public class BenchmarkRunner {
                 .accepts("luceneIndexOnFS", "Store Lucene index on file system")
                 .withOptionalArg()
                 .ofType(Boolean.class).defaultsTo(false);
+        OptionSpec<Boolean> metrics = parser
+                .accepts("metrics", "Enable Metrics collection")
+                .withOptionalArg()
+                .ofType(Boolean.class).defaultsTo(false);
         OptionSpec<Boolean> withStorage = parser
                 .accepts("storage", "Index storage enabled").withOptionalArg()
                 .ofType(Boolean.class);
@@ -152,6 +167,7 @@ public class BenchmarkRunner {
             }
             uri = "mongodb://" + host.value(options) + ":" + port.value(options) + "/" + db;
         }
+        StatisticsProvider statsProvider = options.has(metrics) ? getStatsProvider() : StatisticsProvider.NOOP;
         int cacheSize = cache.value(options);
         RepositoryFixture[] allFixtures = new RepositoryFixture[] {
                 new JackrabbitRepositoryFixture(base.value(options), cacheSize),
@@ -179,6 +195,7 @@ public class BenchmarkRunner {
                         rdbjdbcpasswd.value(options), rdbjdbctableprefix.value(options),
                         dropDBAfterTest.value(options), cacheSize * MB, base.value(options),
                         fdsCache.value(options));
+
         Benchmark[] allBenchmarks = new Benchmark[] {
             new OrderedIndexQueryOrderedIndexTest(),
             new OrderedIndexQueryStandardIndexTest(),
@@ -403,6 +420,7 @@ public class BenchmarkRunner {
         for (RepositoryFixture fixture : allFixtures) {
             if (argset.remove(fixture.toString())) {
                 fixtures.add(fixture);
+                configure(fixture, statsProvider);
             }
         }
 
@@ -437,11 +455,38 @@ public class BenchmarkRunner {
             if (out != null) {
                 out.close();
             }
+            reportMetrics(statsProvider);
         } else {
             System.err.println("Unknown arguments: " + argset);
         }
     }
 
+    private static void reportMetrics(StatisticsProvider statsProvider) {
+        if (statsProvider instanceof MetricStatisticsProvider) {
+            MetricRegistry metricRegistry = ((MetricStatisticsProvider) statsProvider).getRegistry();
+            ConsoleReporter.forRegistry(metricRegistry)
+                    .outputTo(System.out)
+                    .filter(new MetricFilter() {
+                        @Override
+                        public boolean matches(String name, Metric metric) {
+                            if (metric instanceof Counting) {
+                                //Only report non zero metrics
+                                return ((Counting) metric).getCount() > 0;
+                            }
+                            return true;
+                        }
+                    })
+                    .build()
+                    .report();
+        }
+    }
+
+    private static void configure(RepositoryFixture fixture, StatisticsProvider statsProvider) {
+        if (fixture instanceof OakRepositoryFixture) {
+            ((OakRepositoryFixture) fixture).setStatisticsProvider(statsProvider);
+        }
+    }
+
     private static String asSortedString(List<?> in) {
         List<String> tmp = new ArrayList<String>();
         for (Object o : in) {
@@ -450,4 +495,10 @@ public class BenchmarkRunner {
         Collections.sort(tmp);
         return tmp.toString();
     }
+
+    private static MetricStatisticsProvider getStatsProvider(){
+        ScheduledExecutorService executorService = MoreExecutors.getExitingScheduledExecutorService(
+                (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(1));
+        return new MetricStatisticsProvider(null, executorService);
+    }
 }

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/OakFixture.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/OakFixture.java?rev=1759546&r1=1759545&r2=1759546&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/OakFixture.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/OakFixture.java Wed Sep  7 06:29:47 2016
@@ -36,6 +36,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.stats.StatisticsProvider;
 
 public abstract class OakFixture {
 
@@ -71,7 +72,7 @@ public abstract class OakFixture {
 
     public abstract Oak getOak(int clusterId) throws Exception;
 
-    public abstract Oak[] setUpCluster(int n) throws Exception;
+    public abstract Oak[] setUpCluster(int n, StatisticsProvider statsProvider) throws Exception;
 
     public abstract void tearDownCluster();
 
@@ -99,7 +100,7 @@ public abstract class OakFixture {
             }
 
             @Override
-            public Oak[] setUpCluster(int n) throws Exception {
+            public Oak[] setUpCluster(int n, StatisticsProvider statsProvider) throws Exception {
                 Oak[] cluster = new Oak[n];
                 for (int i = 0; i < cluster.length; i++) {
                     Oak oak;
@@ -175,6 +176,7 @@ public abstract class OakFixture {
                 DocumentMK.Builder mkBuilder = new DocumentMK.Builder().
                         setMongoDB(mongo.getDB()).
                         memoryCacheSize(cacheSize).
+                        //TODO Persistent cache should be removed in teardown
                         setPersistentCache("target/persistentCache,time").
                         setClusterId(clusterId).
                         setLogging(false);
@@ -184,12 +186,13 @@ public abstract class OakFixture {
             }
 
             @Override
-            public Oak[] setUpCluster(int n) throws Exception {
+            public Oak[] setUpCluster(int n, StatisticsProvider statsProvider) throws Exception {
                 Oak[] cluster = new Oak[n];
                 kernels = new DocumentMK[cluster.length];
                 for (int i = 0; i < cluster.length; i++) {
                     MongoConnection mongo = new MongoConnection(uri);
                     DocumentMK.Builder mkBuilder = new DocumentMK.Builder().
+                            setStatisticsProvider(statsProvider).
                             setMongoDB(mongo.getDB()).
                             memoryCacheSize(cacheSize).
                             setPersistentCache("target/persistentCache,time").
@@ -280,13 +283,14 @@ public abstract class OakFixture {
             }
 
             @Override
-            public Oak[] setUpCluster(int n) throws Exception {
+            public Oak[] setUpCluster(int n, StatisticsProvider statsProvider) throws Exception {
                 Oak[] cluster = new Oak[n];
                 kernels = new DocumentMK[cluster.length];
                 for (int i = 0; i < cluster.length; i++) {
                     BlobStore blobStore = getBlobStore();
                     DataSource ds = RDBDataSourceFactory.forJdbcUrl(jdbcuri, jdbcuser, jdbcpasswd);
                     DocumentMK.Builder mkBuilder = new DocumentMK.Builder()
+                            .setStatisticsProvider(statsProvider)
                             .setRDBConnection(ds, getOptions(dropDBAfterTest, tablePrefix)).memoryCacheSize(cacheSize)
                             // FIXME: OAK-3389
                             .setLeaseCheck(false)
@@ -362,7 +366,7 @@ public abstract class OakFixture {
         }
 
         @Override
-        public Oak[] setUpCluster(int n) throws Exception {
+        public Oak[] setUpCluster(int n, StatisticsProvider statsProvider) throws Exception {
             Oak[] cluster = new Oak[n];
             stores = new FileStore[cluster.length];
             if (useBlobStore) {
@@ -381,6 +385,7 @@ public abstract class OakFixture {
                     builder.withBlobStore(blobStore);
                 }
                 stores[i] = builder.withRoot(EmptyNodeState.EMPTY_NODE)
+                        .withStatisticsProvider(statsProvider)
                         .withMaxFileSize(maxFileSizeMB)
                         .withCacheSize(cacheSizeMB)
                         .withMemoryMapping(memoryMapping)

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/OakRepositoryFixture.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/OakRepositoryFixture.java?rev=1759546&r1=1759545&r2=1759546&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/OakRepositoryFixture.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/OakRepositoryFixture.java Wed Sep  7 06:29:47 2016
@@ -17,11 +17,13 @@
 package org.apache.jackrabbit.oak.fixture;
 
 import java.io.File;
+import java.util.Collections;
 
 import javax.jcr.Repository;
 
 import org.apache.jackrabbit.api.JackrabbitRepository;
 import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.stats.StatisticsProvider;
 
 public class OakRepositoryFixture implements RepositoryFixture {
 
@@ -106,6 +108,7 @@ public class OakRepositoryFixture implem
     }
 
     private final OakFixture oakFixture;
+    private StatisticsProvider statisticsProvider = StatisticsProvider.NOOP;
     private Repository[] cluster;
 
     protected OakRepositoryFixture(OakFixture oakFixture) {
@@ -123,9 +126,10 @@ public class OakRepositoryFixture implem
     }
 
     public Repository[] setUpCluster(int n, JcrCreator customizer) throws Exception {
-        Oak[] oaks = oakFixture.setUpCluster(n);
+        Oak[] oaks = oakFixture.setUpCluster(n, statisticsProvider);
         cluster = new Repository[oaks.length];
         for (int i = 0; i < oaks.length; i++) {
+            configureStatsProvider(oaks[i]);
             cluster[i] = customizer.customize(oaks[i]).createRepository();
         }
         return cluster;
@@ -156,4 +160,12 @@ public class OakRepositoryFixture implem
     public OakFixture getOakFixture() {
         return oakFixture;
     }
+
+    public void setStatisticsProvider(StatisticsProvider statisticsProvider) {
+        this.statisticsProvider = statisticsProvider;
+    }
+
+    private void configureStatsProvider(Oak oak) {
+        oak.getWhiteboard().register(StatisticsProvider.class, statisticsProvider, Collections.emptyMap());
+    }
 }

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/SegmentTarFixture.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/SegmentTarFixture.java?rev=1759546&r1=1759545&r2=1759546&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/SegmentTarFixture.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/fixture/SegmentTarFixture.java Wed Sep  7 06:29:47 2016
@@ -27,6 +27,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
+import org.apache.jackrabbit.oak.stats.StatisticsProvider;
 
 class SegmentTarFixture extends OakFixture {
 
@@ -64,7 +65,7 @@ class SegmentTarFixture extends OakFixtu
     }
 
     @Override
-    public Oak[] setUpCluster(int n) throws Exception {
+    public Oak[] setUpCluster(int n, StatisticsProvider statsProvider) throws Exception {
         Oak[] cluster = new Oak[n];
         stores = new FileStore[cluster.length];
         if (useBlobStore) {
@@ -84,6 +85,7 @@ class SegmentTarFixture extends OakFixtu
             }
             stores[i] = builder
                     .withMaxFileSize(maxFileSizeMB)
+                    .withStatisticsProvider(statsProvider)
                     .withSegmentCacheSize(cacheSizeMB)
                     .withMemoryMapping(memoryMapping)
                     .build();