calcite-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From els...@apache.org
Subject [29/59] [partial] calcite git commit: [CALCITE-1078] Detach avatica from the core calcite Maven project
Date Mon, 07 Mar 2016 18:28:07 GMT
http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/avatica/metrics/pom.xml
----------------------------------------------------------------------
diff --git a/avatica/metrics/pom.xml b/avatica/metrics/pom.xml
new file mode 100644
index 0000000..1b8ad66
--- /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.avatica</groupId>
+    <artifactId>calcite-avatica-parent</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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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/5cee486f/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

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemConfiguration.java
----------------------------------------------------------------------
diff --git a/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemConfiguration.java b/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemConfiguration.java
new file mode 100644
index 0000000..42b3f24
--- /dev/null
+++ b/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemConfiguration.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.noop;
+
+import org.apache.calcite.avatica.metrics.MetricsSystemConfiguration;
+
+/**
+ * An empty configuration for the {@link NoopMetricsSystem}.
+ */
+public class NoopMetricsSystemConfiguration implements MetricsSystemConfiguration<Void> {
+
+  private static final NoopMetricsSystemConfiguration INSTANCE =
+      new NoopMetricsSystemConfiguration();
+
+  public static NoopMetricsSystemConfiguration getInstance() {
+    return INSTANCE;
+  }
+
+  private NoopMetricsSystemConfiguration() {}
+
+  @Override public Void get() {
+    return null;
+  }
+}
+
+// End NoopMetricsSystemConfiguration.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemFactory.java
----------------------------------------------------------------------
diff --git a/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemFactory.java b/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemFactory.java
new file mode 100644
index 0000000..c15f978
--- /dev/null
+++ b/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemFactory.java
@@ -0,0 +1,35 @@
+/*
+ * 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.MetricsSystemConfiguration;
+import org.apache.calcite.avatica.metrics.MetricsSystemFactory;
+
+/**
+ * A {@link MetricsSystemFactory} for the {@link NoopMetricsSystem}.
+ *
+ * No service file is provided for this implementation. It is the fallback implementation if
+ * no implementation or more than one implementation is found on the classpath.
+ */
+public class NoopMetricsSystemFactory implements MetricsSystemFactory {
+
+  @Override public NoopMetricsSystem create(MetricsSystemConfiguration<?> config) {
+    return NoopMetricsSystem.getInstance();
+  }
+}
+
+// End NoopMetricsSystemFactory.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopTimer.java
----------------------------------------------------------------------
diff --git a/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopTimer.java b/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopTimer.java
new file mode 100644
index 0000000..a45cd63
--- /dev/null
+++ b/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/NoopTimer.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.noop;
+
+import org.apache.calcite.avatica.metrics.Timer;
+import org.apache.calcite.avatica.metrics.Timer.Context;
+
+/**
+ * {@link Timer} which does nothing.
+ */
+public class NoopTimer implements Timer {
+
+  private static final NoopContext CONTEXT = new NoopContext();
+
+  @Override public NoopContext start() {
+    return CONTEXT;
+  }
+
+  /**
+   * {@link Context} which does nothing.
+   */
+  public static class NoopContext implements Context {
+
+    @Override public void close() {}
+
+  }
+}
+
+// End NoopTimer.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/package-info.java
----------------------------------------------------------------------
diff --git a/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/package-info.java b/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/package-info.java
new file mode 100644
index 0000000..826a655
--- /dev/null
+++ b/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/noop/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.
+ */
+
+/**
+ * No-operation implementation for the Avatica Metrics framework.
+ */
+@PackageMarker
+package org.apache.calcite.avatica.metrics.noop;
+
+import org.apache.calcite.avatica.metrics.PackageMarker;
+
+// End package-info.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/package-info.java
----------------------------------------------------------------------
diff --git a/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/package-info.java b/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/package-info.java
new file mode 100644
index 0000000..efed28c
--- /dev/null
+++ b/avatica/metrics/src/main/java/org/apache/calcite/avatica/metrics/package-info.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+
+/**
+ * Metrics for the Avatica framework.
+ */
+@PackageMarker
+package org.apache.calcite.avatica.metrics;
+
+// End package-info.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/MetricsSystemLoaderTest.java
----------------------------------------------------------------------
diff --git a/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/MetricsSystemLoaderTest.java b/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/MetricsSystemLoaderTest.java
new file mode 100644
index 0000000..1c405ee
--- /dev/null
+++ b/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/MetricsSystemLoaderTest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.apache.calcite.avatica.metrics.noop.NoopMetricsSystemConfiguration;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Test class for {@link MetricsSystemLoader}.
+ */
+public class MetricsSystemLoaderTest {
+
+  @Test public void testSingleInstance() {
+    final List<MetricsSystemFactory> factories =
+        Collections.<MetricsSystemFactory>singletonList(new MarkedNoopMetricsSystemFactory());
+    MetricsSystemLoader loader = Mockito.mock(MetricsSystemLoader.class);
+
+    Mockito.when(loader.getFactories()).thenReturn(factories);
+    Mockito.when(loader._load(Mockito.any(MetricsSystemConfiguration.class))).thenCallRealMethod();
+
+    // One MetricsSystemFactory should return the MetricsSystem it creates
+    MetricsSystem system = loader._load(NoopMetricsSystemConfiguration.getInstance());
+    assertEquals(MarkedMetricsSystem.INSTANCE, system);
+  }
+
+  @Test public void testMultipleInstances() {
+    // The type of the factories doesn't matter (we can send duplicates for testing purposes)
+    final List<MetricsSystemFactory> factories =
+        Arrays.<MetricsSystemFactory>asList(new MarkedNoopMetricsSystemFactory(),
+            new MarkedNoopMetricsSystemFactory());
+    MetricsSystemLoader loader = Mockito.mock(MetricsSystemLoader.class);
+
+    Mockito.when(loader.getFactories()).thenReturn(factories);
+    Mockito.when(loader._load(Mockito.any(MetricsSystemConfiguration.class))).thenCallRealMethod();
+
+    // We had two factories loaded, therefore we'll fall back to the NoopMetricsSystem
+    MetricsSystem system = loader._load(NoopMetricsSystemConfiguration.getInstance());
+    assertEquals(NoopMetricsSystem.getInstance(), system);
+  }
+
+  @Test public void testNoInstances() {
+    // The type of the factories doesn't matter (we can send duplicates for testing purposes)
+    final List<MetricsSystemFactory> factories = Collections.emptyList();
+    MetricsSystemLoader loader = Mockito.mock(MetricsSystemLoader.class);
+
+    Mockito.when(loader.getFactories()).thenReturn(factories);
+    Mockito.when(loader._load(Mockito.any(MetricsSystemConfiguration.class))).thenCallRealMethod();
+
+    // We had no factories loaded, therefore we'll fall back to the NoopMetricsSystem
+    MetricsSystem system = loader._load(NoopMetricsSystemConfiguration.getInstance());
+    assertEquals(NoopMetricsSystem.getInstance(), system);
+  }
+
+  /**
+   * A test factory implementation which can return a recognized MetricsSystem implementation.
+   */
+  private static class MarkedNoopMetricsSystemFactory implements MetricsSystemFactory {
+    public MarkedMetricsSystem create(MetricsSystemConfiguration<?> config) {
+      return MarkedMetricsSystem.INSTANCE;
+    }
+  }
+
+  /**
+   * A metrics system implementation that is identifiable for testing.
+   */
+  private static class MarkedMetricsSystem implements MetricsSystem {
+    private static final MarkedMetricsSystem INSTANCE = new MarkedMetricsSystem();
+
+    private MarkedMetricsSystem() {}
+
+    @Override public Timer getTimer(String name) {
+      return null;
+    }
+
+    @Override public Histogram getHistogram(String name) {
+      return null;
+    }
+
+    @Override public Meter getMeter(String name) {
+      return null;
+    }
+
+    @Override public Counter getCounter(String name) {
+      return null;
+    }
+
+    @Override public <T> void register(String name, Gauge<T> gauge) {}
+  }
+}
+
+// End MetricsSystemLoaderTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemFactoryTest.java
----------------------------------------------------------------------
diff --git a/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemFactoryTest.java b/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemFactoryTest.java
new file mode 100644
index 0000000..3060b2f
--- /dev/null
+++ b/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemFactoryTest.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.noop;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Test class for {@link NoopMetricsSystemFactory}.
+ */
+public class NoopMetricsSystemFactoryTest {
+
+  @Test public void testSingleton() {
+    NoopMetricsSystemFactory factory = new NoopMetricsSystemFactory();
+    NoopMetricsSystemConfiguration config = NoopMetricsSystemConfiguration.getInstance();
+    assertTrue("The factory should only return one NoopMetricsSystem instance",
+        factory.create(config) == factory.create(config));
+  }
+
+}
+
+// End NoopMetricsSystemFactoryTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemTest.java
----------------------------------------------------------------------
diff --git a/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemTest.java b/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemTest.java
new file mode 100644
index 0000000..f28d123
--- /dev/null
+++ b/avatica/metrics/src/test/java/org/apache/calcite/avatica/metrics/noop/NoopMetricsSystemTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.MetricsSystem;
+import org.apache.calcite.avatica.metrics.Timer;
+import org.apache.calcite.avatica.metrics.Timer.Context;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests for {@link NoopMetricsSystem}.
+ */
+public class NoopMetricsSystemTest {
+
+  @Test public void testNoNulls() {
+    // The NOOP implementation should act as a real implementation, no "nulls" allowed.
+    MetricsSystem metrics = NoopMetricsSystem.getInstance();
+
+    Counter counter = metrics.getCounter("counter");
+    counter.decrement();
+    counter.increment();
+    counter.decrement(1L);
+    counter.increment(1L);
+
+    Histogram histogram = metrics.getHistogram("histogram");
+    histogram.update(1);
+    histogram.update(1L);
+
+    Timer timer = metrics.getTimer("timer");
+    Context context = timer.start();
+    context.close();
+    Context contextTwo = timer.start();
+    assertTrue("Timer's context should be a singleton", context == contextTwo);
+
+    Meter meter = metrics.getMeter("meter");
+    meter.mark();
+    meter.mark(5L);
+
+    metrics.register("gauge", new Gauge<Long>() {
+      @Override public Long getValue() {
+        return 42L;
+      }
+    });
+  }
+
+  @Test public void testSingleton() {
+    assertTrue("Should be a singleton",
+        NoopMetricsSystem.getInstance() == NoopMetricsSystem.getInstance());
+  }
+}
+
+// End NoopMetricsSystemTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/metrics/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/avatica/metrics/src/test/resources/log4j.properties b/avatica/metrics/src/test/resources/log4j.properties
new file mode 100644
index 0000000..834e2db
--- /dev/null
+++ b/avatica/metrics/src/test/resources/log4j.properties
@@ -0,0 +1,24 @@
+# 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.
+
+# Root logger is configured at INFO and is sent to A1
+log4j.rootLogger=INFO, A1
+
+# A1 goes to the console
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# Set the pattern for each log message
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p - %m%n

http://git-wip-us.apache.org/repos/asf/calcite/blob/5cee486f/avatica/noop-driver/pom.xml
----------------------------------------------------------------------
diff --git a/avatica/noop-driver/pom.xml b/avatica/noop-driver/pom.xml
new file mode 100644
index 0000000..5c2326c
--- /dev/null
+++ b/avatica/noop-driver/pom.xml
@@ -0,0 +1,110 @@
+<?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.avatica</groupId>
+    <artifactId>calcite-avatica-parent</artifactId>
+    <version>1.7.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>calcite-avatica-noop</artifactId>
+  <packaging>jar</packaging>
+  <name>Calcite Avatica Noop</name>
+  <description>A Noop JDBC driver.</description>
+
+  <properties>
+    <top.dir>${project.basedir}/..</top.dir>
+  </properties>
+
+  <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>
+
+      <!-- Produce a tests jar so that avatica-server/pom.xml can reference for suite.
+           TODO: remove after moving over to annotation-based TestSuite definitions. -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>test-jar</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>


Mime
View raw message