[CALCITE-642] Add an avatica-metrics API

Avatica-metrics is a simple API, based on what
is provided by dropwizard-metrics, and a no-op
implementation of that API. One implementation
of this API is provided using dropwizard-metrics
3.1.2. ServiceLoader is used to dynamically load
one, and only one, implementation of the metrics API.

This provides some basic instrumentation inside of Avatica
to expose interesting metrics, limited only to the server
process (although the client does have the dependency
available). No explicit metrics "sinks" are configured,
where the metrics go is an exercise for the user.

Metrics instrumentation presently includes:

* Coarse Jetty request timings
* Serialization (JSON/Protobuf) timings
* Connection and Statement cache gauges

This also includes a new module, calcite-dropwizard-hadoop-metrics2,
which acts as a bridge between dropwizard-metrics and Hadoop Metrics2.
This has no bearing on Avatica or Calcite on its own, but is a useful
tool to integrate metrics exposed by Avatica/Calcite into other metrics
stores which Dropwizard-metrics doesn't natively support (namely, Ambari).

Closes apache/calcite#189


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/7e5710fc
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/7e5710fc
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/7e5710fc

Branch: refs/heads/master
Commit: 7e5710fc7459728a667659ea2b66895812ef839f
Parents: 7ce2e62
Author: Josh Elser <[email protected]>
Authored: Thu Jan 21 19:13:48 2016 -0500
Committer: Josh Elser <[email protected]>
Committed: Thu Feb 4 13:33:08 2016 -0500

----------------------------------------------------------------------
 avatica-metrics-dropwizardmetrics3/pom.xml      | 119 +++++
 .../metrics/dropwizard3/DropwizardCounter.java  |  51 +++
 .../metrics/dropwizard3/DropwizardGauge.java    |  39 ++
 .../dropwizard3/DropwizardHistogram.java        |  43 ++
 .../metrics/dropwizard3/DropwizardMeter.java    |  43 ++
 .../dropwizard3/DropwizardMetricsSystem.java    |  62 +++
 .../DropwizardMetricsSystemConfiguration.java   |  42 ++
 .../DropwizardMetricsSystemFactory.java         |  42 ++
 .../metrics/dropwizard3/DropwizardTimer.java    |  54 +++
 .../metrics/dropwizard3/package-info.java       |  26 ++
 ...calcite.avatica.metrics.MetricsSystemFactory |   2 +
 .../dropwizard3/DropwizardCounterTest.java      |  61 +++
 .../dropwizard3/DropwizardGaugeTest.java        |  60 +++
 .../dropwizard3/DropwizardHistogramTest.java    |  49 ++
 .../dropwizard3/DropwizardMeterTest.java        |  50 ++
 .../DropwizardMetricsSystemFactoryTest.java     |  54 +++
 .../DropwizardMetricsSystemTest.java            | 161 +++++++
 .../dropwizard3/DropwizardTimerTest.java        |  56 +++
 avatica-metrics/pom.xml                         | 138 ++++++
 .../apache/calcite/avatica/metrics/Counter.java |  49 ++
 .../apache/calcite/avatica/metrics/Gauge.java   |  30 ++
 .../calcite/avatica/metrics/Histogram.java      |  40 ++
 .../apache/calcite/avatica/metrics/Meter.java   |  38 ++
 .../apache/calcite/avatica/metrics/Metric.java  |  26 ++
 .../calcite/avatica/metrics/MetricsSystem.java  |  68 +++
 .../metrics/MetricsSystemConfiguration.java     |  33 ++
 .../avatica/metrics/MetricsSystemFactory.java   |  32 ++
 .../avatica/metrics/MetricsSystemLoader.java    |  87 ++++
 .../calcite/avatica/metrics/PackageMarker.java  |  37 ++
 .../apache/calcite/avatica/metrics/Timer.java   |  37 ++
 .../avatica/metrics/noop/NoopCounter.java       |  36 ++
 .../avatica/metrics/noop/NoopHistogram.java     |  32 ++
 .../calcite/avatica/metrics/noop/NoopMeter.java |  32 ++
 .../avatica/metrics/noop/NoopMetricsSystem.java |  69 +++
 .../noop/NoopMetricsSystemConfiguration.java    |  40 ++
 .../metrics/noop/NoopMetricsSystemFactory.java  |  35 ++
 .../calcite/avatica/metrics/noop/NoopTimer.java |  41 ++
 .../avatica/metrics/noop/package-info.java      |  26 ++
 .../calcite/avatica/metrics/package-info.java   |  24 +
 .../metrics/MetricsSystemLoaderTest.java        | 114 +++++
 .../noop/NoopMetricsSystemFactoryTest.java      |  37 ++
 .../metrics/noop/NoopMetricsSystemTest.java     |  71 +++
 .../src/test/resources/log4j.properties         |  24 +
 avatica-server/pom.xml                          |  30 +-
 .../apache/calcite/avatica/jdbc/JdbcMeta.java   |  28 +-
 .../avatica/server/AvaticaJsonHandler.java      |  67 ++-
 .../avatica/server/AvaticaProtobufHandler.java  |  49 +-
 .../server/DelegatingAvaticaHandler.java        |   3 +
 .../calcite/avatica/server/HandlerFactory.java  |  75 ++-
 .../server/MetricsAwareAvaticaHandler.java      |  43 ++
 avatica/pom.xml                                 |  33 +-
 .../apache/calcite/avatica/remote/Handler.java  |   1 +
 .../calcite/avatica/remote/JsonHandler.java     |  23 +-
 .../calcite/avatica/remote/MetricsHelper.java   |  36 ++
 .../calcite/avatica/remote/ProtobufHandler.java |  18 +-
 .../avatica/metrics/MetricsHelperTest.java      |  42 ++
 .../avatica/remote/ProtobufHandlerTest.java     |   3 +-
 .../calcite/avatica/test/JsonHandlerTest.java   |   3 +-
 dropwizard-metrics2/pom.xml                     | 145 ++++++
 .../metrics/hadoop/HadoopMetrics2Reporter.java  | 451 +++++++++++++++++++
 .../metrics/hadoop/PackageMarker.java           |  37 ++
 .../dropwizard/metrics/hadoop/package-info.java |  24 +
 .../hadoop/HadoopMetrics2ReporterTest.java      | 334 ++++++++++++++
 pom.xml                                         |  27 +-
 64 files changed, 3625 insertions(+), 57 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/pom.xml
