http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-core/src/main/java/org/apache/phoenix/trace/TracingUtils.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/trace/TracingUtils.java b/phoenix-core/src/main/java/org/apache/phoenix/trace/TracingUtils.java new file mode 100644 index 0000000..6ae52d8 --- /dev/null +++ b/phoenix-core/src/main/java/org/apache/phoenix/trace/TracingUtils.java @@ -0,0 +1,63 @@ +/** + * 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.phoenix.trace; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.Pair; +import org.cloudera.htrace.Span; + +/** + * Utilities for tracing + */ +public class TracingUtils { + + private static final Log LOG = LogFactory.getLog(TracingUtils.class); + + public static final String METRIC_SOURCE_KEY = "phoenix."; + + /** Set context to enable filtering */ + public static final String METRICS_CONTEXT = "tracing"; + + /** Marker metric to ensure that we register the tracing mbeans */ + public static final String METRICS_MARKER_CONTEXT = "marker"; + + public static void addAnnotation(Span span, String message, int value) { + span.addKVAnnotation(message.getBytes(), Bytes.toBytes(Integer.toString(value))); + } + + public static Pair<String, String> readAnnotation(byte[] key, byte[] value) { + return new Pair<String, String>(new String(key), Bytes.toString(value)); + } + + /** + * @see #getTraceMetricName(String) + */ + public static final String getTraceMetricName(long traceId) { + return getTraceMetricName(Long.toString(traceId)); + } + + /** + * @param traceId unique id of the trace + * @return the name of the metric record that should be generated for a given trace + */ + public static final String getTraceMetricName(String traceId) { + return METRIC_SOURCE_KEY + traceId; + } +}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-core/src/main/java/org/apache/phoenix/trace/util/Tracing.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/trace/util/Tracing.java b/phoenix-core/src/main/java/org/apache/phoenix/trace/util/Tracing.java index d0677cf..b093b9c 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/trace/util/Tracing.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/trace/util/Tracing.java @@ -36,8 +36,7 @@ import org.apache.phoenix.call.CallWrapper; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.query.QueryServicesOptions; -import org.apache.phoenix.trace.TracingCompat; -import org.apache.phoenix.util.StringUtil; +import org.apache.phoenix.trace.TraceMetricSource; import org.cloudera.htrace.Sampler; import org.cloudera.htrace.Span; import org.cloudera.htrace.Trace; @@ -313,7 +312,7 @@ public class Tracing { public synchronized static void addTraceMetricsSource() { try { if (!initialized) { - Trace.addReceiver(TracingCompat.newTraceMetricSource()); + Trace.addReceiver(new TraceMetricSource()); } } catch (RuntimeException e) { LOG.warn("Tracing will outputs will not be written to any metrics sink! No " http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-core/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricCounterLong.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricCounterLong.java b/phoenix-core/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricCounterLong.java new file mode 100644 index 0000000..f4dfd74 --- /dev/null +++ b/phoenix-core/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricCounterLong.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.hadoop.metrics2.impl; + +import org.apache.hadoop.metrics2.MetricsInfo; + +/** + * + */ +public class ExposedMetricCounterLong extends MetricCounterLong { + + + + /** + * @param info + * @param value + */ + public ExposedMetricCounterLong(MetricsInfo info, long value) { + super(info, value); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-core/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricsRecordImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricsRecordImpl.java b/phoenix-core/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricsRecordImpl.java new file mode 100644 index 0000000..c5f54e6 --- /dev/null +++ b/phoenix-core/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricsRecordImpl.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.hadoop.metrics2.impl; + +import java.util.List; + +import org.apache.hadoop.metrics2.AbstractMetric; +import org.apache.hadoop.metrics2.MetricsInfo; +import org.apache.hadoop.metrics2.MetricsTag; + +/** + * Helper class to access the package-private {@link MetricsRecordImpl} + */ +@SuppressWarnings("javadoc") +public class ExposedMetricsRecordImpl extends MetricsRecordImpl { + + /** + * @param info + * @param timestamp + * @param tags + * @param metrics + */ + public ExposedMetricsRecordImpl(MetricsInfo info, long timestamp, List<MetricsTag> tags, + Iterable<AbstractMetric> metrics) { + super(info, timestamp, tags, metrics); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-core/src/test/java/org/apache/hadoop/metrics2/lib/ExposedMetricsInfoImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/hadoop/metrics2/lib/ExposedMetricsInfoImpl.java b/phoenix-core/src/test/java/org/apache/hadoop/metrics2/lib/ExposedMetricsInfoImpl.java new file mode 100644 index 0000000..1ad1553 --- /dev/null +++ b/phoenix-core/src/test/java/org/apache/hadoop/metrics2/lib/ExposedMetricsInfoImpl.java @@ -0,0 +1,34 @@ +/** + * 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.hadoop.metrics2.lib; + +import org.apache.hadoop.metrics2.lib.MetricsInfoImpl; + +/** + * Helper class to expose access to the {@link org.apache.hadoop.metrics2.lib.MetricsInfoImpl} + */ +public class ExposedMetricsInfoImpl extends MetricsInfoImpl { + + /** + * @param name + * @param description + */ + public ExposedMetricsInfoImpl(String name, String description) { + super(name, description); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-core/src/test/java/org/apache/phoenix/metrics/LoggingSink.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/metrics/LoggingSink.java b/phoenix-core/src/test/java/org/apache/phoenix/metrics/LoggingSink.java new file mode 100644 index 0000000..2cea684 --- /dev/null +++ b/phoenix-core/src/test/java/org/apache/phoenix/metrics/LoggingSink.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.phoenix.metrics; + +import org.apache.commons.configuration.SubsetConfiguration; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.metrics2.AbstractMetric; +import org.apache.hadoop.metrics2.MetricsRecord; +import org.apache.hadoop.metrics2.MetricsSink; +import org.apache.phoenix.trace.TracingUtils; + +/** + * Simple sink that just logs the output of all the metrics that start with + * {@link org.apache.phoenix.trace.TracingUtils#METRIC_SOURCE_KEY} + */ +public class LoggingSink implements MetricsSink { + + private static final Log LOG = LogFactory.getLog(LoggingSink.class); + + @Override + public void init(SubsetConfiguration config) { + } + + @Override + public void putMetrics(MetricsRecord record) { + // we could wait until flush, but this is a really lightweight process, so we just write + // them + // as soon as we get them + if (!LOG.isDebugEnabled()) { + return; + } + LOG.debug("Found record:" + record.name()); + for (AbstractMetric metric : record.metrics()) { + // just print the metric we care about + if (metric.name().startsWith(TracingUtils.METRIC_SOURCE_KEY)) { + LOG.debug("\t metric:" + metric); + } + } + } + + @Override + public void flush() { + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-core/src/test/java/org/apache/phoenix/trace/TraceMetricsSourceTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/trace/TraceMetricsSourceTest.java b/phoenix-core/src/test/java/org/apache/phoenix/trace/TraceMetricsSourceTest.java new file mode 100644 index 0000000..5cb34b8 --- /dev/null +++ b/phoenix-core/src/test/java/org/apache/phoenix/trace/TraceMetricsSourceTest.java @@ -0,0 +1,96 @@ +/** + * 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.phoenix.trace; + +import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.metrics2.MetricsCollector; +import org.apache.hadoop.metrics2.MetricsRecordBuilder; +import org.apache.hadoop.metrics2.MetricsTag; +import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; +import org.cloudera.htrace.Span; +import org.cloudera.htrace.impl.MilliSpan; +import org.junit.BeforeClass; +import org.junit.Test; +import org.mockito.Mockito; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Test that the @{link TraceMetricSource} correctly handles different kinds of traces + */ +public class TraceMetricsSourceTest { + + @BeforeClass + public static void setup() throws Exception{ + DefaultMetricsSystem.setMiniClusterMode(true); + } + + /** + * For PHOENIX-1126, Phoenix originally assumed all the annotation values were integers, + * but HBase writes some strings as well, so we need to be able to handle that too + */ + @Test + public void testNonIntegerAnnotations(){ + Span span = getSpan(); + // make sure its less than the length of an integer + byte[] value = Bytes.toBytes("a"); + byte[] someInt = Bytes.toBytes(1); + assertTrue(someInt.length >value.length); + + // an annotation that is not an integer + span.addKVAnnotation(Bytes.toBytes("key"), value); + + // Create the sink and write the span + TraceMetricSource source = new TraceMetricSource(); + source.receiveSpan(span); + } + + @Test + public void testIntegerAnnotations(){ + Span span = getSpan(); + + // add annotation through the phoenix interfaces + TracingUtils.addAnnotation(span, "message", 10); + + TraceMetricSource source = new TraceMetricSource(); + source.receiveSpan(span); + } + + /** + * If the source does not write any metrics when there are no spans, i.e. when initialized, + * then the metrics system will discard the source, so it needs to always emit some metrics. + */ + @Test + public void testWritesInfoWhenNoSpans(){ + TraceMetricSource source = new TraceMetricSource(); + MetricsCollector collector = Mockito.mock(MetricsCollector.class); + MetricsRecordBuilder builder = Mockito.mock(MetricsRecordBuilder.class); + Mockito.when(collector.addRecord(Mockito.anyString())).thenReturn(builder); + + source.getMetrics(collector, true); + + // verify that we add a record and that the record has some info + Mockito.verify(collector).addRecord(Mockito.anyString()); + Mockito.verify(builder).add(Mockito.any(MetricsTag.class)); + } + + private Span getSpan(){ + return new MilliSpan("test span", 0, 1 , 2, "pid"); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/pom.xml ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/pom.xml b/phoenix-hadoop-compat/pom.xml deleted file mode 100644 index c2f810a..0000000 --- a/phoenix-hadoop-compat/pom.xml +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version='1.0'?> -<!-- - - 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.phoenix</groupId> - <artifactId>phoenix</artifactId> - <version>5.0.0-SNAPSHOT</version> - </parent> - <artifactId>phoenix-hadoop-compat</artifactId> - <name>Phoenix Hadoop Compatibility</name> - <description>Compatibility layer for Hadoop versions</description> - - <build> - <plugins> - <!-- Run with -Dmaven.test.skip.exec=true to build -tests.jar without running - tests (this is needed for upstream projects whose tests need this jar simply for - compilation) --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <version>2.4</version><!--$NO-MVN-MAN-VER$--> - <executions> - <execution> - <phase>prepare-package - </phase> - <goals> - <goal>test-jar</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <!--Make it so assembly:single does nothing in here --> - <artifactId>maven-assembly-plugin</artifactId> - <configuration> - <skipAssembly>true</skipAssembly> - </configuration> - </plugin> - </plugins> - </build> - - <dependencies> - <dependency> - <groupId>org.cloudera.htrace</groupId> - <artifactId>htrace-core</artifactId> - </dependency> - <dependency> - <groupId>org.apache.hbase</groupId> - <artifactId>hbase-hadoop-compat</artifactId> - </dependency> - <dependency> - <groupId>com.google.guava</groupId> - <artifactId>guava</artifactId> - </dependency> - <dependency> - <groupId>log4j</groupId> - <artifactId>log4j</artifactId> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - </dependency> - <dependency> - <groupId>org.apache.hbase</groupId> - <artifactId>hbase-common</artifactId> - </dependency> - </dependencies> -</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricInfo.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricInfo.java b/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricInfo.java deleted file mode 100644 index e6ad976..0000000 --- a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * 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.phoenix.metrics; - -/** - * Metrics and their conversion from the trace name to the name we store in the stats table - */ -public enum MetricInfo { - - TRACE("", "trace_id"), - SPAN("span_id", "span_id"), - PARENT("parent_id", "parent_id"), - START("start_time", "start_time"), - END("end_time", "end_time"), - TAG("phoenix.tag", "t"), - ANNOTATION("phoenix.annotation", "a"), - HOSTNAME("Hostname", "hostname"), - DESCRIPTION("", "description"); - - public final String traceName; - public final String columnName; - - private MetricInfo(String traceName, String columnName) { - this.traceName = traceName; - this.columnName = columnName; - } - - public static String getColumnName(String traceName) { - for (MetricInfo info : MetricInfo.values()) { - if (info.traceName.equals(traceName)) { - return info.columnName; - } - } - throw new IllegalArgumentException("Unknown tracename: " + traceName); - } -} http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/Metrics.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/Metrics.java b/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/Metrics.java deleted file mode 100644 index 5bc8545..0000000 --- a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/Metrics.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * 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.phoenix.metrics; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.hbase.CompatibilitySingletonFactory; - -public class Metrics { - - private static final Log LOG = LogFactory.getLog(Metrics.class); - - private static volatile MetricsManager manager; - - private static boolean initialized; - - /** This must match the prefix that we are using in the hadoop-metrics2 config on the client */ - public static final String METRICS_SYSTEM_NAME = "phoenix"; - public static MetricsManager initialize() { - MetricsManager manager = Metrics.getManager(); - // if the jars aren't on the classpath, then we don't start the metrics system - if (manager == null) { - LOG.warn("Phoenix metrics could not be initialized - no MetricsManager found!"); - return null; - } - // only initialize the metrics system once - synchronized (Metrics.class) { - if (!initialized) { - LOG.info("Initializing metrics system: " + Metrics.METRICS_SYSTEM_NAME); - manager.initialize(Metrics.METRICS_SYSTEM_NAME); - initialized = true; - } - } - return manager; - } - - /** - * @return get the first {@link MetricsManager} on the classpath. Always returns the same object - */ - public static MetricsManager getManager(){ - if(manager == null){ - synchronized(Metrics.class){ - if(manager == null){ - manager = CompatibilitySingletonFactory.getInstance(MetricsManager.class); - } - } - } - return manager; - } - - private static volatile boolean sinkInitialized = false; - - /** - * Mark that the metrics/tracing sink has been initialized - */ - public static void markSinkInitialized() { - sinkInitialized = true; - } - - public static void ensureConfigured() { - if (!sinkInitialized) { - LOG.warn("Phoenix metrics2/tracing sink was not started. Should be it be?"); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricsManager.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricsManager.java b/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricsManager.java deleted file mode 100644 index 13c9435..0000000 --- a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricsManager.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * 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.phoenix.metrics; - -/** - * Metrics management system. Backed by the underlying hadoop metrics, depending on the project on - * the classpath. - * <p> - * The underlying types passed to method must match the expected metrics type - this will vary for - * the underlying metrics systems (hadoop1 vs hadoop2), but can't be specified at this layer because - * we must be compatible with both systems. - */ -public interface MetricsManager { - - /** - * @param metricsSystemName the metrics prefix to initialize, if it hasn't already been - * initialized. Not assumed to be thread-safe, unless otherwise noted in the - * implementation. - */ - public abstract void initialize(String metricsSystemName); - - /** - * Register a metrics sink - * @param <T> the type of the sink - * @param sink to register - * @param name of the sink. Must be unique. - * @param desc the description of the sink - * @return the sink - */ - public abstract <T> T register(String name, String desc, T sink); - - /** - * Register a metrics source. - * @param name name of the source - must be unique - * @param description description of the source - * @param source to register. - * @param <T> the type of the source - * @return the source - */ - public abstract <T> T registerSource(String name, String description, T source); - - public void shutdown(); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricsWriter.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricsWriter.java b/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricsWriter.java deleted file mode 100644 index 0e8b9fe..0000000 --- a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/MetricsWriter.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * 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.phoenix.metrics; - - -/** - * Generic writer for a phoenix metric - */ -public interface MetricsWriter { - - public void initialize(); - - public void flush(); - - public void addMetrics(PhoenixMetricsRecord record); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixAbstractMetric.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixAbstractMetric.java b/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixAbstractMetric.java deleted file mode 100644 index 27ae6b8..0000000 --- a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixAbstractMetric.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * 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.phoenix.metrics; - - -public interface PhoenixAbstractMetric { - - public String getName(); - - /** - * Get the value of the metric - * @return the value of the metric - */ - public Number value(); -} http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixMetricTag.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixMetricTag.java b/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixMetricTag.java deleted file mode 100644 index 123cc1c..0000000 --- a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixMetricTag.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * 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.phoenix.metrics; - -public interface PhoenixMetricTag { - - public String name(); - - public String description(); - - public String value(); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixMetricsRecord.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixMetricsRecord.java b/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixMetricsRecord.java deleted file mode 100644 index 68f7c46..0000000 --- a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/metrics/PhoenixMetricsRecord.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * 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.phoenix.metrics; - -import java.util.Collection; - - -/** - * - */ -public interface PhoenixMetricsRecord { - - public String name(); - - public String description(); - - public Iterable<PhoenixAbstractMetric> metrics(); - - public Collection<PhoenixMetricTag> tags(); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/PhoenixSpanReceiver.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/PhoenixSpanReceiver.java b/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/PhoenixSpanReceiver.java deleted file mode 100644 index 7e4e09c..0000000 --- a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/PhoenixSpanReceiver.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * 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.phoenix.trace; - -import org.cloudera.htrace.SpanReceiver; - -/** - * Marker interface for phoenix specific receivers. - */ -public interface PhoenixSpanReceiver extends SpanReceiver { -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/TestableMetricsWriter.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/TestableMetricsWriter.java b/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/TestableMetricsWriter.java deleted file mode 100644 index b6bc75d..0000000 --- a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/TestableMetricsWriter.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * 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.phoenix.trace; - -import org.apache.phoenix.metrics.MetricsWriter; - -/** - * Marker interface for a MetricsWriter that can be registered to the current metrics system. The - * writer should convert from the metrics information it receives from the metrics system to Phoenix - * records that the MetricsWriter can read (and subsequently write). - */ -public interface TestableMetricsWriter { - - public void setWriterForTesting(MetricsWriter writer); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/TracingCompat.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/TracingCompat.java b/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/TracingCompat.java deleted file mode 100644 index e0a3410..0000000 --- a/phoenix-hadoop-compat/src/main/java/org/apache/phoenix/trace/TracingCompat.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * 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.phoenix.trace; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.hbase.CompatibilityFactory; -import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.hbase.util.Pair; -import org.apache.phoenix.metrics.MetricsWriter; -import org.cloudera.htrace.Span; -import org.cloudera.htrace.SpanReceiver; - -/** - * Utilities for tracing that are common among the compatibility and core classes. - */ -public class TracingCompat { - - private static final Log LOG = LogFactory.getLog(TracingCompat.class); - - /** - * @return a new SpanReceiver that will write to the correct metrics system - */ - public static SpanReceiver newTraceMetricSource() { - return CompatibilityFactory.getInstance(PhoenixSpanReceiver.class); - } - - public static final String METRIC_SOURCE_KEY = "phoenix."; - - /** Set context to enable filtering */ - public static final String METRICS_CONTEXT = "tracing"; - - /** Marker metric to ensure that we register the tracing mbeans */ - public static final String METRICS_MARKER_CONTEXT = "marker"; - - public static void addAnnotation(Span span, String message, int value) { - span.addKVAnnotation(message.getBytes(), Bytes.toBytes(Integer.toString(value))); - } - - public static Pair<String, String> readAnnotation(byte[] key, byte[] value) { - return new Pair<String, String>(new String(key), Bytes.toString(value)); - } - - public static MetricsWriter initializeWriter(String clazz) { - try { - MetricsWriter writer = - Class.forName(clazz).asSubclass(MetricsWriter.class).newInstance(); - writer.initialize(); - return writer; - } catch (InstantiationException e) { - LOG.error("Failed to create metrics writer: " + clazz, e); - } catch (IllegalAccessException e) { - LOG.error("Failed to create metrics writer: " + clazz, e); - } catch (ClassNotFoundException e) { - LOG.error("Failed to create metrics writer: " + clazz, e); - } - return null; - } - - /** - * @see #getTraceMetricName(String) - */ - public static final String getTraceMetricName(long traceId) { - return getTraceMetricName(Long.toString(traceId)); - } - - /** - * @param traceId unique id of the trace - * @return the name of the metric record that should be generated for a given trace - */ - public static final String getTraceMetricName(String traceId) { - return METRIC_SOURCE_KEY + traceId; - } -} http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/test/java/org/apache/phoenix/metrics/LoggingSink.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/test/java/org/apache/phoenix/metrics/LoggingSink.java b/phoenix-hadoop-compat/src/test/java/org/apache/phoenix/metrics/LoggingSink.java deleted file mode 100644 index 97682b3..0000000 --- a/phoenix-hadoop-compat/src/test/java/org/apache/phoenix/metrics/LoggingSink.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * 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.phoenix.metrics; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.phoenix.trace.TracingCompat; - -/** - * Simple sink that just logs the output of all the metrics that start with - * {@link TracingCompat#METRIC_SOURCE_KEY} - */ -public class LoggingSink implements MetricsWriter { - - private static final Log LOG = LogFactory.getLog(LoggingSink.class); - - @Override - public void initialize() { - } - - @Override - public void addMetrics(PhoenixMetricsRecord record) { - // we could wait until flush, but this is a really lightweight process, so we just write - // them - // as soon as we get them - if (!LOG.isDebugEnabled()) { - return; - } - LOG.debug("Found record:" + record.name()); - for (PhoenixAbstractMetric metric : record.metrics()) { - // just print the metric we care about - if (metric.getName().startsWith(TracingCompat.METRIC_SOURCE_KEY)) { - LOG.debug("\t metric:" + metric); - } - } - } - - @Override - public void flush() { - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop-compat/src/test/java/org/apache/phoenix/metrics/TracingTestCompat.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop-compat/src/test/java/org/apache/phoenix/metrics/TracingTestCompat.java b/phoenix-hadoop-compat/src/test/java/org/apache/phoenix/metrics/TracingTestCompat.java deleted file mode 100644 index 8dd8a41..0000000 --- a/phoenix-hadoop-compat/src/test/java/org/apache/phoenix/metrics/TracingTestCompat.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * 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.phoenix.metrics; - -import org.apache.hadoop.hbase.CompatibilityFactory; -import org.apache.phoenix.trace.TestableMetricsWriter; - -/** - * Utility class for testing tracing - */ -public class TracingTestCompat { - - private TracingTestCompat() { - assert false; - } - - public static TestableMetricsWriter newTraceMetricSink() { - return CompatibilityFactory.getInstance(TestableMetricsWriter.class); - } - - /** - * Register the sink with the metrics system, so we don't need to specify it in the conf - * @param sink - */ - public static void registerSink(MetricsWriter sink) { - TestableMetricsWriter writer = newTraceMetricSink(); - writer.setWriterForTesting(sink); - Metrics.getManager().register("phoenix", "test sink gets logged", writer); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/pom.xml ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/pom.xml b/phoenix-hadoop2-compat/pom.xml deleted file mode 100644 index 7944a51..0000000 --- a/phoenix-hadoop2-compat/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ -<?xml version='1.0'?> -<!-- - - 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.phoenix</groupId> - <artifactId>phoenix</artifactId> - <version>5.0.0-SNAPSHOT</version> - </parent> - <artifactId>phoenix-hadoop2-compat</artifactId> - <name>Phoenix Hadoop2 Compatibility</name> - - <dependencies> - <!-- Intra-project dependencies --> - <dependency> - <groupId>org.apache.phoenix</groupId> - <artifactId>phoenix-hadoop-compat</artifactId> - </dependency> - <!-- HBase --> - <dependency> - <groupId>org.apache.hbase</groupId> - <artifactId>hbase-common</artifactId> - <exclusions> - <exclusion> - <artifactId>hadoop-core</artifactId> - <groupId>org.apache.hadoop</groupId> - </exclusion> - </exclusions> - </dependency> - <!-- Hadoop --> - <dependency> - <groupId>org.apache.hadoop</groupId> - <artifactId>hadoop-mapreduce-client-core</artifactId> - <version>${hadoop-two.version}</version> - </dependency> - <dependency> - <groupId>org.apache.hadoop</groupId> - <artifactId>hadoop-annotations</artifactId> - <version>${hadoop-two.version}</version> - </dependency> - <dependency> - <groupId>org.apache.hadoop</groupId> - <artifactId>hadoop-common</artifactId> - <version>${hadoop-two.version}</version> - </dependency> - <!-- Other --> - <dependency> - <groupId>com.google.guava</groupId> - <artifactId>guava</artifactId> - </dependency> - <!-- Test --> - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-all</artifactId> - </dependency> - </dependencies> -</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/metrics/MetricsManagerImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/metrics/MetricsManagerImpl.java b/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/metrics/MetricsManagerImpl.java deleted file mode 100644 index 03e06a5..0000000 --- a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/metrics/MetricsManagerImpl.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * 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.phoenix.metrics; - -import java.util.Arrays; - -import org.apache.hadoop.metrics2.MetricsSink; -import org.apache.hadoop.metrics2.MetricsSource; -import org.apache.hadoop.metrics2.MetricsSystem; -import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; - -import com.google.common.base.Preconditions; - -/** - * - */ -public class MetricsManagerImpl implements MetricsManager { - - private MetricsSystem system; - - @Override - /** - * Register a metrics sink - * @param <T> the type of the sink. - * @param sink to register - * @param name of the sink. Must be unique. - * @param desc the description of the sink - * @return the sink - * @throws IllegalArgumentException if sink is not a MetricsSink - */ - public <T> T register(String name, String desc, T sink) { - isA(sink, MetricsSink.class); - return (T) system.register(name, desc, (MetricsSink) sink); - } - - public <T> T registerSource(String name, String desc, T source) { - isA(source, MetricsSource.class); - return (T) system.register(name, desc, (MetricsSource) source); - } - - @Override - public void initialize(String prefix) { - this.system = DefaultMetricsSystem.initialize(prefix); - } - - private <T> void isA(T object, Class<?>... classes) { - boolean match = false; - for (Class<?> clazz : classes) { - if (clazz.isAssignableFrom(object.getClass())) { - match = true; - break; - } - } - Preconditions.checkArgument(match, object + " is not one of " + Arrays.toString(classes)); - } - - @Override - public void shutdown() { - if (this.system != null) { - this.system.shutdown(); - } - } -} http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/MetricsInfoImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/MetricsInfoImpl.java b/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/MetricsInfoImpl.java deleted file mode 100644 index 47c1dda..0000000 --- a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/MetricsInfoImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * 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.phoenix.trace; - -import com.google.common.base.Objects; -import static com.google.common.base.Preconditions.*; -import org.apache.hadoop.metrics2.MetricsInfo; - -/** - * Making implementing metric info a little easier - * <p> - * Just a copy of the same from Hadoop, but exposed for usage. - */ -public class MetricsInfoImpl implements MetricsInfo { - private final String name, description; - - MetricsInfoImpl(String name, String description) { - this.name = checkNotNull(name, "name"); - this.description = checkNotNull(description, "description"); - } - - @Override public String name() { - return name; - } - - @Override public String description() { - return description; - } - - @Override public boolean equals(Object obj) { - if (obj instanceof MetricsInfo) { - MetricsInfo other = (MetricsInfo) obj; - return Objects.equal(name, other.name()) && - Objects.equal(description, other.description()); - } - return false; - } - - @Override public int hashCode() { - return Objects.hashCode(name, description); - } - - @Override public String toString() { - return Objects.toStringHelper(this) - .add("name", name).add("description", description) - .toString(); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/PhoenixMetricsSink.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/PhoenixMetricsSink.java b/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/PhoenixMetricsSink.java deleted file mode 100644 index 3de7da3..0000000 --- a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/PhoenixMetricsSink.java +++ /dev/null @@ -1,191 +0,0 @@ -/** - * 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.phoenix.trace; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; - -import javax.annotation.Nullable; - -import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.SubsetConfiguration; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.metrics2.AbstractMetric; -import org.apache.hadoop.metrics2.MetricsRecord; -import org.apache.hadoop.metrics2.MetricsSink; -import org.apache.hadoop.metrics2.MetricsTag; -import org.apache.phoenix.metrics.Metrics; -import org.apache.phoenix.metrics.MetricsWriter; -import org.apache.phoenix.metrics.PhoenixAbstractMetric; -import org.apache.phoenix.metrics.PhoenixMetricTag; -import org.apache.phoenix.metrics.PhoenixMetricsRecord; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; -import com.google.common.base.Preconditions; -import com.google.common.collect.Iterators; - -/** - * Translate metrics from a Hadoop2 metrics2 metric to a generic PhoenixMetric that a - * {@link MetricsWriter} can then write out. - * <p> - * This class becomes unnecessary once we drop Hadoop1 support. - */ -public class PhoenixMetricsSink implements MetricsSink, TestableMetricsWriter { - - private static final Log LOG = LogFactory.getLog(PhoenixMetricsSink.class); - /** - * Metrics configuration key for the class that should be used for writing the output. - * <p> - * This would actually be set as: <code> - * phoenix.sink.<some instance name>.writer-class - * </code> Where <tt>some instance name</tt> is just any unique name, so properties can be - * differentiated - */ - public static final String PHOENIX_METRICS_WRITER_CLASS = "writer-class"; - - public static void setWriterClass(MetricsWriter writer, Configuration conf) { - conf.setProperty(PHOENIX_METRICS_WRITER_CLASS, writer.getClass().getName()); - } - - private MetricsWriter writer; - - public PhoenixMetricsSink() { - LOG.info("Writing tracing metrics to phoenix table"); - Metrics.markSinkInitialized(); - } - - @Override - public void init(SubsetConfiguration config) { - // instantiate the configured writer class - String clazz = config.getString(PHOENIX_METRICS_WRITER_CLASS); - LOG.info("Instantiating writer class: " + clazz); - this.writer = TracingCompat.initializeWriter(clazz); - Preconditions.checkNotNull(writer, "Could not correctly initialize metrics writer!"); - } - - @Override - @VisibleForTesting - public void setWriterForTesting(MetricsWriter writer) { - this.writer = writer; - } - - @Override - public void putMetrics(MetricsRecord record) { - writer.addMetrics(wrap(record)); - } - - @Override - public void flush() { - writer.flush(); - } - - /** - * Convert the passed record to a {@link PhoenixMetricsRecord} - * @param record to convert - * @return a generic {@link PhoenixMetricsRecord} that delegates to the record in all things - */ - private PhoenixMetricsRecord wrap(final MetricsRecord record) { - return new PhoenixMetricsRecord() { - - @Override - public String name() { - return record.name(); - } - - @Override - public String description() { - return record.description(); - } - - @Override - public Iterable<PhoenixAbstractMetric> metrics() { - final Iterable<AbstractMetric> iterable = record.metrics(); - return new Iterable<PhoenixAbstractMetric>(){ - - @Override - public Iterator<PhoenixAbstractMetric> iterator() { - final Iterator<AbstractMetric> iter = iterable.iterator(); - return Iterators.transform(iter, new Function<AbstractMetric, PhoenixAbstractMetric>() { - - @Override - @Nullable - public PhoenixAbstractMetric apply(@Nullable final AbstractMetric input) { - if (input == null) { - return null; - } - return new PhoenixAbstractMetric() { - - @Override - public Number value() { - return input.value(); - } - - @Override - public String getName() { - return input.name(); - } - - @Override - public String toString() { - return input.toString(); - } - }; - } - }); - } - }; - } - - @Override - public Collection<PhoenixMetricTag> tags() { - Collection<PhoenixMetricTag> tags = new ArrayList<PhoenixMetricTag>(); - Collection<MetricsTag> origTags = record.tags(); - for (final MetricsTag tag : origTags) { - tags.add(new PhoenixMetricTag() { - - @Override - public String name() { - return tag.name(); - } - - @Override - public String description() { - return tag.description(); - } - - @Override - public String value() { - return tag.value(); - } - - @Override - public String toString() { - return tag.toString(); - } - - }); - } - return tags; - } - - }; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/TraceMetricSource.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/TraceMetricSource.java b/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/TraceMetricSource.java deleted file mode 100644 index 1114a95..0000000 --- a/phoenix-hadoop2-compat/src/main/java/org/apache/phoenix/trace/TraceMetricSource.java +++ /dev/null @@ -1,197 +0,0 @@ -/** - * 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.phoenix.trace; - -import static org.apache.phoenix.metrics.MetricInfo.ANNOTATION; -import static org.apache.phoenix.metrics.MetricInfo.END; -import static org.apache.phoenix.metrics.MetricInfo.PARENT; -import static org.apache.phoenix.metrics.MetricInfo.SPAN; -import static org.apache.phoenix.metrics.MetricInfo.START; -import static org.apache.phoenix.metrics.MetricInfo.TAG; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.apache.hadoop.hbase.util.Pair; -import org.apache.hadoop.metrics2.MetricsCollector; -import org.apache.hadoop.metrics2.MetricsInfo; -import org.apache.hadoop.metrics2.MetricsRecordBuilder; -import org.apache.hadoop.metrics2.MetricsSource; -import org.apache.hadoop.metrics2.MetricsTag; -import org.apache.hadoop.metrics2.lib.Interns; -import org.apache.phoenix.metrics.MetricInfo; -import org.apache.phoenix.metrics.Metrics; -import org.apache.phoenix.metrics.MetricsManager; -import org.cloudera.htrace.HTraceConfiguration; -import org.cloudera.htrace.Span; -import org.cloudera.htrace.SpanReceiver; -import org.cloudera.htrace.TimelineAnnotation; -import org.cloudera.htrace.impl.MilliSpan; - -/** - * Sink for request traces ({@link SpanReceiver}) that pushes writes to {@link MetricsSource} in a - * format that we can more easily consume. - * <p> - * <p> - * Rather than write directly to a phoenix table, we drop it into the metrics queue so we can more - * cleanly handle it asyncrhonously.Currently, {@link MilliSpan} submits the span in a synchronized - * block to all the receivers, which could have a lot of overhead if we are submitting to multiple - * receivers. - * <p> - * The format of the generated metrics is this: - * <ol> - * <li>All Metrics from the same span have the same name (allowing correlation in the sink)</li> - * <li>The description of the metric describes what it contains. For instance, - * <ul> - * <li>{@link MetricInfo#PARENT} is the id of the parent of this span. (Root span is - * {@link Span#ROOT_SPAN_ID}).</li> - * <li>{@value MetricInfo#START} is the start time of the span</li> - * <li>{@value MetricInfo#END} is the end time of the span</li> - * </ul></li> - * <li>Each span's messages are contained in a {@link MetricsTag} with the same name as above and a - * generic counter for the number of messages (to differentiate messages and provide timeline - * ordering).</li> - * </ol> - * <p> - * <i>So why even submit to metrics2 framework if we only have a single source?</i> - * <p> - * This allows us to make the updates in batches. We might have spans that finish before other spans - * (for instance in the same parent). By batching the updates we can lessen the overhead on the - * client, which is also busy doing 'real' work. <br> - * We could make our own queue and manage batching and filtering and dropping extra metrics, but - * that starts to get complicated fast (its not as easy as it sounds) so we use metrics2 to abstract - * out that pipeline and also provides us flexibility to dump metrics to other sources. - * <p> - * This is a somewhat rough implementation - we do excessive locking for correctness, - * rather than trying to make it fast, for the moment. - */ -public class TraceMetricSource implements PhoenixSpanReceiver, MetricsSource { - - private static final String EMPTY_STRING = ""; - - private static final String CONTEXT = "tracing"; - - private List<Metric> spans = new ArrayList<Metric>(); - - public TraceMetricSource() { - MetricsManager manager = Metrics.initialize(); - - // Register this instance. - // For right now, we ignore the MBean registration issues that show up in DEBUG logs. Basically, - // we need a Jmx MBean compliant name. We'll get to a better name when we want that later - manager.registerSource(CONTEXT, "Phoenix call tracing", this); - } - - @Override - public void receiveSpan(Span span) { - Metric builder = new Metric(span); - // add all the metrics for the span - builder.addCounter(Interns.info(SPAN.traceName, EMPTY_STRING), span.getSpanId()); - builder.addCounter(Interns.info(PARENT.traceName, EMPTY_STRING), span.getParentId()); - builder.addCounter(Interns.info(START.traceName, EMPTY_STRING), span.getStartTimeMillis()); - builder.addCounter(Interns.info(END.traceName, EMPTY_STRING), span.getStopTimeMillis()); - // add the tags to the span. They were written in order received so we mark them as such - for (TimelineAnnotation ta : span.getTimelineAnnotations()) { - builder.add(new MetricsTag(Interns.info(TAG.traceName, Long.toString(ta.getTime())), ta - .getMessage())); - } - - // add the annotations. We assume they are serialized as strings and integers, but that can - // change in the future - Map<byte[], byte[]> annotations = span.getKVAnnotations(); - for (Entry<byte[], byte[]> annotation : annotations.entrySet()) { - Pair<String, String> val = - TracingCompat.readAnnotation(annotation.getKey(), annotation.getValue()); - builder.add(new MetricsTag(Interns.info(ANNOTATION.traceName, val.getFirst()), val - .getSecond())); - } - - // add the span to the list we care about - synchronized (this) { - spans.add(builder); - } - } - - @Override - public void getMetrics(MetricsCollector collector, boolean all) { - // add a marker record so we know how many spans are used - // this is also necessary to ensure that we register the metrics source as an MBean (avoiding a - // runtime warning) - MetricsRecordBuilder marker = collector.addRecord(TracingCompat.METRICS_MARKER_CONTEXT); - marker.add(new MetricsTag(new MetricsInfoImpl("stat", "num spans"), Integer - .toString(spans.size()))); - - // actually convert the known spans into metric records as well - synchronized (this) { - for (Metric span : spans) { - MetricsRecordBuilder builder = collector.addRecord(new MetricsInfoImpl(TracingCompat - .getTraceMetricName(span.id), span.desc)); - builder.setContext(TracingCompat.METRICS_CONTEXT); - for (Pair<MetricsInfo, Long> metric : span.counters) { - builder.addCounter(metric.getFirst(), metric.getSecond()); - } - for (MetricsTag tag : span.tags) { - builder.add(tag); - } - } - // reset the spans so we don't keep a big chunk of memory around - spans = new ArrayList<Metric>(); - } - } - - @Override - public void close() throws IOException { - // noop - } - - @Override - public void configure(HTraceConfiguration conf) { - // noop - } - - private static class Metric { - - List<Pair<MetricsInfo, Long>> counters = new ArrayList<Pair<MetricsInfo, Long>>(); - List<MetricsTag> tags = new ArrayList<MetricsTag>(); - private String id; - private String desc; - - public Metric(Span span) { - this.id = Long.toString(span.getTraceId()); - this.desc = span.getDescription(); - } - - /** - * @param metricsInfoImpl - * @param startTimeMillis - */ - public void addCounter(MetricsInfo metricsInfoImpl, long startTimeMillis) { - counters.add(new Pair<MetricsInfo, Long>(metricsInfoImpl, startTimeMillis)); - } - - /** - * @param metricsTag - */ - public void add(MetricsTag metricsTag) { - tags.add(metricsTag); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.metrics.MetricsManager ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.metrics.MetricsManager b/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.metrics.MetricsManager deleted file mode 100644 index 8430a48..0000000 --- a/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.metrics.MetricsManager +++ /dev/null @@ -1 +0,0 @@ -org.apache.phoenix.metrics.MetricsManagerImpl \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.trace.PhoenixSpanReceiver ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.trace.PhoenixSpanReceiver b/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.trace.PhoenixSpanReceiver deleted file mode 100644 index 3694093..0000000 --- a/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.trace.PhoenixSpanReceiver +++ /dev/null @@ -1 +0,0 @@ -org.apache.phoenix.trace.TraceMetricSource \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.trace.TestableMetricsWriter ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.trace.TestableMetricsWriter b/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.trace.TestableMetricsWriter deleted file mode 100644 index 7c9e107..0000000 --- a/phoenix-hadoop2-compat/src/main/resources/META-INF/services/org.apache.phoenix.trace.TestableMetricsWriter +++ /dev/null @@ -1 +0,0 @@ -org.apache.phoenix.trace.PhoenixMetricsSink \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricCounterLong.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricCounterLong.java b/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricCounterLong.java deleted file mode 100644 index 33ca738..0000000 --- a/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricCounterLong.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.hadoop.metrics2.impl; - -import org.apache.hadoop.metrics2.MetricsInfo; -import org.apache.hadoop.metrics2.impl.MetricCounterLong; - -/** - * - */ -public class ExposedMetricCounterLong extends MetricCounterLong { - - /** - * @param info - * @param value - */ - public ExposedMetricCounterLong(MetricsInfo info, long value) { - super(info, value); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricsRecordImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricsRecordImpl.java b/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricsRecordImpl.java deleted file mode 100644 index bcb8b43..0000000 --- a/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/impl/ExposedMetricsRecordImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.hadoop.metrics2.impl; - -import java.util.List; - -import org.apache.hadoop.metrics2.AbstractMetric; -import org.apache.hadoop.metrics2.MetricsInfo; -import org.apache.hadoop.metrics2.MetricsTag; -import org.apache.hadoop.metrics2.impl.MetricsRecordImpl; - -/** - * Helper class to access the package-private {@link MetricsRecordImpl} - */ -@SuppressWarnings("javadoc") -public class ExposedMetricsRecordImpl extends MetricsRecordImpl { - - /** - * @param info - * @param timestamp - * @param tags - * @param metrics - */ - public ExposedMetricsRecordImpl(MetricsInfo info, long timestamp, List<MetricsTag> tags, - Iterable<AbstractMetric> metrics) { - super(info, timestamp, tags, metrics); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/lib/ExposedMetricsInfoImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/lib/ExposedMetricsInfoImpl.java b/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/lib/ExposedMetricsInfoImpl.java deleted file mode 100644 index 6daf604..0000000 --- a/phoenix-hadoop2-compat/src/test/java/org/apache/hadoop/metrics2/lib/ExposedMetricsInfoImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * 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.hadoop.metrics2.lib; - -/** - * Helper class to expose access to the {@link MetricsInfoImpl} - */ -public class ExposedMetricsInfoImpl extends MetricsInfoImpl { - - /** - * @param name - * @param description - */ - public ExposedMetricsInfoImpl(String name, String description) { - super(name, description); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/842f8a8a/phoenix-hadoop2-compat/src/test/java/org/apache/phoenix/trace/PhoenixMetricsWriterTest.java ---------------------------------------------------------------------- diff --git a/phoenix-hadoop2-compat/src/test/java/org/apache/phoenix/trace/PhoenixMetricsWriterTest.java b/phoenix-hadoop2-compat/src/test/java/org/apache/phoenix/trace/PhoenixMetricsWriterTest.java deleted file mode 100644 index f865723..0000000 --- a/phoenix-hadoop2-compat/src/test/java/org/apache/phoenix/trace/PhoenixMetricsWriterTest.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * 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.phoenix.trace; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.List; - -import org.apache.hadoop.metrics2.AbstractMetric; -import org.apache.hadoop.metrics2.MetricsInfo; -import org.apache.hadoop.metrics2.MetricsRecord; -import org.apache.hadoop.metrics2.MetricsTag; -import org.apache.hadoop.metrics2.impl.ExposedMetricCounterLong; -import org.apache.hadoop.metrics2.impl.ExposedMetricsRecordImpl; -import org.apache.hadoop.metrics2.lib.ExposedMetricsInfoImpl; -import org.apache.phoenix.metrics.MetricInfo; -import org.apache.phoenix.metrics.MetricsWriter; -import org.apache.phoenix.metrics.PhoenixAbstractMetric; -import org.apache.phoenix.metrics.PhoenixMetricTag; -import org.apache.phoenix.metrics.PhoenixMetricsRecord; -import org.junit.Test; -import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - -import com.google.common.collect.Lists; - -/** - * Test that we correctly convert between hadoop2 metrics2 and generic phoenix metrics. - */ -public class PhoenixMetricsWriterTest { - - @Test - public void testTranslation() throws Exception { - // hook up a sink we can test - MetricsWriter mockSink = Mockito.mock(MetricsWriter.class); - - // writer that will translate to the sink (specific to hadoop version used) - PhoenixMetricsSink writer = new PhoenixMetricsSink(); - writer.setWriterForTesting(mockSink); - - // create a simple metrics record - final long traceid = 987654; - MetricsInfo info = new ExposedMetricsInfoImpl(TracingCompat.getTraceMetricName(traceid), - "Some generic trace"); - // setup some metrics for the span - long spanid = 10; - AbstractMetric span = new ExposedMetricCounterLong(new ExposedMetricsInfoImpl( - MetricInfo.SPAN.traceName, ""), spanid); - long parentid = 11; - AbstractMetric parent = new ExposedMetricCounterLong(new ExposedMetricsInfoImpl( - MetricInfo.PARENT.traceName, ""), parentid); - long startTime = 12; - AbstractMetric start = new ExposedMetricCounterLong(new ExposedMetricsInfoImpl( - MetricInfo.START.traceName, ""), startTime); - long endTime = 13; - AbstractMetric end = new ExposedMetricCounterLong(new ExposedMetricsInfoImpl( - MetricInfo.END.traceName, ""), endTime); - final List<AbstractMetric> metrics = Lists.newArrayList(span, parent, start, end); - - // create an annotation as well - String annotation = "test annotation for a span"; - MetricsTag tag = new MetricsTag( - new ExposedMetricsInfoImpl(MetricInfo.ANNOTATION.traceName, "0"), annotation); - String hostnameValue = "host-name.value"; - MetricsTag hostname = new MetricsTag(new ExposedMetricsInfoImpl(MetricInfo.HOSTNAME.traceName, - ""), hostnameValue); - final List<MetricsTag> tags = Lists.newArrayList(hostname, tag); - - MetricsRecord record = new ExposedMetricsRecordImpl(info, System.currentTimeMillis(), tags, - metrics); - - // setup the mocking/validation for the sink - Mockito.doAnswer(new Answer<Void>() { - - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - PhoenixMetricsRecord record = (PhoenixMetricsRecord) invocation.getArguments()[0]; - //validate that we got the right fields in the record - assertEquals("phoenix.987654", record.name()); - assertEquals("Some generic trace", record.description()); - int count = 0; - for (PhoenixAbstractMetric metric : record.metrics()) { - count++; - //find the matching metric in the list - boolean found = false; - for(AbstractMetric expected : metrics){ - if(expected.name().equals(metric.getName())){ - found = true; - // make sure the rest of the info matches - assertEquals("Metric value mismatch", expected.value(), metric.value()); - } - } - assertTrue("Didn't find an expected metric to match "+metric, found); - } - assertEquals("Number of metrics is received is wrong", metrics.size(), count); - - count = 0; - for (PhoenixMetricTag tag : record.tags()) { - count++; - // find the matching metric in the list - boolean found = false; - for (MetricsTag expected : tags) { - if (expected.name().equals(tag.name())) { - found = true; - // make sure the rest of the info matches - assertEquals("Tag value mismatch", expected.value(), tag.value()); - assertEquals("Tag description mismatch", expected.description(), tag.description()); - } - } - assertTrue("Didn't find an expected metric to match " + tag, found); - } - assertEquals("Number of tags is received is wrong", tags.size(), count); - return null; - } - - }).when(mockSink).addMetrics(Mockito.any(PhoenixMetricsRecord.class)); - - // actually do the update - writer.putMetrics(record); - writer.flush(); - - Mockito.verify(mockSink).addMetrics(Mockito.any(PhoenixMetricsRecord.class)); - Mockito.verify(mockSink).flush(); - } -} \ No newline at end of file