Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java (revision 1846724) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java (working copy) @@ -36,6 +36,8 @@ import org.apache.jackrabbit.oak.query.ast.NodeTypeInfoProvider; import org.apache.jackrabbit.oak.query.stats.QueryStatsData.QueryExecutionStats; import org.apache.jackrabbit.oak.query.xpath.XPathToSQL2Converter; +import org.apache.jackrabbit.oak.stats.StatisticsProvider; +import org.apache.jackrabbit.oak.stats.StatsOptions; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -276,6 +278,7 @@ Query query = prepareAndSelect(queries); query.getQueryExecutionStats().execute(System.nanoTime() - start); mdc = setupMDC(query); + getExecutionContext().getSettings().getQueryStats().markMeter("QUERY-COUNT", 1); return query.executeQuery(); } finally { if (mdc) { Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettingsService.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettingsService.java (revision 1846724) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettingsService.java (working copy) @@ -20,6 +20,10 @@ package org.apache.jackrabbit.oak.query; import org.apache.jackrabbit.oak.api.jmx.QueryEngineSettingsMBean; +import org.apache.jackrabbit.oak.stats.MeterStats; +import org.apache.jackrabbit.oak.stats.StatisticsProvider; +import org.apache.jackrabbit.oak.stats.StatsOptions; +import org.jetbrains.annotations.Nullable; import org.osgi.framework.BundleContext; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; @@ -88,6 +92,9 @@ @Reference private QueryEngineSettingsMBean queryEngineSettings; + @Reference + private static StatisticsProvider statisticsProvider; + @Activate private void activate(BundleContext context, Configuration config) { if (System.getProperty(QueryEngineSettings.OAK_QUERY_LIMIT_IN_MEMORY) == null) { @@ -123,4 +130,8 @@ System.getProperty(sysPropKey), sysPropKey); } + @Nullable + public static StatisticsProvider getStatisticsProvider() { + return statisticsProvider; + } } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/stats/QueryStatsMBean.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/query/stats/QueryStatsMBean.java (revision 1846724) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/stats/QueryStatsMBean.java (working copy) @@ -54,5 +54,8 @@ void setCaptureStackTraces(boolean captureStackTraces); boolean getCaptureStackTraces(); + + @Description("Update the underlying meter (referenced by name) with the current (long) value") + void markMeter(String name, long value); } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/stats/QueryStatsMBeanImpl.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/query/stats/QueryStatsMBeanImpl.java (revision 1846724) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/stats/QueryStatsMBeanImpl.java (working copy) @@ -32,7 +32,10 @@ import org.apache.jackrabbit.oak.commons.jmx.AnnotatedStandardMBean; import org.apache.jackrabbit.oak.query.QueryEngineSettings; +import org.apache.jackrabbit.oak.query.QueryEngineSettingsService; import org.apache.jackrabbit.oak.query.stats.QueryStatsData.QueryExecutionStats; +import org.apache.jackrabbit.oak.stats.StatisticsProvider; +import org.apache.jackrabbit.oak.stats.StatsOptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -104,8 +107,18 @@ public boolean getCaptureStackTraces() { return captureStackTraces; } - + @Override + public void markMeter(String name, long value) { + StatisticsProvider statisticsProvider = QueryEngineSettingsService.getStatisticsProvider(); + if (statisticsProvider != null) { + statisticsProvider.getMeter(name, StatsOptions.METRICS_ONLY).mark(value); + } else { + log.warn("could not obtain StatisticsProvider to update metrics"); + } + } + + @Override public String asJson() { ArrayList list = new ArrayList(statistics.values()); Collections.sort(list, new Comparator() { Index: oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryEngineSettingsServiceTest.java =================================================================== --- oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryEngineSettingsServiceTest.java (revision 1846724) +++ oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryEngineSettingsServiceTest.java (working copy) @@ -21,10 +21,14 @@ import java.util.Map; import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import org.apache.jackrabbit.oak.api.jmx.QueryEngineSettingsMBean; +import org.apache.jackrabbit.oak.stats.DefaultStatisticsProvider; +import org.apache.jackrabbit.oak.stats.StatisticsProvider; import org.apache.sling.testing.mock.osgi.junit.OsgiContext; import org.junit.After; import org.junit.Before; @@ -66,6 +70,9 @@ @Test public void osgiConfig() throws Exception{ + StatisticsProvider statisticsProvider = new DefaultStatisticsProvider(Executors.newSingleThreadScheduledExecutor()); + context.registerService(StatisticsProvider.class, statisticsProvider); + QueryEngineSettings settings = new QueryEngineSettings(); context.registerService(QueryEngineSettingsMBean.class, settings); @@ -90,6 +97,9 @@ .DEFAULT_QUERY_LIMIT_READS)); System.setProperty(QueryEngineSettings.OAK_QUERY_FAIL_TRAVERSAL, "false"); + StatisticsProvider statisticsProvider = new DefaultStatisticsProvider(Executors.newSingleThreadScheduledExecutor()); + context.registerService(StatisticsProvider.class, statisticsProvider); + QueryEngineSettings settings = new QueryEngineSettings(); context.registerService(QueryEngineSettingsMBean.class, settings);