----------------------------------------------------------------------
diff --git a/avatica-metrics-dropwizardmetrics3/pom.xml 
b/avatica-metrics-dropwizardmetrics3/pom.xml
new file mode 100644
index 0000000..f0e6fc1
--- /dev/null
+++ b/avatica-metrics-dropwizardmetrics3/pom.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.calcite</groupId>
+    <artifactId>calcite</artifactId>
+    <version>1.7.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>calcite-avatica-metrics-dropwizardmetrics3</artifactId>
+  <packaging>jar</packaging>
+  <name>Calcite Avatica Dropwizard Metrics 3</name>
+  <description>An implementation of Avatica Metrics using Dropwizard 
Metrics.</description>
+
+  <properties>
+    <top.dir>${project.basedir}/..</top.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.calcite</groupId>
+      <artifactId>calcite-avatica-metrics</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.dropwizard.metrics</groupId>
+      <artifactId>metrics-core</artifactId>
+      <!-- Avoid specifying version in dependencyManagement in support of 
other avatica-metrics impls -->
+      <version>${dropwizard-metrics3.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.eclipse.m2e</groupId>
+          <artifactId>lifecycle-mapping</artifactId>
+          <version>1.0.0</version>
+          <configuration>
+            <lifecycleMappingMetadata>
+              <pluginExecutions>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-checkstyle-plugin</artifactId>
+                    <versionRange>[2.12.1,)</versionRange>
+                    <goals>
+                      <goal>check</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore />
+                  </action>
+                </pluginExecution>
+              </pluginExecutions>
+            </lifecycleMappingMetadata>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+    <plugins>
+      <!-- Parent module has the same plugin and does the work of
+           generating -sources.jar for each project. But without the
+           plugin declared here, IDEs don't know the sources are
+           available. -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-source-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>attach-sources</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>jar-no-fork</goal>
+              <goal>test-jar-no-fork</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-remote-resources-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>non-root-resources</id>
+            <goals>
+              <goal>process</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardCounter.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardCounter.java
 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardCounter.java
new file mode 100644
index 0000000..4204ebf
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardCounter.java
@@ -0,0 +1,51 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import com.codahale.metrics.Counter;
+
+import java.util.Objects;
+
+/**
+ * Dropwizard Metrics implementation of {@link 
org.apache.calcite.avatica.metrics.Counter}.
+ */
+public class DropwizardCounter implements 
org.apache.calcite.avatica.metrics.Counter {
+
+  private final Counter counter;
+
+  public DropwizardCounter(Counter counter) {
+    this.counter = Objects.requireNonNull(counter);
+  }
+
+  @Override public void increment() {
+    this.counter.inc();
+  }
+
+  @Override public void increment(long n) {
+    this.counter.inc(n);
+  }
+
+  @Override public void decrement() {
+    this.counter.dec();
+  }
+
+  @Override public void decrement(long n) {
+    this.counter.dec(n);
+  }
+}
+
+// End DropwizardCounter.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardGauge.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardGauge.java
 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardGauge.java
new file mode 100644
index 0000000..5f4b776
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardGauge.java
@@ -0,0 +1,39 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import com.codahale.metrics.Gauge;
+
+/**
+ * Dropwizard Metrics implementation of {@link 
org.apache.calcite.avatica.metrics.Gauge}.
+ *
+ * @param <T> The value the gauge returns.
+ */
+public class DropwizardGauge<T> implements Gauge<T> {
+
+  private final org.apache.calcite.avatica.metrics.Gauge<T> gauge;
+
+  public DropwizardGauge(org.apache.calcite.avatica.metrics.Gauge<T> gauge) {
+    this.gauge = gauge;
+  }
+
+  @Override public T getValue() {
+    return gauge.getValue();
+  }
+}
+
+// End DropwizardGauge.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardHistogram.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardHistogram.java
 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardHistogram.java
new file mode 100644
index 0000000..266f130
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardHistogram.java
@@ -0,0 +1,43 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import com.codahale.metrics.Histogram;
+
+import java.util.Objects;
+
+/**
+ * Dropwizard metrics implementation of {@link 
org.apache.calcite.avatica.metrics.Histogram}.
+ */
+public class DropwizardHistogram implements 
org.apache.calcite.avatica.metrics.Histogram {
+
+  private final Histogram histogram;
+
+  public DropwizardHistogram(Histogram histogram) {
+    this.histogram = Objects.requireNonNull(histogram);
+  }
+
+  @Override public void update(int value) {
+    histogram.update(value);
+  }
+
+  @Override public void update(long value) {
+    histogram.update(value);
+  }
+}
+
+// End DropwizardHistogram.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMeter.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMeter.java
 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMeter.java
new file mode 100644
index 0000000..ab8fafc
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMeter.java
@@ -0,0 +1,43 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import com.codahale.metrics.Meter;
+
+import java.util.Objects;
+
+/**
+ * Dropwizard metrics implementation of {@link 
org.apache.calcite.avatica.metrics.Meter}.
+ */
+public class DropwizardMeter implements 
org.apache.calcite.avatica.metrics.Meter {
+
+  private final Meter meter;
+
+  public DropwizardMeter(Meter meter) {
+    this.meter = Objects.requireNonNull(meter);
+  }
+
+  @Override public void mark() {
+    this.meter.mark();
+  }
+
+  @Override public void mark(long count) {
+    this.meter.mark(count);
+  }
+}
+
+// End DropwizardMeter.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystem.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystem.java
 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystem.java
new file mode 100644
index 0000000..6aa71b9
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystem.java
@@ -0,0 +1,62 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import org.apache.calcite.avatica.metrics.Counter;
+import org.apache.calcite.avatica.metrics.Gauge;
+import org.apache.calcite.avatica.metrics.Histogram;
+import org.apache.calcite.avatica.metrics.Meter;
+import org.apache.calcite.avatica.metrics.MetricsSystem;
+import org.apache.calcite.avatica.metrics.Timer;
+
+import com.codahale.metrics.MetricRegistry;
+
+import java.util.Objects;
+
+/**
+ * Dropwizard Metrics implementation of {@link MetricsSystem}.
+ */
+public class DropwizardMetricsSystem implements MetricsSystem {
+
+  private final MetricRegistry registry;
+
+  public DropwizardMetricsSystem(MetricRegistry registry) {
+    this.registry = Objects.requireNonNull(registry);
+  }
+
+  @Override public Timer getTimer(String name) {
+    return new DropwizardTimer(registry.timer(name));
+  }
+
+  @Override public Histogram getHistogram(String name) {
+    return new DropwizardHistogram(registry.histogram(name));
+  }
+
+  @Override public Meter getMeter(String name) {
+    return new DropwizardMeter(registry.meter(name));
+  }
+
+  @Override public Counter getCounter(String name) {
+    return new DropwizardCounter(registry.counter(name));
+  }
+
+  @Override public <T> void register(String name, Gauge<T> gauge) {
+    registry.register(name, new DropwizardGauge<T>(gauge));
+  }
+}
+
+// End DropwizardMetricsSystem.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemConfiguration.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemConfiguration.java
 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemConfiguration.java
new file mode 100644
index 0000000..f4c9234
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemConfiguration.java
@@ -0,0 +1,42 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import org.apache.calcite.avatica.metrics.MetricsSystemConfiguration;
+
+import com.codahale.metrics.MetricRegistry;
+
+import java.util.Objects;
+
+/**
+ * A container which provides a {@link MetricRegistry} to a {@link 
DropwizardMetricsSystem}.
+ */
+public class DropwizardMetricsSystemConfiguration implements
+    MetricsSystemConfiguration<MetricRegistry> {
+
+  private final MetricRegistry registry;
+
+  public DropwizardMetricsSystemConfiguration(MetricRegistry registry) {
+    this.registry = Objects.requireNonNull(registry);
+  }
+
+  @Override public MetricRegistry get() {
+    return registry;
+  }
+}
+
+// End DropwizardMetricsSystemConfiguration.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemFactory.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemFactory.java
 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemFactory.java
new file mode 100644
index 0000000..1480db6
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemFactory.java
@@ -0,0 +1,42 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import org.apache.calcite.avatica.metrics.MetricsSystemConfiguration;
+import org.apache.calcite.avatica.metrics.MetricsSystemFactory;
+
+/**
+ * A {@link MetricsSystemFactory} for {@link DropwizardMetricsSystem}.
+ */
+public class DropwizardMetricsSystemFactory implements MetricsSystemFactory {
+
+  @Override public DropwizardMetricsSystem 
create(MetricsSystemConfiguration<?> config) {
+    // Verify we got configuration this factory can use
+    if (config instanceof DropwizardMetricsSystemConfiguration) {
+      DropwizardMetricsSystemConfiguration typedConfig =
+          (DropwizardMetricsSystemConfiguration) config;
+
+      return new DropwizardMetricsSystem(typedConfig.get());
+    }
+
+    throw new IllegalStateException("Expected instance of "
+        + DropwizardMetricsSystemConfiguration.class.getName() + " but got "
+        + (null == config ? "null" : config.getClass().getName()));
+  }
+}
+
+// End DropwizardMetricsSystemFactory.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardTimer.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardTimer.java
 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardTimer.java
new file mode 100644
index 0000000..850f9a6
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardTimer.java
@@ -0,0 +1,54 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import com.codahale.metrics.Timer;
+
+import java.util.Objects;
+
+/**
+ * Dropwizard Metrics implementation of {@link 
org.apache.calcite.avatica.metrics.Timer}.
+ */
+public class DropwizardTimer implements 
org.apache.calcite.avatica.metrics.Timer {
+
+  private final Timer timer;
+
+  public DropwizardTimer(Timer timer) {
+    this.timer = Objects.requireNonNull(timer);
+  }
+
+  @Override public DropwizardContext start() {
+    return new DropwizardContext(timer.time());
+  }
+
+  /**
+   * Dropwizard Metrics implementation of {@link 
org.apache.calcite.avatica.metrics.Timer.Context}
+   */
+  public class DropwizardContext implements 
org.apache.calcite.avatica.metrics.Timer.Context {
+    private final com.codahale.metrics.Timer.Context context;
+
+    public DropwizardContext(com.codahale.metrics.Timer.Context context) {
+      this.context = Objects.requireNonNull(context);
+    }
+
+    @Override public void close() {
+      this.context.stop();
+    }
+  }
+}
+
+// End DropwizardTimer.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/package-info.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/package-info.java
 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/package-info.java
new file mode 100644
index 0000000..f88df93
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/main/java/org/apache/calcite/avatica/metrics/dropwizard3/package-info.java
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+/**
+ * Dropwizard-Metrics (v3) implementation of the Avatica Metrics framework.
+ */
+@PackageMarker
+package org.apache.calcite.avatica.metrics.dropwizard3;
+
+import org.apache.calcite.avatica.metrics.PackageMarker;
+
+// End package-info.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/main/resources/META-INF/services/org.apache.calcite.avatica.metrics.MetricsSystemFactory
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/main/resources/META-INF/services/org.apache.calcite.avatica.metrics.MetricsSystemFactory
 
b/avatica-metrics-dropwizardmetrics3/src/main/resources/META-INF/services/org.apache.calcite.avatica.metrics.MetricsSystemFactory
new file mode 100644
index 0000000..25b64a8
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/main/resources/META-INF/services/org.apache.calcite.avatica.metrics.MetricsSystemFactory
@@ -0,0 +1,2 @@
+org.apache.calcite.avatica.metrics.dropwizard3.DropwizardMetricsSystemFactory
+

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardCounterTest.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardCounterTest.java
 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardCounterTest.java
new file mode 100644
index 0000000..b037196
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardCounterTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import com.codahale.metrics.Counter;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Test class for {@link DropwizardCounter}.
+ */
+public class DropwizardCounterTest {
+
+  private Counter counter;
+
+  @Before public void setup() {
+    this.counter = new Counter();
+  }
+
+  @Test public void testCounting() {
+    DropwizardCounter dwCounter = new DropwizardCounter(counter);
+
+    dwCounter.increment();
+    assertEquals(1L, counter.getCount());
+    dwCounter.increment();
+    assertEquals(2L, counter.getCount());
+    dwCounter.increment(2L);
+    assertEquals(4L, counter.getCount());
+    dwCounter.increment(-1L);
+    assertEquals(3L, counter.getCount());
+
+    dwCounter.decrement();
+    assertEquals(2L, counter.getCount());
+    dwCounter.decrement();
+    assertEquals(1L, counter.getCount());
+    dwCounter.decrement(4L);
+    assertEquals(-3L, counter.getCount());
+    dwCounter.decrement(-3L);
+    assertEquals(0L, counter.getCount());
+  }
+
+}
+
+// End DropwizardCounterTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardGaugeTest.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardGaugeTest.java
 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardGaugeTest.java
new file mode 100644
index 0000000..ed78a58
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardGaugeTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import org.apache.calcite.avatica.metrics.Gauge;
+
+import org.junit.Test;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Test class for {@link DropwizardGauge}.
+ */
+public class DropwizardGaugeTest {
+
+  @Test public void test() {
+    SimpleGauge gauge = new SimpleGauge();
+    DropwizardGauge<Long> dwGauge = new DropwizardGauge<>(gauge);
+
+    assertEquals(gauge.getValue(), dwGauge.getValue());
+
+    gauge.setValue(1000L);
+
+    assertEquals(gauge.getValue(), dwGauge.getValue());
+  }
+
+  /**
+   * Gauge implementation with a setter.
+   */
+  private static class SimpleGauge implements Gauge<Long> {
+
+    private final AtomicLong value = new AtomicLong(0L);
+
+    @Override public Long getValue() {
+      return this.value.get();
+    }
+
+    public void setValue(long value) {
+      this.value.set(value);
+    }
+  }
+}
+
+// End DropwizardGaugeTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardHistogramTest.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardHistogramTest.java
 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardHistogramTest.java
new file mode 100644
index 0000000..25ec5c0
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardHistogramTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import com.codahale.metrics.Histogram;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+/**
+ * Test class for {@link DropwizardHistogram}.
+ */
+public class DropwizardHistogramTest {
+
+  private Histogram histogram;
+
+  @Before public void setup() {
+    this.histogram = Mockito.mock(Histogram.class);
+  }
+
+  @Test public void test() {
+    DropwizardHistogram dwHistogram = new DropwizardHistogram(histogram);
+
+    dwHistogram.update(10);
+
+    dwHistogram.update(100L);
+
+    Mockito.verify(histogram).update(10);
+    Mockito.verify(histogram).update(100L);
+  }
+
+}
+
+// End DropwizardHistogramTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMeterTest.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMeterTest.java
 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMeterTest.java
new file mode 100644
index 0000000..c76c7e0
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMeterTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import com.codahale.metrics.Meter;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+/**
+ * Test class for {@link DropwizardMeter}.
+ */
+public class DropwizardMeterTest {
+
+  private Meter meter;
+
+  @Before public void setup() {
+    this.meter = Mockito.mock(Meter.class);
+  }
+
+  @Test public void test() {
+    DropwizardMeter dwMeter = new DropwizardMeter(this.meter);
+
+    dwMeter.mark();
+    dwMeter.mark(10L);
+    dwMeter.mark();
+    dwMeter.mark();
+
+    Mockito.verify(meter, Mockito.times(3)).mark();
+    Mockito.verify(meter).mark(10L);
+  }
+
+}
+
+// End DropwizardMeterTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemFactoryTest.java
 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemFactoryTest.java
new file mode 100644
index 0000000..332c6e0
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemFactoryTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import org.apache.calcite.avatica.metrics.noop.NoopMetricsSystemConfiguration;
+
+import com.codahale.metrics.MetricRegistry;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Test class for {@link DropwizardMetricsSystemFactory}.
+ */
+public class DropwizardMetricsSystemFactoryTest {
+
+  private DropwizardMetricsSystemFactory factory;
+
+  @Before public void setup() {
+    factory = new DropwizardMetricsSystemFactory();
+  }
+
+  @Test(expected = IllegalStateException.class) public void 
testNullConfigurationFails() {
+    factory.create(null);
+  }
+
+  @Test(expected = IllegalStateException.class) public void 
testUnhandledConfigurationType() {
+    factory.create(NoopMetricsSystemConfiguration.getInstance());
+  }
+
+  @Test public void testHandledConfigurationType() {
+    DropwizardMetricsSystem metrics =
+        factory.create(new DropwizardMetricsSystemConfiguration(new 
MetricRegistry()));
+    assertNotNull("Expected DropwizardMetricsSystem to be non-null", metrics);
+  }
+}
+
+// End DropwizardMetricsSystemFactoryTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemTest.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemTest.java
 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemTest.java
new file mode 100644
index 0000000..7eeec3b
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardMetricsSystemTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import org.apache.calcite.avatica.metrics.Counter;
+import org.apache.calcite.avatica.metrics.Gauge;
+import org.apache.calcite.avatica.metrics.Histogram;
+import org.apache.calcite.avatica.metrics.Meter;
+import org.apache.calcite.avatica.metrics.Timer;
+import org.apache.calcite.avatica.metrics.Timer.Context;
+
+import com.codahale.metrics.MetricRegistry;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ * Tests for {@link DropwizardMetricsSystem}.
+ */
+public class DropwizardMetricsSystemTest {
+
+  private MetricRegistry mockRegistry;
+  private DropwizardMetricsSystem metrics;
+
+  @Before public void setup() {
+    mockRegistry = mock(MetricRegistry.class);
+    metrics = new DropwizardMetricsSystem(mockRegistry);
+  }
+
+  @Test public void testGauge() {
+    final long gaugeValue = 42L;
+    final String name = "gauge";
+    metrics.register(name, new Gauge<Long>() {
+      @Override public Long getValue() {
+        return gaugeValue;
+      }
+    });
+
+    verify(mockRegistry, times(1)).register(eq(name), 
any(com.codahale.metrics.Gauge.class));
+  }
+
+  @Test public void testMeter() {
+    final String name = "meter";
+    final com.codahale.metrics.Meter mockMeter = 
mock(com.codahale.metrics.Meter.class);
+
+    when(mockRegistry.meter(name)).thenReturn(mockMeter);
+
+    Meter meter = metrics.getMeter(name);
+
+    final long count = 5;
+    meter.mark(count);
+
+    verify(mockMeter, times(1)).mark(count);
+
+    meter.mark();
+
+    verify(mockMeter, times(1)).mark();
+  }
+
+  @Test public void testHistogram() {
+    final String name = "histogram";
+    final com.codahale.metrics.Histogram mockHistogram = 
mock(com.codahale.metrics.Histogram.class);
+
+    when(mockRegistry.histogram(name)).thenReturn(mockHistogram);
+
+    Histogram histogram = metrics.getHistogram(name);
+
+    long[] long_values = new long[] {1L, 5L, 15L, 30L, 60L};
+    for (long value : long_values) {
+      histogram.update(value);
+    }
+
+    for (long value : long_values) {
+      verify(mockHistogram).update(value);
+    }
+
+    int[] int_values = new int[] {2, 6, 16, 31, 61};
+    for (int value : int_values) {
+      histogram.update(value);
+    }
+
+    for (int value : int_values) {
+      verify(mockHistogram).update(value);
+    }
+  }
+
+  @Test public void testCounter() {
+    final String name = "counter";
+    final com.codahale.metrics.Counter mockCounter = 
mock(com.codahale.metrics.Counter.class);
+
+    when(mockRegistry.counter(name)).thenReturn(mockCounter);
+
+    Counter counter = metrics.getCounter(name);
+
+    long[] updates = new long[] {1L, 5L, -2L, 4L, -8L, 0};
+    for (long update : updates) {
+      if (update < 0) {
+        counter.decrement(Math.abs(update));
+      } else {
+        counter.increment(update);
+      }
+    }
+
+    for (long update : updates) {
+      if (update < 0) {
+        verify(mockCounter).dec(Math.abs(update));
+      } else {
+        verify(mockCounter).inc(update);
+      }
+    }
+
+    int numSingleUpdates = 3;
+    for (int i = 0; i < numSingleUpdates; i++) {
+      counter.increment();
+      counter.decrement();
+    }
+
+    verify(mockCounter, times(numSingleUpdates)).inc();
+    verify(mockCounter, times(numSingleUpdates)).dec();
+  }
+
+  @Test public void testTimer() {
+    final String name = "timer";
+    final com.codahale.metrics.Timer mockTimer = 
mock(com.codahale.metrics.Timer.class);
+    final com.codahale.metrics.Timer.Context mockContext =
+        mock(com.codahale.metrics.Timer.Context.class);
+
+    when(mockRegistry.timer(name)).thenReturn(mockTimer);
+    when(mockTimer.time()).thenReturn(mockContext);
+
+    Timer timer = metrics.getTimer(name);
+    Context context = timer.start();
+    context.close();
+
+    verify(mockTimer).time();
+    verify(mockContext).stop();
+  }
+}
+
+// End DropwizardMetricsSystemTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardTimerTest.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardTimerTest.java
 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardTimerTest.java
new file mode 100644
index 0000000..536d935
--- /dev/null
+++ 
b/avatica-metrics-dropwizardmetrics3/src/test/java/org/apache/calcite/avatica/metrics/dropwizard3/DropwizardTimerTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.calcite.avatica.metrics.dropwizard3;
+
+import 
org.apache.calcite.avatica.metrics.dropwizard3.DropwizardTimer.DropwizardContext;
+
+import com.codahale.metrics.Timer;
+import com.codahale.metrics.Timer.Context;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+/**
+ * Test class for {@link DropwizardTimer}
+ */
+public class DropwizardTimerTest {
+
+  private Timer timer;
+  private Context context;
+
+  @Before public void setup() {
+    this.timer = Mockito.mock(Timer.class);
+    this.context = Mockito.mock(Context.class);
+  }
+
+  @Test public void test() {
+    DropwizardTimer dwTimer = new DropwizardTimer(timer);
+
+    Mockito.when(timer.time()).thenReturn(context);
+
+    DropwizardContext dwContext = dwTimer.start();
+
+    dwContext.close();
+
+    Mockito.verify(timer).time();
+    Mockito.verify(context).stop();
+  }
+
+}
+
+// End DropwizardTimerTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/pom.xml
----------------------------------------------------------------------
diff --git a/avatica-metrics/pom.xml b/avatica-metrics/pom.xml
new file mode 100644
index 0000000..cb7da6e
--- /dev/null
+++ b/avatica-metrics/pom.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.calcite</groupId>
+    <artifactId>calcite</artifactId>
+    <version>1.7.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>calcite-avatica-metrics</artifactId>
+  <packaging>jar</packaging>
+  <name>Calcite Avatica Metrics</name>
+  <description>A library designed to abstract away any required dependency on 
a metrics library</description>
+
+  <properties>
+    <top.dir>${project.basedir}/..</top.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.eclipse.m2e</groupId>
+          <artifactId>lifecycle-mapping</artifactId>
+          <version>1.0.0</version>
+          <configuration>
+            <lifecycleMappingMetadata>
+              <pluginExecutions>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-checkstyle-plugin</artifactId>
+                    <versionRange>[2.12.1,)</versionRange>
+                    <goals>
+                      <goal>check</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore />
+                  </action>
+                </pluginExecution>
+              </pluginExecutions>
+            </lifecycleMappingMetadata>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <!-- configurations do not cascade, so all of the definition from
+             ../pom.xml:build:plugin-management:plugins:plugin must be 
repeated in child poms -->
+        <executions>
+          <execution>
+            <id>analyze</id>
+            <goals>
+              <goal>analyze-only</goal>
+            </goals>
+            <configuration>
+              <failOnWarning>true</failOnWarning>
+              <!-- ignore "unused but declared" warnings -->
+              <ignoredUnusedDeclaredDependencies>
+                
<ignoredUnusedDeclaredDependency>org.slf4j:slf4j-log4j12</ignoredUnusedDeclaredDependency>
+              </ignoredUnusedDeclaredDependencies>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <!-- Parent module has the same plugin and does the work of
+           generating -sources.jar for each project. But without the
+           plugin declared here, IDEs don't know the sources are
+           available. -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-source-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>attach-sources</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>jar-no-fork</goal>
+              <goal>test-jar-no-fork</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-remote-resources-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>non-root-resources</id>
+            <goals>
+              <goal>process</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Counter.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Counter.java 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Counter.java
new file mode 100644
index 0000000..87aec1b
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Counter.java
@@ -0,0 +1,49 @@
+/*
+ * 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.calcite.avatica.metrics;
+
+/**
+ * A mutable number.
+ */
+public interface Counter {
+
+  /**
+   * Increment {@code this} by 1.
+   */
+  void increment();
+
+  /**
+   * Increment {@code this} by {@code n}.
+   *
+   * @param n The amount to increment.
+   */
+  void increment(long n);
+
+  /**
+   * Decrement {@code this} by 1.
+   */
+  void decrement();
+
+  /**
+   * Decrement {@code this} by {@code n}.
+   *
+   * @param n The amount to decrement.
+   */
+  void decrement(long n);
+}
+
+// End Counter.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Gauge.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Gauge.java 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Gauge.java
new file mode 100644
index 0000000..6313a9a
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Gauge.java
@@ -0,0 +1,30 @@
+/*
+ * 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.calcite.avatica.metrics;
+
+/**
+ * A metrics which measures a discrete value.
+ *
+ * @param <T> The value of the Gauge.
+ */
+public interface Gauge<T> extends Metric {
+
+  T getValue();
+
+}
+
+// End Gauge.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Histogram.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Histogram.java
 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Histogram.java
new file mode 100644
index 0000000..633af78
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Histogram.java
@@ -0,0 +1,40 @@
+/*
+ * 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.calcite.avatica.metrics;
+
+/**
+ * A metric which measures the distribution of values.
+ */
+public interface Histogram extends Metric {
+
+  /**
+   * Adds a new value to the distribution.
+   *
+   * @param value The value to add
+   */
+  void update(int value);
+
+  /**
+   * Adds a new value to the distribution.
+   *
+   * @param value The value to add
+   */
+  void update(long value);
+
+}
+
+// End Histogram.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Meter.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Meter.java 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Meter.java
new file mode 100644
index 0000000..b27f023
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Meter.java
@@ -0,0 +1,38 @@
+/*
+ * 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.calcite.avatica.metrics;
+
+/**
+ * A metric which measure the rate at which some operation is invoked.
+ */
+public interface Meter extends Metric {
+
+  /**
+   * Records one occurrence.
+   */
+  void mark();
+
+  /**
+   * Records {@code events} occurrences.
+   *
+   * @param events Number of occurrences to record.
+   */
+  void mark(long events);
+
+}
+
+// End Meter.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Metric.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Metric.java 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Metric.java
new file mode 100644
index 0000000..fe133da
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Metric.java
@@ -0,0 +1,26 @@
+/*
+ * 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.calcite.avatica.metrics;
+
+/**
+ * Parent interface for all metrics.
+ */
+public interface Metric {
+
+}
+
+// End Metric.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystem.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystem.java
 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystem.java
new file mode 100644
index 0000000..0d1cb4b
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystem.java
@@ -0,0 +1,68 @@
+/*
+ * 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.calcite.avatica.metrics;
+
+/**
+ * General purpose factory for creating various metrics. Modeled off of the 
Dropwizard Metrics API.
+ */
+public interface MetricsSystem {
+
+  /**
+   * Get or construct a {@link Timer} used to measure durations and report 
rates.
+   *
+   * @param name The name of the Timer.
+   * @return An instance of {@link Timer}.
+   */
+  Timer getTimer(String name);
+
+  /**
+   * Get or construct a {@link Histogram} used to measure a distribution of 
values.
+   *
+   * @param name The name of the Histogram.
+   * @return An instance of {@link Histogram}.
+   */
+  Histogram getHistogram(String name);
+
+  /**
+   * Get or construct a {@link Meter} used to measure durations and report 
distributions (a
+   * combination of a {@link Timer} and a {@link Histogram}.
+   *
+   * @param name The name of the Meter.
+   * @return An instance of {@link Meter}.
+   */
+  Meter getMeter(String name);
+
+  /**
+   * Get or construct a {@link Counter} used to track a mutable number.
+   *
+   * @param name The name of the Counter
+   * @return An instance of {@link Counter}.
+   */
+  Counter getCounter(String name);
+
+  /**
+   * Register a {@link Gauge}. The Gauge will be invoked at a period defined 
by the implementation
+   * of {@link MetricsSystem}.
+   *
+   * @param name The name of the Gauge.
+   * @param gauge A callback to compute the current value.
+   */
+  <T> void register(String name, Gauge<T> gauge);
+
+}
+
+// End MetricsSystem.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemConfiguration.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemConfiguration.java
 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemConfiguration.java
new file mode 100644
index 0000000..99b6e8c
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemConfiguration.java
@@ -0,0 +1,33 @@
+/*
+ * 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.calcite.avatica.metrics;
+
+/**
+ * A container used by a {@link MetricsSystemFactory} to create a {@link 
MetricsSystem}.
+ *
+ * @param <T> Configuration/State for the {@link MetricsSystem}.
+ */
+public interface MetricsSystemConfiguration<T> {
+
+  /**
+   * @return Some state or configuration to create a {@link MetricsSystem}.
+   */
+  T get();
+
+}
+
+// End MetricsSystemConfiguration.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemFactory.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemFactory.java
 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemFactory.java
new file mode 100644
index 0000000..484b230
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemFactory.java
@@ -0,0 +1,32 @@
+/*
+ * 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.calcite.avatica.metrics;
+
+/**
+ * A factory class for creating instances of {@link MetricsSystem}.
+ */
+public interface MetricsSystemFactory {
+
+  /**
+   * Creates an instance of a {@link MetricsSystem}.
+   *
+   * @return A new {@link MetricsSystem}.
+   */
+  MetricsSystem create(MetricsSystemConfiguration<?> config);
+}
+
+// End MetricsSystemFactory.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemLoader.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemLoader.java
 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemLoader.java
new file mode 100644
index 0000000..3a15c5b
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/MetricsSystemLoader.java
@@ -0,0 +1,87 @@
+/*
+ * 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.calcite.avatica.metrics;
+
+import org.apache.calcite.avatica.metrics.noop.NoopMetricsSystem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.ServiceLoader;
+
+/**
+ * A utility encapsulating use of {@link ServiceLoader} to instantiate a 
{@link MetricsSystem}.
+ */
+public class MetricsSystemLoader {
+  private static final Logger LOG = 
LoggerFactory.getLogger(MetricsSystemLoader.class);
+  private static final MetricsSystemLoader INSTANCE = new 
MetricsSystemLoader();
+
+  private MetricsSystemLoader() {}
+
+  /**
+   * Creates a {@link MetricsSystem} instance using the corresponding {@link 
MetricsSystemFactory}
+   * available to {@link ServiceLoader} on the classpath. If there is not 
exactly one instance of
+   * a {@link MetricsSystemFactory}, an instance of {@link NoopMetricsSystem} 
will be returned.
+   *
+   * @param config State to pass to the {@link MetricsSystemFactory}.
+   * @return A {@link MetricsSystem} implementation.
+   */
+  public static MetricsSystem load(MetricsSystemConfiguration<?> config) {
+    return INSTANCE._load(Objects.requireNonNull(config));
+  }
+
+  MetricsSystem _load(MetricsSystemConfiguration<?> config) {
+    List<MetricsSystemFactory> availableFactories = getFactories();
+
+    if (1 == availableFactories.size()) {
+      // One and only one instance -- what we want/expect
+      MetricsSystemFactory factory = availableFactories.get(0);
+      LOG.info("Loaded MetricsSystem {}", factory.getClass());
+      return factory.create(config);
+    } else if (availableFactories.isEmpty()) {
+      // None-provided default to no metrics
+      LOG.info("No metrics implementation available on classpath. Using No-op 
implementation");
+      return NoopMetricsSystem.getInstance();
+    } else {
+      // Tell the user they're doing something wrong, and choose the first 
impl.
+      StringBuilder sb = new StringBuilder();
+      for (MetricsSystemFactory factory : availableFactories) {
+        if (sb.length() > 0) {
+          sb.append(", ");
+        }
+        sb.append(factory.getClass());
+      }
+      LOG.warn("Found multiple MetricsSystemFactory implementations: {}."
+          + " Using No-op implementation", sb);
+      return NoopMetricsSystem.getInstance();
+    }
+  }
+
+  List<MetricsSystemFactory> getFactories() {
+    ServiceLoader<MetricsSystemFactory> loader = 
ServiceLoader.load(MetricsSystemFactory.class);
+    List<MetricsSystemFactory> availableFactories = new ArrayList<>();
+    for (MetricsSystemFactory factory : loader) {
+      availableFactories.add(factory);
+    }
+    return availableFactories;
+  }
+}
+
+// End MetricsSystemLoader.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/PackageMarker.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/PackageMarker.java
 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/PackageMarker.java
new file mode 100644
index 0000000..e627d31
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/PackageMarker.java
@@ -0,0 +1,37 @@
+/*
+ * 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.calcite.avatica.metrics;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * This is a dummy annotation that forces javac to produce output for
+ * otherwise empty package-info.java.
+ *
+ * <p>The result is maven-compiler-plugin can properly identify the scope of
+ * changed files
+ *
+ * <p>See more details in
+ * <a href="https://jira.codehaus.org/browse/MCOMPILER-205";>
+ *   maven-compiler-plugin: incremental compilation broken</a>
+ */
+@Retention(RetentionPolicy.SOURCE)
+public @interface PackageMarker {
+}
+
+// End PackageMarker.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Timer.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Timer.java 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Timer.java
new file mode 100644
index 0000000..be792cc
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/Timer.java
@@ -0,0 +1,37 @@
+/*
+ * 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.calcite.avatica.metrics;
+
+/**
+ * A metric which encompasses a {@link Histogram} and {@link Meter}.
+ */
+public interface Timer extends Metric {
+
+  Context start();
+
+  /**
+   * A object that tracks an active timing state.
+   */
+  public interface Context extends AutoCloseable {
+    /**
+     * Stops the timer.
+     */
+    void close();
+  }
+}
+
+// End Timer.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopCounter.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopCounter.java
 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopCounter.java
new file mode 100644
index 0000000..9ce8476
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopCounter.java
@@ -0,0 +1,36 @@
+/*
+ * 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.calcite.avatica.metrics.noop;
+
+import org.apache.calcite.avatica.metrics.Counter;
+
+/**
+ * {@link Counter} implementation which does nothing.
+ */
+public class NoopCounter implements Counter {
+
+  @Override public void increment() {}
+
+  @Override public void increment(long n) {}
+
+  @Override public void decrement() {}
+
+  @Override public void decrement(long n) {}
+
+}
+
+// End NoopCounter.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopHistogram.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopHistogram.java
 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopHistogram.java
new file mode 100644
index 0000000..ee056e9
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopHistogram.java
@@ -0,0 +1,32 @@
+/*
+ * 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.calcite.avatica.metrics.noop;
+
+import org.apache.calcite.avatica.metrics.Histogram;
+
+/**
+ * {@link Histogram} which does nothing.
+ */
+public class NoopHistogram implements Histogram {
+
+  @Override public void update(int value) {}
+
+  @Override public void update(long value) {}
+
+}
+
+// End NoopHistogram.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMeter.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMeter.java
 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMeter.java
new file mode 100644
index 0000000..4ad68c9
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMeter.java
@@ -0,0 +1,32 @@
+/*
+ * 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.calcite.avatica.metrics.noop;
+
+import org.apache.calcite.avatica.metrics.Meter;
+
+/**
+ * {@link Meter} which does nothing.
+ */
+public class NoopMeter implements Meter {
+
+  @Override public void mark() {}
+
+  @Override public void mark(long events) {}
+
+}
+
+// End NoopMeter.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/7e5710fc/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystem.java
----------------------------------------------------------------------
diff --git 
a/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystem.java
 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystem.java
new file mode 100644
index 0000000..12b5af1
--- /dev/null
+++ 
b/avatica-metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystem.java
@@ -0,0 +1,69 @@
+/*
+ * 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.calcite.avatica.metrics.noop;
+
+import org.apache.calcite.avatica.metrics.Counter;
+import org.apache.calcite.avatica.metrics.Gauge;
+import org.apache.calcite.avatica.metrics.Histogram;
+import org.apache.calcite.avatica.metrics.Meter;
+import org.apache.calcite.avatica.metrics.Metric;
+import org.apache.calcite.avatica.metrics.MetricsSystem;
+import org.apache.calcite.avatica.metrics.Timer;
+
+/**
+ * {@link MetricsSystem} implementation which does nothing. Returns {@link 
Metric} implementations
+ * which also does nothing (avoiding null instances).
+ */
+public class NoopMetricsSystem implements MetricsSystem {
+
+  private static final NoopMetricsSystem NOOP_METRICS = new 
NoopMetricsSystem();
+
+  private static final Timer TIMER = new NoopTimer();
+  private static final Histogram HISTOGRAM = new NoopHistogram();
+  private static final Meter METER = new NoopMeter();
+  private static final Counter COUNTER = new NoopCounter();
+
+  /**
+   * @return A {@link NoopMetricsSystem} instance.
+   */
+  public static NoopMetricsSystem getInstance() {
+    return NOOP_METRICS;
+  }
+
+  private NoopMetricsSystem() {}
+
+  @Override public Timer getTimer(String name) {
+    return TIMER;
+  }
+
+  @Override public Histogram getHistogram(String name) {
+    return HISTOGRAM;
+  }
+
+  @Override public Meter getMeter(String name) {
+    return METER;
+  }
+
+  @Override public Counter getCounter(String name) {
+    return COUNTER;
+  }
+
+  @Override public <T> void register(String name, Gauge<T> gauge) {}
+
+}
+
+// End NoopMetricsSystem.java

Reply via email to