add servlets to expose server level metrics.
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/4eea03a0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/4eea03a0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/4eea03a0 Branch: refs/heads/master Commit: 4eea03a052d1b0a9190b9d1512088da9f81cc037 Parents: ed260f1 Author: Jacques Nadeau <[email protected]> Authored: Sat Jun 7 08:38:55 2014 -0700 Committer: Jacques Nadeau <[email protected]> Committed: Sun Jun 8 19:13:06 2014 -0700 ---------------------------------------------------------------------- exec/java-exec/pom.xml | 5 ++ .../apache/drill/exec/metrics/DrillMetrics.java | 84 +++++++++++++++----- .../drill/exec/server/BootStrapContext.java | 3 +- .../org/apache/drill/exec/server/Drillbit.java | 7 ++ .../org/apache/drill/exec/work/WorkManager.java | 16 ++++ .../java/org/apache/drill/exec/ExecTest.java | 6 ++ 6 files changed, 98 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/4eea03a0/exec/java-exec/pom.xml ---------------------------------------------------------------------- diff --git a/exec/java-exec/pom.xml b/exec/java-exec/pom.xml index da0c96a..3c245b8 100644 --- a/exec/java-exec/pom.xml +++ b/exec/java-exec/pom.xml @@ -152,6 +152,11 @@ <version>3.0.1</version> </dependency> <dependency> + <groupId>com.codahale.metrics</groupId> + <artifactId>metrics-servlets</artifactId> + <version>3.0.1</version> + </dependency> + <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/4eea03a0/exec/java-exec/src/main/java/org/apache/drill/exec/metrics/DrillMetrics.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/metrics/DrillMetrics.java b/exec/java-exec/src/main/java/org/apache/drill/exec/metrics/DrillMetrics.java index eef1181..d3bc93e 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/metrics/DrillMetrics.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/metrics/DrillMetrics.java @@ -17,25 +17,47 @@ */ package org.apache.drill.exec.metrics; -import com.codahale.metrics.JmxReporter; -import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.Slf4jReporter; +import java.lang.management.ManagementFactory; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; + import org.apache.drill.common.config.DrillConfig; import org.apache.drill.exec.ExecConstants; -import org.apache.drill.exec.client.DrillClient; -import java.util.concurrent.TimeUnit; +import com.codahale.metrics.JmxReporter; +import com.codahale.metrics.Metric; +import com.codahale.metrics.MetricFilter; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.MetricSet; +import com.codahale.metrics.Slf4jReporter; +import com.codahale.metrics.jvm.BufferPoolMetricSet; +import com.codahale.metrics.jvm.GarbageCollectorMetricSet; +import com.codahale.metrics.jvm.MemoryUsageGaugeSet; +import com.codahale.metrics.jvm.ThreadStatesGaugeSet; public class DrillMetrics { static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DrillMetrics.class); static final DrillConfig config = DrillConfig.create(); - private DrillMetrics() {} + private DrillMetrics() { + } private static class RegistryHolder { - public static final MetricRegistry REGISTRY = new MetricRegistry(); - private static JmxReporter jmxReporter = getJmxReporter(); - private static Slf4jReporter logReporter = getLogReporter(); + public static final MetricRegistry REGISTRY; +// private static JmxReporter jmxReporter = getJmxReporter(); +// private static Slf4jReporter logReporter = getLogReporter(); + + static { + REGISTRY = new MetricRegistry(); + registerSysStats(); + } + + private static void registerSysStats(){ + REGISTRY.registerAll(new GarbageCollectorMetricSet()); + REGISTRY.registerAll(new BufferPoolMetricSet(ManagementFactory.getPlatformMBeanServer())); + REGISTRY.registerAll(new MemoryUsageGaugeSet()); + REGISTRY.registerAll(new ThreadStatesGaugeSet()); + } private static JmxReporter getJmxReporter() { if (config.getBoolean(ExecConstants.METRICS_JMX_OUTPUT_ENABLED)) { @@ -43,25 +65,43 @@ public class DrillMetrics { reporter.start(); return reporter; - } else return null; + } else + return null; + } + + private static Slf4jReporter getLogReporter() { + if (config.getBoolean(ExecConstants.METRICS_LOG_OUTPUT_ENABLED)) { + Slf4jReporter reporter = Slf4jReporter.forRegistry(getInstance()).outputTo(logger) + .convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build(); + reporter.start(config.getInt(ExecConstants.METRICS_LOG_OUTPUT_INTERVAL), TimeUnit.SECONDS); + + return reporter; + } else + return null; + } + } + + private static void registerAll(String prefix, MetricSet metricSet, MetricRegistry registry) { + for (Entry<String, Metric> entry : metricSet.getMetrics().entrySet()) { + if (entry.getValue() instanceof MetricSet) { + registerAll(prefix + "." + entry.getKey(), (MetricSet) entry.getValue(), registry); + } else { + registry.register(prefix + "." + entry.getKey(), entry.getValue()); + } } - private static Slf4jReporter getLogReporter() { - if(config.getBoolean(ExecConstants.METRICS_LOG_OUTPUT_ENABLED)) { - Slf4jReporter reporter = Slf4jReporter.forRegistry(getInstance()) - .outputTo(logger) - .convertRatesTo(TimeUnit.SECONDS) - .convertDurationsTo(TimeUnit.MILLISECONDS) - .build(); - reporter.start(config.getInt(ExecConstants.METRICS_LOG_OUTPUT_INTERVAL), TimeUnit.SECONDS); - - return reporter; - } else return null; - } } public static MetricRegistry getInstance() { return RegistryHolder.REGISTRY; } + public static void resetMetrics(){ + RegistryHolder.REGISTRY.removeMatching(new MetricFilter(){ + @Override + public boolean matches(String name, Metric metric) { + return true; + }}); + RegistryHolder.registerSysStats(); + } } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/4eea03a0/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java index 4261885..ddfb42c 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java @@ -25,6 +25,7 @@ import org.apache.drill.common.config.DrillConfig; import org.apache.drill.exec.ExecConstants; import org.apache.drill.exec.memory.BufferAllocator; import org.apache.drill.exec.memory.TopLevelAllocator; +import org.apache.drill.exec.metrics.DrillMetrics; import org.apache.drill.exec.rpc.NamedThreadFactory; import com.codahale.metrics.MetricRegistry; @@ -43,7 +44,7 @@ public class BootStrapContext implements Closeable{ this.config = config; this.loop = new NioEventLoopGroup(config.getInt(ExecConstants.BIT_SERVER_RPC_THREADS), new NamedThreadFactory("BitServer-")); this.loop2 = new NioEventLoopGroup(config.getInt(ExecConstants.BIT_SERVER_RPC_THREADS), new NamedThreadFactory("BitClient-")); - this.metrics = new MetricRegistry(); + this.metrics = DrillMetrics.getInstance(); this.allocator = new TopLevelAllocator(config); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/4eea03a0/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java index f6637cf..43cc2b9 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java @@ -19,6 +19,8 @@ package org.apache.drill.exec.server; import java.io.Closeable; +import javax.servlet.Servlet; + import org.apache.drill.common.config.DrillConfig; import org.apache.drill.exec.ExecConstants; import org.apache.drill.exec.cache.DistributedCache; @@ -41,6 +43,8 @@ import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.glassfish.jersey.servlet.ServletContainer; +import com.codahale.metrics.servlets.MetricsServlet; +import com.codahale.metrics.servlets.ThreadDumpServlet; import com.google.common.io.Closeables; /** @@ -129,6 +133,9 @@ public class Drillbit implements Closeable{ // h.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "org.apache.drill.exec.server"); h.setInitOrder(1); context.addServlet(h, "/*"); + context.addServlet(new ServletHolder(new MetricsServlet(this.context.getMetrics())), "/status/metrics"); + context.addServlet(new ServletHolder(new ThreadDumpServlet()), "/status/threads"); + embeddedJetty.start(); System.out.println(""); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/4eea03a0/exec/java-exec/src/main/java/org/apache/drill/exec/work/WorkManager.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/work/WorkManager.java b/exec/java-exec/src/main/java/org/apache/drill/exec/work/WorkManager.java index c037a4c..bddc1cf 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/work/WorkManager.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/work/WorkManager.java @@ -50,6 +50,8 @@ import org.apache.drill.exec.work.fragment.FragmentExecutor; import org.apache.drill.exec.work.fragment.FragmentManager; import org.apache.drill.exec.work.user.UserWorker; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.MetricRegistry; import com.google.common.collect.Maps; import com.google.common.collect.Queues; @@ -92,6 +94,20 @@ public class WorkManager implements Closeable{ // executor = Executors.newFixedThreadPool(dContext.getConfig().getInt(ExecConstants.EXECUTOR_THREADS) executor = Executors.newCachedThreadPool(new NamedThreadFactory("WorkManager-")); eventThread.start(); + dContext.getMetrics().register(MetricRegistry.name("drill.exec.work.running_fragments." + dContext.getEndpoint().getUserPort()), + new Gauge<Integer>() { + @Override + public Integer getValue() { + return runningFragments.size(); + } + }); + dContext.getMetrics().register(MetricRegistry.name("drill.exec.work.pendingTasks" + dContext.getEndpoint().getUserPort()), + new Gauge<Integer>() { + @Override + public Integer getValue() { + return pendingTasks.size(); + } + }); } public WorkEventBus getWorkBus(){ http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/4eea03a0/exec/java-exec/src/test/java/org/apache/drill/exec/ExecTest.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/ExecTest.java b/exec/java-exec/src/test/java/org/apache/drill/exec/ExecTest.java index 7be8cc5..e7c6dc0 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/ExecTest.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/ExecTest.java @@ -17,9 +17,15 @@ */ package org.apache.drill.exec; +import org.apache.drill.exec.metrics.DrillMetrics; import org.apache.drill.test.DrillTest; +import org.junit.After; public class ExecTest extends DrillTest{ + @After + public void clear(){ + DrillMetrics.resetMetrics(); + } }
