diff --git a/.dummy b/.dummy new file mode 100644 index 00000000..e69de29b diff --git a/src/main/java/com/snowplowanalytics/snowplow/tracker/emitter/SynchronousEmitter.java b/src/main/java/com/snowplowanalytics/snowplow/tracker/emitter/SynchronousEmitter.java new file mode 100644 index 00000000..3941ffae --- /dev/null +++ b/src/main/java/com/snowplowanalytics/snowplow/tracker/emitter/SynchronousEmitter.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2015 Snowplow Analytics Ltd. All rights reserved. + * + * This program is licensed to you under the Apache License Version 2.0, + * and you may not use this file except in compliance with the Apache License Version 2.0. + * You may obtain a copy of the Apache License Version 2.0 at http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the Apache License Version 2.0 is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Apache License Version 2.0 for the specific language governing permissions and limitations there under. + */ +package com.snowplowanalytics.snowplow.tracker.emitter; + +// Java + +import com.snowplowanalytics.snowplow.tracker.payload.TrackerPayload; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +// Slf4j +// This library + +/** + * An emitter which sends events as soon as they are received via + * GET requests. + */ +public class SynchronousEmitter extends AbstractEmitter { + + private static final Logger LOGGER = LoggerFactory.getLogger(BatchEmitter.class); + + public static abstract class Builder> extends AbstractEmitter.Builder { + public SynchronousEmitter build() { + return new SynchronousEmitter(this); + } + } + + private static class Builder2 extends Builder { + @Override + protected Builder2 self() { + return this; + } + } + + public static Builder builder() { + return new Builder2(); + } + + protected SynchronousEmitter(Builder builder) { + super(builder); + } + + /** + * Adds a payload to the buffer and instantly sends it + * + * @param payload an event payload + */ + @Override + public void emit(TrackerPayload payload) { + getRequestRunnable(payload).run(); + } + + /** + * When the buffer limit is reached sending of the buffer is + * initiated. + */ + public void flushBuffer() { + // Do nothing! + } + + /** + * Returns a Runnable GET Request operation + * + * @param payload the event to be sent + * @return the new Callable object + */ + private Runnable getRequestRunnable(final TrackerPayload payload) { + return new Runnable() { + @Override + public void run() { + int code = httpClientAdapter.get(payload); + + // Process results + int success = 0; + int failure = 0; + if (!isSuccessfulSend(code)) { + LOGGER.error("SynchronousEmitter failed to send {} events: code: {}", 1, code); + failure += 1; + } else { + LOGGER.info("SynchronousEmitter successfully sent {} events: code: {}", 1, code); + success += 1; + } + + // Send the callback if available + if (requestCallback != null) { + if (failure != 0) { + List buffer = new ArrayList<>(); + buffer.add(payload); + requestCallback.onFailure(success, buffer); + } else { + requestCallback.onSuccess(success); + } + } + } + }; + } +} diff --git a/src/main/java/com/snowplowanalytics/snowplow/tracker/http/OkHttpClientAdapter.java b/src/main/java/com/snowplowanalytics/snowplow/tracker/http/OkHttpClientAdapter.java index 91b08a7a..3bb72813 100644 --- a/src/main/java/com/snowplowanalytics/snowplow/tracker/http/OkHttpClientAdapter.java +++ b/src/main/java/com/snowplowanalytics/snowplow/tracker/http/OkHttpClientAdapter.java @@ -13,13 +13,13 @@ package com.snowplowanalytics.snowplow.tracker.http; // Java -import java.util.Iterator; -import java.util.Map; +import java.util.concurrent.TimeUnit; // Google import com.google.common.base.Preconditions; // SquareUp +import com.google.common.base.Stopwatch; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.MediaType; @@ -99,14 +99,17 @@ public Object getHttpClient() { * @return the HttpResponse for the Request */ public int doGet(String url) { + Stopwatch stopwatch = Stopwatch.createStarted(); Request request = new Request.Builder().url(url).build(); try { Response response = httpClient.newCall(request).execute(); return response.code(); } catch (Exception e) { - LOGGER.error("OkHttpClient GET Request failed: {}", e.getMessage()); + LOGGER.error("OkHttpClient GET Request failed in " + stopwatch.elapsed(TimeUnit.MILLISECONDS), e); return -1; + } finally { + stopwatch.stop(); } } @@ -119,6 +122,7 @@ public int doGet(String url) { * @return the HttpResponse for the Request */ public int doPost(String url, String payload) { + Stopwatch stopwatch = Stopwatch.createStarted(); try { RequestBody body = RequestBody.create(JSON, payload); Request request = new Request.Builder() @@ -129,8 +133,10 @@ public int doPost(String url, String payload) { Response response = httpClient.newCall(request).execute(); return response.code(); } catch (Exception e) { - LOGGER.error("OkHttpClient POST Request failed: {}", e.getMessage()); + LOGGER.error("OkHttpClient POST Request failed in " + stopwatch.elapsed(TimeUnit.MILLISECONDS), e); return -1; + } finally { + stopwatch.stop(); } } }