Repository: incubator-htrace Updated Branches: refs/heads/master df0927283 -> e1aa7a929
HTRACE-51 htraced java REST client (a.k.a java SpanReceiver for htraced) : REVERT FOR A SECOND TIME... NOT DONE YET Project: http://git-wip-us.apache.org/repos/asf/incubator-htrace/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-htrace/commit/e1aa7a92 Tree: http://git-wip-us.apache.org/repos/asf/incubator-htrace/tree/e1aa7a92 Diff: http://git-wip-us.apache.org/repos/asf/incubator-htrace/diff/e1aa7a92 Branch: refs/heads/master Commit: e1aa7a929eac18a34e8fc42a703ca31d9f2c1ac9 Parents: df09272 Author: stack <[email protected]> Authored: Wed Jan 28 17:06:37 2015 -0800 Committer: stack <[email protected]> Committed: Wed Jan 28 17:06:37 2015 -0800 ---------------------------------------------------------------------- htrace-core/pom.xml | 12 +- htrace-htraced/pom.xml | 150 ----------- .../apache/htrace/impl/HTracedRESTReceiver.java | 247 ------------------- .../htrace/impl/TestHTracedRESTReceiver.java | 117 --------- .../java/org/apache/htrace/util/DataDir.java | 97 -------- .../org/apache/htrace/util/HTracedProcess.java | 102 -------- .../apache/htrace/util/TestHTracedProcess.java | 93 ------- pom.xml | 25 +- 8 files changed, 12 insertions(+), 831 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e1aa7a92/htrace-core/pom.xml ---------------------------------------------------------------------- diff --git a/htrace-core/pom.xml b/htrace-core/pom.xml index bbc3de8..1d2f0ab 100644 --- a/htrace-core/pom.xml +++ b/htrace-core/pom.xml @@ -138,18 +138,20 @@ language governing permissions and limitations under the License. --> <artifactId>junit</artifactId> <scope>test</scope> </dependency> + <!-- core specific deps. --> + <dependency> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> + <version>2.4.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> - </dependency> - <!-- core specific deps. --> - <dependency> - <groupId>commons-logging</groupId> - <artifactId>commons-logging</artifactId> + <version>2.4.0</version> </dependency> </dependencies> http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e1aa7a92/htrace-htraced/pom.xml ---------------------------------------------------------------------- diff --git a/htrace-htraced/pom.xml b/htrace-htraced/pom.xml deleted file mode 100644 index 6995ed4..0000000 --- a/htrace-htraced/pom.xml +++ /dev/null @@ -1,150 +0,0 @@ -<?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> - - <artifactId>htrace-htraced</artifactId> - <packaging>jar</packaging> - - <parent> - <artifactId>htrace</artifactId> - <groupId>org.apache.htrace</groupId> - <version>3.2.0-incubating-SNAPSHOT</version> - <relativePath>..</relativePath> - </parent> - - <name>htrace-htraced</name> - <description>HTraced and HTraced clients</description> - <url>http://incubator.apache.org/projects/htrace.html</url> - - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - </properties> - - <build> - <plugins> - <plugin> - <!--Make it so assembly:single does nothing in here--> - <artifactId>maven-assembly-plugin</artifactId> - <configuration> - <skipAssembly>true</skipAssembly> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - </plugin> - <plugin> - <artifactId>maven-javadoc-plugin</artifactId> - </plugin> - <plugin> - <artifactId>maven-compiler-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-gpg-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.apache.rat</groupId> - <artifactId>apache-rat-plugin</artifactId> - </plugin> - <plugin> - <!-- explicitly define maven-deploy-plugin after other to force exec order --> - <artifactId>maven-deploy-plugin</artifactId> - </plugin> - <plugin> - <artifactId>maven-assembly-plugin</artifactId> - <configuration> - <descriptorRefs> - <descriptorRef>jar-with-dependencies</descriptorRef> - </descriptorRefs> - </configuration> - </plugin> - <!--Move this to top-level. These shade patterns are common across components - --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-shade-plugin</artifactId> - <executions> - <execution> - <phase>package</phase> - <configuration> - <relocations> - <relocation> - <pattern>org.apache.commons.logging</pattern> - <shadedPattern>org.apache.htrace.commons.logging</shadedPattern> - </relocation> - <relocation> - <pattern>com.fasterxml.jackson</pattern> - <shadedPattern>org.apache.htrace.fasterxml.jackson</shadedPattern> - </relocation> - <relocation> - <pattern>org.eclipse.jetty</pattern> - <shadedPattern>org.apache.htrace.jetty</shadedPattern> - </relocation> - </relocations> - </configuration> - <goals> - <goal>shade</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - <dependencies> - <!-- Module deps. --> - <dependency> - <groupId>org.apache.htrace</groupId> - <artifactId>htrace-core</artifactId> - <version>${project.version}</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.apache.htrace</groupId> - <artifactId>htrace-core</artifactId> - <version>${project.version}</version> - <classifier>tests</classifier> - <scope>test</scope> - </dependency> - <!-- Global deps. --> - <dependency> - <groupId>commons-logging</groupId> - <artifactId>commons-logging</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-core</artifactId> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - </dependency> - <!-- htraced rest client deps. --> - <!--Is this too much? Pulls down jetty-http, jetty-server, jetty-io - This is new-style jetty client, jetty9 and jdk7 required. - It can do async but we will use it synchronously at first. - Has nice tutorial: http://www.eclipse.org/jetty/documentation/9.1.5.v20140505/http-client-api.html - --> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-client</artifactId> - <version>9.2.6.v20141205</version> - </dependency> - </dependencies> -</project> http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e1aa7a92/htrace-htraced/src/main/java/org/apache/htrace/impl/HTracedRESTReceiver.java ---------------------------------------------------------------------- diff --git a/htrace-htraced/src/main/java/org/apache/htrace/impl/HTracedRESTReceiver.java b/htrace-htraced/src/main/java/org/apache/htrace/impl/HTracedRESTReceiver.java deleted file mode 100644 index 6b4d62b..0000000 --- a/htrace-htraced/src/main/java/org/apache/htrace/impl/HTracedRESTReceiver.java +++ /dev/null @@ -1,247 +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.htrace.impl; - - -import java.io.IOException; -import java.net.URL; -import java.util.Queue; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.htrace.HTraceConfiguration; -import org.apache.htrace.Span; -import org.apache.htrace.SpanReceiver; -import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.api.ContentResponse; -import org.eclipse.jetty.client.api.Request; -import org.eclipse.jetty.client.util.StringContentProvider; -import org.eclipse.jetty.http.HttpField; -import org.eclipse.jetty.http.HttpHeader; -import org.eclipse.jetty.http.HttpMethod; -import org.eclipse.jetty.http.HttpStatus; - -/** - * A {@link SpanReceiver} that passes Spans to htraced via REST. Implementation minimizes - * dependencies and aims for small footprint since this client will be the guest of another, - * the process traced. - * - * <p>Logs via commons-logging. Uses jetty client. Jetty has its own logging (TODO: connect - * jetty logging to commons-logging, see https://issues.apache.org/jira/browse/HADOOP-6807 - * and http://blogs.bytecode.com.au/glen/2005/06/21/getting-your-logging-working-in-jetty.html). - * - * <p>This client depends on the REST defined in <code>rest.go</code> in the htraced REST server. - * For example, a <code>GET</code> on <code>/server/info</code> returns the htraced server info. - * - * <p>Create an instance by doing: - * <code>SpanReceiver receiver = new HTracedRESTReceiver(conf);</code> where conf is an instance - * of {@link HTraceConfiguration}. See the public keys defined below for what we will look for in - * the configuration. For example, set {@link #HTRACED_REST_URL_KEY} if htraced is in non-standard - * location. Then call <code>receiver.receiveSpan(Span);</code> to send spans to an htraced - * instance. This method returns immediately. It sends the spans in background. - * - * <p>TODO: How to be more dependent on rest.go so we break if it changes? - * TODO: Shading works? - * TODO: Add lazy start; don't start background thread till a span gets queued. - * TODO: Add some metrics; how many times we've run, how many spans and what size we've sent. - */ -public class HTracedRESTReceiver implements SpanReceiver { - private static final Log LOG = LogFactory.getLog(HTracedRESTReceiver.class); - - // TODO: Take process name and add this to user agent? Would help debugging? - // @VisibleForTesting Protected so accessible from tests. - final HttpClient httpClient; - - /** - * REST URL to use writing Spans. - */ - private final String writeSpansRESTURL; - - /** - * Runs background task to do the REST PUT. - * TODO: Make period configurable. TODO: Make instantiation lazy. - */ - private final ScheduledExecutorService scheduler; - - /** - * Keep around reference so can cancel on close any running scheduled task. - */ - private final ScheduledFuture<?> scheduledFuture; - - /** - * Timeout in milliseconds. - * For now, it is read and connect timeout. - */ - public static final String CLIENT_REST_TIMEOUT_MS_KEY = "client.rest.timeout.ms"; - private static final int CLIENT_REST_TIMEOUT_MS_DEFAULT = 60000; - - /** - * URL of the htraced REST server we are to talk to. - */ - public static final String HTRACED_REST_URL_KEY = "htraced.rest.url"; - private static final String HTRACED_REST_URL_DEFAULT = "http://locahost:9095/"; - - /** - * Maximum size of the queue to accumulate spans in. - * Cleared by the background thread that does the REST POST to htraced. - */ - public static final String CLIENT_REST_QUEUE_CAPACITY_KEY = "client.rest.queue.capacity"; - private static final int CLIENT_REST_QUEUE_CAPACITY_DEFAULT = 1000000; - - /** - * Period at which the background thread that does the REST POST to htraced in ms. - */ - public static final String CLIENT_REST_PERIOD_MS_KEY = "client.reset.period.ms"; - private static final int CLIENT_REST_PERIOD_MS_DEFAULT = 1000; - - /** - * Maximum spans to post to htraced at a time. - */ - public static final String CLIENT_REST_MAX_SPANS_AT_A_TIME_KEY = - "client.rest.max.spans.at.a.time"; - private static final int CLIENT_REST_MAX_SPANS_AT_A_TIME_DEFAULT = 1000; - - /** - * Simple bounded queue to hold spans between periodic runs of the httpclient. - * TODO: Make size configurable. - */ - private final Queue<Span> queue; - - /** - * Keep last time we logged we were at capacity; used to prevent flooding of logs with - * "at capacity" messages. - */ - private volatile long lastAtCapacityWarningLog = 0L; - - public HTracedRESTReceiver(final HTraceConfiguration conf) throws Exception { - this.httpClient = new HttpClient(); - this.httpClient.setUserAgentField(new HttpField(HttpHeader.USER_AGENT, - this.getClass().getSimpleName())); - // Use same timeout for connection and idle for now. - int timeout = conf.getInt(CLIENT_REST_TIMEOUT_MS_KEY, CLIENT_REST_TIMEOUT_MS_DEFAULT); - this.httpClient.setConnectTimeout(timeout); - this.httpClient.setIdleTimeout(timeout); - int capacity = - conf.getInt(CLIENT_REST_QUEUE_CAPACITY_KEY, CLIENT_REST_QUEUE_CAPACITY_DEFAULT); - this.queue = new ArrayBlockingQueue<Span>(capacity, true); - // Build up the writeSpans URL. - URL restServer = new URL(conf.get(HTRACED_REST_URL_KEY, HTRACED_REST_URL_DEFAULT)); - URL url = - new URL(restServer.getProtocol(), restServer.getHost(), restServer.getPort(), "/writeSpans"); - this.writeSpansRESTURL = url.toString(); - // Make a scheduler with one thread to run our POST of spans on a period. - this.scheduler = Executors.newScheduledThreadPool(1); - // Period at which we run the background thread that does the REST POST to htraced. - int periodInMs = - conf.getInt(CLIENT_REST_PERIOD_MS_KEY, CLIENT_REST_PERIOD_MS_DEFAULT); - // Maximum spans to send in one go - int maxToSendAtATime = - conf.getInt(CLIENT_REST_MAX_SPANS_AT_A_TIME_KEY, CLIENT_REST_MAX_SPANS_AT_A_TIME_DEFAULT); - this.scheduledFuture = - this.scheduler.scheduleAtFixedRate(new PostSpans(this.queue, maxToSendAtATime), - periodInMs, periodInMs, TimeUnit.MILLISECONDS); - // Start up the httpclient. - this.httpClient.start(); - } - - /** - * POST spans runnable. - * Run on a period. Services the passed in queue taking spans and sending them to traced via http. - */ - private class PostSpans implements Runnable { - private final Queue<Span> q; - private final int maxToSendAtATime; - - private PostSpans(final Queue<Span> q, final int maxToSendAtATime) { - this.q = q; - this.maxToSendAtATime = maxToSendAtATime; - } - - @Override - public void run() { - Span span = null; - // Cycle until we drain the queue. Seen maxToSendAtATime at a time if more than we can send - // in one go. - while ((span = this.q.poll()) != null) { - // We got a span. Send at least this one span. - Request request = httpClient.newRequest(writeSpansRESTURL).method(HttpMethod.POST); - request.header(HttpHeader.CONTENT_TYPE, "application/json"); - int count = 1; - request.content(new StringContentProvider(span.toJson())); - // Drain queue of spans if more than just one. - while ((span = this.q.poll()) != null) { - request.content(new StringContentProvider(span.toJson())); - count++; - // If we've accumulated sufficient to send, go ahead and send what we have. Can do the - // rest in out next go around. - if (count > this.maxToSendAtATime) break; - } - try { - ContentResponse response = request.send(); - if (response.getStatus() == HttpStatus.OK_200) { - LOG.info("POSTED " + count + " spans"); - } else { - LOG.error("Status: " + response.getStatus()); - LOG.error(response.getHeaders()); - LOG.error(response.getContentAsString()); - } - } catch (InterruptedException e) { - LOG.error(e); - } catch (TimeoutException e) { - LOG.error(e); - } catch (ExecutionException e) { - LOG.error(e); - } - } - } - } - - @Override - public void close() throws IOException { - if (this.scheduledFuture != null) this.scheduledFuture.cancel(true); - if (this.scheduler == null) this.scheduler.shutdown(); - if (this.httpClient != null) { - try { - this.httpClient.stop(); - } catch (Exception e) { - throw new IOException(e); - } - } - } - - - @Override - public void receiveSpan(Span span) { - if (!this.queue.offer(span)) { - // TODO: If failed the offer, run the background thread now. I can't block though? - long now = System.currentTimeMillis(); - // Only log every 5 minutes. Any more than this for a guest process is obnoxious - if (now - lastAtCapacityWarningLog > 300000) { - LOG.warn("At capacity"); - this.lastAtCapacityWarningLog = now; - } - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e1aa7a92/htrace-htraced/src/test/java/org/apache/htrace/impl/TestHTracedRESTReceiver.java ---------------------------------------------------------------------- diff --git a/htrace-htraced/src/test/java/org/apache/htrace/impl/TestHTracedRESTReceiver.java b/htrace-htraced/src/test/java/org/apache/htrace/impl/TestHTracedRESTReceiver.java deleted file mode 100644 index 6b11c4b..0000000 --- a/htrace-htraced/src/test/java/org/apache/htrace/impl/TestHTracedRESTReceiver.java +++ /dev/null @@ -1,117 +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.htrace.impl; - -import static org.junit.Assert.*; - -import java.io.File; -import java.net.URL; - -import org.apache.htrace.HTraceConfiguration; -import org.apache.htrace.Span; -import org.apache.htrace.util.DataDir; -import org.apache.htrace.util.HTracedProcess; -import org.eclipse.jetty.client.api.ContentResponse; -import org.eclipse.jetty.http.HttpStatus; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.fasterxml.jackson.databind.ObjectMapper; - -public class TestHTracedRESTReceiver { - private URL restServerUrl;; - private DataDir dataDir; - HTracedProcess htraced; - private final ObjectMapper jsonMapper = new ObjectMapper(); - - @Before - public void setUp() throws Exception { - this.dataDir = new DataDir(); - this.restServerUrl = new URL("http://localhost:9097/"); - File tlDir = DataDir.getTopLevelOfCheckout(this.dataDir.getDataDir()); - File pathToHTracedBinary = HTracedProcess.getPathToHTraceBinaryFromTopLevel(tlDir); - this.htraced = - new HTracedProcess(pathToHTracedBinary, dataDir.getDataDir(), restServerUrl); - } - - @After - public void tearDown() throws Exception { - if (this.htraced != null) this.htraced.destroy(); - } - - /** - * Our simple version of htrace configuration for testing. - */ - private final class TestHTraceConfiguration extends HTraceConfiguration { - @Override - public String get(String key) { - return null; - } - - @Override - public String get(String key, String defaultValue) { - return defaultValue; - } - } - - @Test (timeout = 10000) - public void testBasicGet() throws Exception { - HTracedRESTReceiver receiver = new HTracedRESTReceiver(new TestHTraceConfiguration()); - try { - // Do basic a GET /server/info against localhost:9095 htraced - ContentResponse response = receiver.httpClient.GET(restServerUrl + "server/info"); - assertEquals("application/json", response.getMediaType()); - String content = processGET(response); - assertTrue(content.contains("ReleaseVersion")); - System.out.println(content); - } finally { - receiver.close(); - } - } - - private String processGET(final ContentResponse response) { - assertTrue("" + response.getStatus(), HttpStatus.OK_200 <= response.getStatus() && - response.getStatus() <= HttpStatus.NO_CONTENT_204); - return response.getContentAsString(); - } - - @Test (timeout = 10000) - public void testSendingSpans() throws Exception { - HTracedRESTReceiver receiver = new HTracedRESTReceiver(new TestHTraceConfiguration()); - try { - // TODO: Fix MilliSpan. Requires a parentid. Shouldn't have to have one else be explicit it - // is required. - for (int i = 0; i < 100; i++) { - Span span = new MilliSpan.Builder().parents(new long [] {1L}).spanId(i).build(); - receiver.receiveSpan(span); - } - // Read them all back. - for (int i = 0; i < 100; i++) { - // This is what the REST server expends when querying for a span id. - String findSpan = String.format("span/%016x", 10); - ContentResponse response = receiver.httpClient.GET(restServerUrl + findSpan); - String content = processGET(response); - Span span = this.jsonMapper.readValue(content, Span.class); - assertEquals(i, span.getSpanId()); - } - } finally { - receiver.close(); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e1aa7a92/htrace-htraced/src/test/java/org/apache/htrace/util/DataDir.java ---------------------------------------------------------------------- diff --git a/htrace-htraced/src/test/java/org/apache/htrace/util/DataDir.java b/htrace-htraced/src/test/java/org/apache/htrace/util/DataDir.java deleted file mode 100644 index 74731fa..0000000 --- a/htrace-htraced/src/test/java/org/apache/htrace/util/DataDir.java +++ /dev/null @@ -1,97 +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.htrace.util; - -import java.io.File; -import java.io.IOException; -import java.util.UUID; - -/** - * Small util for making a data directory for tests to use when running tests. We put it up at - * target/test-data/UUID. Create an instance of this class per unit test run and it will take - * care of setting up the dirs for you. Pass what is returned here as location from which to - * have daemons and tests dump data. - * TODO: Add close on exit. - */ -public class DataDir { - private File baseTestDir = null; - private File testDir = null; - - /** - * System property key to get base test directory value - */ - public static final String TEST_BASE_DIRECTORY_KEY = "test.data.base.dir"; - - /** - * Default base directory for test output. - */ - public static final String TEST_BASE_DIRECTORY_DEFAULT = "target"; - - public static final String TEST_BASE_DIRECTORY_NAME = "test-data"; - - /** - * @return Where to write test data on local filesystem; usually - * {@link #TEST_BASE_DIRECTORY_DEFAULT} - * Should not be used directly by the unit tests, hence its's private. - * Unit test will use a subdirectory of this directory. - * @see #setupDataTestDir() - */ - private synchronized File getBaseTestDir() { - if (this.baseTestDir != null) return this.baseTestDir; - String testHome = System.getProperty(TEST_BASE_DIRECTORY_KEY, TEST_BASE_DIRECTORY_DEFAULT); - this.baseTestDir = new File(testHome, TEST_BASE_DIRECTORY_NAME); - return this.baseTestDir; - } - - /** - * @return Absolute path to the dir created by this instance. - * @throws IOException - */ - public synchronized File getDataDir() throws IOException { - if (this.testDir != null) return this.testDir; - this.testDir = new File(getBaseTestDir(), UUID.randomUUID().toString()); - if (!this.testDir.exists()) { - if (!this.testDir.mkdirs()) throw new IOException("Failed mkdirs for " + this.testDir); - } - // Return absolute path. A relative passed to htraced will have it create data dirs relative - // to its data dir rather than in it. - return this.testDir.getAbsoluteFile(); - } - - /** - * Fragile. Ugly. Presumes paths. Best we can do for now until htraced comes local to this module - * and is moved out of src dir. - * @param dataDir A datadir gotten from {@link #getDataDir()} - * @return Top-level of the checkout. - */ - public static File getTopLevelOfCheckout(final File dataDir) { - // Need absolute else we run out of road when dir is relative to this module. - File absolute = dataDir.getAbsoluteFile(); - // Check we are where we think we are. - File testDataDir = absolute.getParentFile(); - if (!testDataDir.getName().equals(TEST_BASE_DIRECTORY_NAME)) { - throw new IllegalArgumentException(dataDir.toString()); - } - // Do another check. - File targetDir = testDataDir.getParentFile(); - if (!targetDir.getName().equals(TEST_BASE_DIRECTORY_DEFAULT)) { - throw new IllegalArgumentException(dataDir.toString()); - } - // Back up last two dirs out of the htrace-htraced dir. - return targetDir.getParentFile().getParentFile(); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e1aa7a92/htrace-htraced/src/test/java/org/apache/htrace/util/HTracedProcess.java ---------------------------------------------------------------------- diff --git a/htrace-htraced/src/test/java/org/apache/htrace/util/HTracedProcess.java b/htrace-htraced/src/test/java/org/apache/htrace/util/HTracedProcess.java deleted file mode 100644 index 770e442..0000000 --- a/htrace-htraced/src/test/java/org/apache/htrace/util/HTracedProcess.java +++ /dev/null @@ -1,102 +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.htrace.util; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.ProcessBuilder.Redirect; -import java.net.URL; - -/** - * To get instance of HTraced up and running, create an instance of this class. - * Upon successful construction, htraced is running using <code>dataDir</code> as directory to - * host data (leveldbs and logs). - * TODO: We expect to find the htraced in a very particular place. Fragile. Will break if stuff - * moves. - * TODO: What if a port clash? How to have it come up another port then ask the process what port - * it is running on? - */ -public class HTracedProcess extends Process { - private final Process delegate; - - public HTracedProcess(final File pathToHTracedBinary, final File dataDir, final URL url) - throws IOException { - // web.address for htraced is hostname ':' port; no 'scheme' yet. - String webAddress = url.getHost() + ":" + url.getPort(); - // Pass cmdline args to htraced to it uses our test dir for data. - ProcessBuilder pb = new ProcessBuilder(pathToHTracedBinary.toString(), - "-Dweb.address=" + webAddress, - "-Ddata.store.clear=true", - "-Ddata.store.directories=" + dataDir.toString()); - pb.redirectErrorStream(true); - // Inherit STDERR/STDOUT i/o; dumps on console for now. Can add logs later. - pb.inheritIO(); - pb.directory(dataDir); - this.delegate = pb.start(); - assert pb.redirectInput() == Redirect.PIPE; - assert pb.redirectOutput().file() == dataDir; - assert this.delegate.getInputStream().read() == -1; - } - - public int hashCode() { - return delegate.hashCode(); - } - - public OutputStream getOutputStream() { - throw new UnsupportedOperationException("Unsupported until complaint; output on STDOUT"); - } - - public InputStream getInputStream() { - throw new UnsupportedOperationException("Unsupported until complaint; output on STDOUT"); - } - - public boolean equals(Object obj) { - return delegate.equals(obj); - } - - public InputStream getErrorStream() { - throw new UnsupportedOperationException("Unsupported until complaint; output on STDOUT"); - } - - public int waitFor() throws InterruptedException { - return delegate.waitFor(); - } - - public int exitValue() { - return delegate.exitValue(); - } - - public void destroy() { - delegate.destroy(); - } - - public String toString() { - return delegate.toString(); - } - - /** - * Ugly but how else to do file-math? - * @param topLevel Presumes top-level of the htrace checkout. - * @return Path to the htraced binary. - */ - public static File getPathToHTraceBinaryFromTopLevel(final File topLevel) { - return new File(new File(new File(new File(new File(topLevel, "htrace-core"), "src"), "go"), - "build"), "htraced"); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e1aa7a92/htrace-htraced/src/test/java/org/apache/htrace/util/TestHTracedProcess.java ---------------------------------------------------------------------- diff --git a/htrace-htraced/src/test/java/org/apache/htrace/util/TestHTracedProcess.java b/htrace-htraced/src/test/java/org/apache/htrace/util/TestHTracedProcess.java deleted file mode 100644 index cb2c577..0000000 --- a/htrace-htraced/src/test/java/org/apache/htrace/util/TestHTracedProcess.java +++ /dev/null @@ -1,93 +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.htrace.util; - -import static org.junit.Assert.assertTrue; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLConnection; - -import org.junit.Before; -import org.junit.Test; - -/** - * Test putting up an htraced and making sure it basically works. - * Makes presumption about paths; where data is relative to the htraced binary, etc., encoded - * in methods in the below. - */ -public class TestHTracedProcess { - private DataDir testDir = null; - private final int TIMEOUT = 10000; - - @Before - public void setupTest() { - this.testDir = new DataDir(); - } - - /* - * Do a basic GET of the server info from the running htraced instance. - */ - private String doGet(final URL url) throws IOException { - URLConnection connection = url.openConnection(); - connection.setConnectTimeout(TIMEOUT); - connection.setReadTimeout(TIMEOUT); - connection.connect(); - StringBuffer sb = new StringBuffer(); - BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); - try { - String line = null; - while ((line = reader.readLine()) != null) { - System.out.println(line); - sb.append(line); - } - } finally { - reader.close(); - } - return sb.toString(); - } - - /** - * Put up an htraced instance and do a Get against /server/info. - * @throws IOException - * @throws InterruptedException - */ - @Test (timeout=100000) - public void testStartStopHTraced() throws IOException, InterruptedException { - // TODO: Make the test port random so no classes if concurrent test runs. Anything better - // I can do here? Pass a zero and have the daemon tell me where it is successfully listening? - String restURL = "http://localhost:9096/"; - URL restServerURL = new URL(restURL); - HTracedProcess htraced = null; - File dataDir = this.testDir.getDataDir(); - File topLevel = DataDir.getTopLevelOfCheckout(dataDir); - try { - htraced = new HTracedProcess(HTracedProcess.getPathToHTraceBinaryFromTopLevel(topLevel), - dataDir, restServerURL); - String str = doGet(new URL(restServerURL + "server/info")); - // Assert we go something back. - assertTrue(str.contains("ReleaseVersion")); - // Assert that the datadir is not empty. - } finally { - if (htraced != null) htraced.destroy(); - System.out.println("ExitValue=" + htraced.exitValue()); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e1aa7a92/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index a3175ab..8d8d505 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,6 @@ language governing permissions and limitations under the License. --> <module>htrace-zipkin</module> <module>htrace-hbase</module> <module>htrace-flume</module> - <module>htrace-htraced</module> </modules> <licenses> @@ -213,20 +212,16 @@ language governing permissions and limitations under the License. --> </execution> </executions> </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-shade-plugin</artifactId> - <version>2.1</version> - </plugin> - <plugin> - <artifactId>maven-assembly-plugin</artifactId> - <version>2.5.3</version> - </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <version>2.1</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> </plugin> <plugin> @@ -301,16 +296,6 @@ language governing permissions and limitations under the License. --> <version>4.10</version> <scope>test</scope> </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-core</artifactId> - <version>2.4.0</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - <version>2.4.0</version> - </dependency> </dependencies> </dependencyManagement> <distributionManagement>
