From cd683930d92db2625ed94e7f9dadf6b9e9dfa210 Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 2 Jun 2024 16:11:02 -0300 Subject: [PATCH 01/34] feat(telemetry): add log events --- .../java/com/rollbar/android/Rollbar.java | 4 + .../api/payload/data/TelemetryEvent.java | 84 +++++++++++++++++++ .../api/payload/data/TelemetryType.java | 18 ++++ .../rollbar/api/payload/data/body/Body.java | 39 ++++++--- .../com/rollbar/notifier/RollbarBase.java | 25 ++++-- .../rollbar/notifier/util/BodyFactory.java | 19 +++++ 6 files changed, 174 insertions(+), 15 deletions(-) create mode 100644 rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java create mode 100644 rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java diff --git a/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java b/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java index c6c9cf51..fdc6fcbf 100644 --- a/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java +++ b/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java @@ -12,6 +12,7 @@ import android.util.Log; import com.rollbar.android.notifier.sender.ConnectionAwareSenderFailureStrategy; import com.rollbar.android.provider.ClientProvider; +import com.rollbar.api.payload.data.TelemetryEvent; import com.rollbar.notifier.config.ConfigProvider; import com.rollbar.notifier.uncaughtexception.RollbarUncaughtExceptionHandler; import com.rollbar.android.provider.NotifierProvider; @@ -498,6 +499,9 @@ public void configure(Config config) { this.rollbar.configure(config); } + public void addEvent(TelemetryEvent telemetryEvent) { + rollbar.addEvent(telemetryEvent); + } /** * Record a critical error. * diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java new file mode 100644 index 00000000..83a8311a --- /dev/null +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java @@ -0,0 +1,84 @@ +package com.rollbar.api.payload.data; + +import com.rollbar.api.json.JsonSerializable; +import com.rollbar.api.truncation.StringTruncatable; +import com.rollbar.api.truncation.TruncationHelper; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class TelemetryEvent implements JsonSerializable, StringTruncatable { + + private final TelemetryType type; + private final Level level; + private final Long timestamp; + private final Map body; + private static final long serialVersionUID = 2843361810242481727L; + private static final String SOURCE = "client"; + private static final String MESSAGE_KEY = "message"; + + private TelemetryEvent( + TelemetryType telemetryType, + Level level, + Map body + ) { + timestamp = System.currentTimeMillis(); + type = telemetryType; + this.level = level; + this.body = body; + } + + + public static TelemetryEvent log(Level level, final String message) { + Map body = new HashMap() { + private static final long serialVersionUID = 3746979871039874692L; + { + put(MESSAGE_KEY, message); + } + }; + return new TelemetryEvent(TelemetryType.LOG, level, body); + } + + @Override + public Map asJson() { + Map values = new HashMap<>(); + values.put("type", type.asJson()); + values.put("level", level.asJson()); + values.put("source", SOURCE); + values.put("timestamp_ms", timestamp); + values.put("body", body); + return values; + } + + @Override + public TelemetryEvent truncateStrings(int maxLength) { + String message = body.get(MESSAGE_KEY); + if (message == null) return this; + return log(level, TruncationHelper.truncateString(message, maxLength)); + } + + @Override + public int hashCode() { + return Objects.hash(type, level, body); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TelemetryEvent that = (TelemetryEvent) o; + return Objects.equals(type, that.type) && Objects.equals(level, that.level) && Objects.equals(timestamp, that.timestamp) && Objects.equals(body, that.body); + } + + @Override + public String toString() { + return "TelemetryEvent{" + + "type='" + type.asJson() + '\'' + + ", level='" + level.asJson() + '\'' + + ", source='" + SOURCE + '\'' + + ", timestamp_ms=" + timestamp + + ", body=" + body + + '}'; + } +} diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java new file mode 100644 index 00000000..b4ab14ae --- /dev/null +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java @@ -0,0 +1,18 @@ +package com.rollbar.api.payload.data; + +import com.rollbar.api.json.JsonSerializable; + +public enum TelemetryType implements JsonSerializable { + LOG("log"); + + private final String jsonName; + + TelemetryType(String jsonName) { + this.jsonName = jsonName; + } + + @Override + public Object asJson() { + return jsonName; + } +} diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/body/Body.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/body/Body.java index 51f8999c..7e93512f 100755 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/body/Body.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/body/Body.java @@ -1,9 +1,12 @@ package com.rollbar.api.payload.data.body; import com.rollbar.api.json.JsonSerializable; +import com.rollbar.api.payload.data.TelemetryEvent; import com.rollbar.api.truncation.StringTruncatable; import java.util.HashMap; +import java.util.List; +import java.util.Objects; /** * A container for the actual error(s), message, or crash report that caused this error. @@ -14,8 +17,11 @@ public class Body implements JsonSerializable, StringTruncatable { private final BodyContent bodyContent; + private final List telemetryEvents; + private Body(Builder builder) { this.bodyContent = builder.bodyContent; + this.telemetryEvents = builder.telemetryEvents; } /** @@ -34,6 +40,10 @@ public Object asJson() { values.put(bodyContent.getKeyName(), bodyContent); } + if (telemetryEvents != null) { + values.put("telemetry", telemetryEvents); + } + return values; } @@ -50,27 +60,22 @@ public Body truncateStrings(int maxSize) { @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - + if (this == o) return true; + if (!(o instanceof Body)) return false; Body body = (Body) o; - - return bodyContent != null ? bodyContent.equals(body.bodyContent) : body.bodyContent == null; + return Objects.equals(bodyContent, body.bodyContent) && Objects.equals(telemetryEvents, body.telemetryEvents); } @Override public int hashCode() { - return bodyContent != null ? bodyContent.hashCode() : 0; + return Objects.hash(bodyContent, telemetryEvents); } @Override public String toString() { return "Body{" + "bodyContent=" + bodyContent + + ", telemetry=" + telemetryEvents + '}'; } @@ -81,6 +86,8 @@ public static final class Builder { private BodyContent bodyContent; + private List telemetryEvents; + /** * Constructor. */ @@ -95,6 +102,7 @@ public Builder() { */ public Builder(Body body) { this.bodyContent = body.bodyContent; + this.telemetryEvents = body.telemetryEvents; } /** @@ -109,6 +117,17 @@ public Builder bodyContent(BodyContent bodyContent) { return this; } + /** + * The Telemetry events of this body. + * + * @param telemetryEvents the events captured until this payload; + * @return the builder instance. + */ + public Builder telemetryEvents(List telemetryEvents) { + this.telemetryEvents = telemetryEvents; + return this; + } + /** * Builds the {@link Body body}. * diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java index e1786518..4c8c29c2 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java @@ -4,16 +4,18 @@ import com.rollbar.api.payload.Payload; import com.rollbar.api.payload.data.Data; import com.rollbar.api.payload.data.Level; +import com.rollbar.api.payload.data.TelemetryEvent; +import com.rollbar.api.payload.data.body.Body; import com.rollbar.jvmti.ThrowableCache; import com.rollbar.notifier.config.CommonConfig; -import com.rollbar.notifier.sender.json.JsonSerializer; import com.rollbar.notifier.truncation.PayloadTruncator; import com.rollbar.notifier.util.BodyFactory; import com.rollbar.notifier.util.ObjectsUtils; import com.rollbar.notifier.wrapper.RollbarThrowableWrapper; import com.rollbar.notifier.wrapper.ThrowableWrapper; -import java.util.HashMap; -import java.util.Map; + +import java.util.*; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -31,6 +33,7 @@ public abstract class RollbarBase { private static final Logger LOGGER = LoggerFactory.getLogger(RollbarBase.class); private static final int MAX_PAYLOAD_SIZE_BYTES = 512 * 1024; // 512kb + private final Queue telemetryEvents = new ConcurrentLinkedQueue<>(); protected BodyFactory bodyFactory; protected PayloadTruncator payloadTruncator; @@ -49,6 +52,10 @@ protected RollbarBase(C config, BodyFactory bodyFactory, RESULT emptyResult) { this.emptyResult = emptyResult; } + protected void addEvent(TelemetryEvent telemetryEvent) { + telemetryEvents.add(telemetryEvent); + } + /** * Replace the configuration of this instance directly. * @@ -120,9 +127,8 @@ protected Data buildData(CommonConfig config, ThrowableWrapper error, Map(telemetryEvents)); + telemetryEvents.clear(); + return body; + } } diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/util/BodyFactory.java b/rollbar-java/src/main/java/com/rollbar/notifier/util/BodyFactory.java index 7df49631..1ad62f8c 100755 --- a/rollbar-java/src/main/java/com/rollbar/notifier/util/BodyFactory.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/util/BodyFactory.java @@ -1,5 +1,6 @@ package com.rollbar.notifier.util; +import com.rollbar.api.payload.data.TelemetryEvent; import com.rollbar.api.payload.data.body.Body; import com.rollbar.api.payload.data.body.ExceptionInfo; import com.rollbar.api.payload.data.body.Frame; @@ -46,6 +47,24 @@ public Body from(Throwable throwable, String description) { */ public Body from(ThrowableWrapper throwableWrapper, String description) { Body.Builder builder = new Body.Builder(); + return from(throwableWrapper, description, builder); + } + + /** + * Builds the body from the {@link ThrowableWrapper throwableWrapper}, the description + * supplied and telemetry events. + * + * @param throwableWrapper the throwable proxy. + * @param description the description. + * @param telemetryEvents the telemetry events. + * @return the body. + */ + public Body from(ThrowableWrapper throwableWrapper, String description, List telemetryEvents) { + Body.Builder builder = new Body.Builder().telemetryEvents(telemetryEvents); + return from(throwableWrapper, description, builder); + } + + private Body from(ThrowableWrapper throwableWrapper, String description, Body.Builder builder) { if (throwableWrapper == null) { return builder.bodyContent(message(description)).build(); } From cf90645446ba5dc2f3056171c4d33fa87e45607a Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 30 Jun 2024 17:31:15 -0300 Subject: [PATCH 02/34] feat(telemetry): add navigation events --- .../api/payload/data/TelemetryEvent.java | 43 ++++++++++++++++--- .../api/payload/data/TelemetryType.java | 1 + .../com/rollbar/notifier/RollbarBase.java | 2 +- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java index 83a8311a..5748fbef 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java @@ -16,7 +16,9 @@ public class TelemetryEvent implements JsonSerializable, StringTruncatable body; private static final long serialVersionUID = 2843361810242481727L; private static final String SOURCE = "client"; - private static final String MESSAGE_KEY = "message"; + private static final String LOG_KEY_MESSAGE = "message"; + private static final String NAVIGATION_KEY_FROM = "from"; + private static final String NAVIGATION_KEY_TO = "to"; private TelemetryEvent( TelemetryType telemetryType, @@ -29,17 +31,40 @@ private TelemetryEvent( this.body = body; } + private TelemetryEvent( + Long timestamp, + TelemetryType telemetryType, + Level level, + Map body + ) { + this.timestamp = timestamp; + type = telemetryType; + this.level = level; + this.body = body; + } + public static TelemetryEvent log(Level level, final String message) { Map body = new HashMap() { private static final long serialVersionUID = 3746979871039874692L; { - put(MESSAGE_KEY, message); + put(LOG_KEY_MESSAGE, message); } }; return new TelemetryEvent(TelemetryType.LOG, level, body); } + public static TelemetryEvent navigation(Level level, final String from, final String to) { + Map body = new HashMap() { + private static final long serialVersionUID = 3746979871039874692L; + { + put(NAVIGATION_KEY_FROM, from); + put(NAVIGATION_KEY_TO, to); + } + }; + return new TelemetryEvent(TelemetryType.NAVIGATION, level, body); + } + @Override public Map asJson() { Map values = new HashMap<>(); @@ -53,9 +78,17 @@ public Map asJson() { @Override public TelemetryEvent truncateStrings(int maxLength) { - String message = body.get(MESSAGE_KEY); - if (message == null) return this; - return log(level, TruncationHelper.truncateString(message, maxLength)); + Map truncatedMap = new HashMap<>(); + for (Map.Entry entry : body.entrySet()) { + String truncatedValue = TruncationHelper.truncateString(entry.getValue(), maxLength); + truncatedMap.put(entry.getKey(), truncatedValue); + } + return new TelemetryEvent( + this.timestamp, + this.type, + this.level, + truncatedMap + ); } @Override diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java index b4ab14ae..f1e1870e 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java @@ -3,6 +3,7 @@ import com.rollbar.api.json.JsonSerializable; public enum TelemetryType implements JsonSerializable { + NAVIGATION("navigation"), LOG("log"); private final String jsonName; diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java index 4c8c29c2..a98f8ae1 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java @@ -52,7 +52,7 @@ protected RollbarBase(C config, BodyFactory bodyFactory, RESULT emptyResult) { this.emptyResult = emptyResult; } - protected void addEvent(TelemetryEvent telemetryEvent) { + public void addEvent(TelemetryEvent telemetryEvent) { telemetryEvents.add(telemetryEvent); } From 544830ff1e5fd315edafd2cf0b3ec6d4d6c270b9 Mon Sep 17 00:00:00 2001 From: chris Date: Sat, 6 Jul 2024 16:14:43 -0300 Subject: [PATCH 03/34] feat(telemetry): add Network events --- .../rollbar/api/payload/data/TelemetryEvent.java | 15 +++++++++++++++ .../rollbar/api/payload/data/TelemetryType.java | 1 + 2 files changed, 16 insertions(+) diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java index 5748fbef..d3965611 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java @@ -19,6 +19,9 @@ public class TelemetryEvent implements JsonSerializable, StringTruncatable body = new HashMap() { + private static final long serialVersionUID = 3746979871039874692L; + { + put(NETWORK_KEY_METHOD, method); + put(NETWORK_KEY_URL, url); + put(NETWORK_KEY_STATUS_CODE, statusCode); + } + }; + return new TelemetryEvent(TelemetryType.NETWORK, level, body); + } + @Override public Map asJson() { Map values = new HashMap<>(); diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java index f1e1870e..f6f2fb0b 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java @@ -3,6 +3,7 @@ import com.rollbar.api.json.JsonSerializable; public enum TelemetryType implements JsonSerializable { + NETWORK("network"), NAVIGATION("navigation"), LOG("log"); From 851c050f775c342e1150049dc29d65feb8f9b07b Mon Sep 17 00:00:00 2001 From: chris Date: Sat, 6 Jul 2024 22:39:09 -0300 Subject: [PATCH 04/34] feat(telemetry): add Manual events --- .../com/rollbar/api/payload/data/TelemetryEvent.java | 10 ++++++++++ .../com/rollbar/api/payload/data/TelemetryType.java | 5 +++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java index d3965611..7300fd27 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java @@ -57,6 +57,16 @@ public static TelemetryEvent log(Level level, final String message) { return new TelemetryEvent(TelemetryType.LOG, level, body); } + public static TelemetryEvent manual(Level level, final String message) { + Map body = new HashMap() { + private static final long serialVersionUID = 3746979871039874692L; + { + put(LOG_KEY_MESSAGE, message); + } + }; + return new TelemetryEvent(TelemetryType.MANUAL, level, body); + } + public static TelemetryEvent navigation(Level level, final String from, final String to) { Map body = new HashMap() { private static final long serialVersionUID = 3746979871039874692L; diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java index f6f2fb0b..b1a7a2f7 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java @@ -3,9 +3,10 @@ import com.rollbar.api.json.JsonSerializable; public enum TelemetryType implements JsonSerializable { - NETWORK("network"), + LOG("log"), + MANUAL("manual"), NAVIGATION("navigation"), - LOG("log"); + NETWORK("network"); private final String jsonName; From f4bfe157588cb4fee5eb9b57b900c3c33d05a12a Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 9 Jul 2024 16:06:05 -0300 Subject: [PATCH 05/34] feat(telemetry): add maximum telemetry data --- .../com/rollbar/notifier/RollbarBase.java | 3 ++ .../rollbar/notifier/config/CommonConfig.java | 2 + .../notifier/config/ConfigBuilder.java | 39 +++++++++++++++++++ .../notifier/config/ConfigBuilderTest.java | 34 ++++++++++++++++ 4 files changed, 78 insertions(+) diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java index a98f8ae1..0caa5171 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java @@ -53,6 +53,9 @@ protected RollbarBase(C config, BodyFactory bodyFactory, RESULT emptyResult) { } public void addEvent(TelemetryEvent telemetryEvent) { + if (telemetryEvents.size() >= config.maximumTelemetryData()) { + telemetryEvents.poll(); + } telemetryEvents.add(telemetryEvent); } diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/config/CommonConfig.java b/rollbar-java/src/main/java/com/rollbar/notifier/config/CommonConfig.java index d903ecbf..ddcc0e3d 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/config/CommonConfig.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/config/CommonConfig.java @@ -210,4 +210,6 @@ public interface CommonConfig { * @return true to truncate payloads otherwise false. */ boolean truncateLargePayloads(); + + int maximumTelemetryData(); } diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java index cad0ae27..2f6968fb 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java @@ -85,6 +85,14 @@ public class ConfigBuilder { protected boolean truncateLargePayloads; + private int maximumTelemetryData = DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS; + + private final static int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; + + private final static int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; + + private final static int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; + /** * Constructor with an access token. */ @@ -471,6 +479,29 @@ public ConfigBuilder truncateLargePayloads(boolean truncate) { return this; } + /** + *

+ * Maximum Telemetry Events sent in a payload (This value can be between 1 and 50, exceed any of + * these thresholds and the closest will be taken). Default: 10. + *

+ * @param maximumTelemetryData max quantity of telemetry events sent. + * @return the builder instance. + */ + public ConfigBuilder maximumTelemetryData(int maximumTelemetryData) { + if (maximumTelemetryData < MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS) { + this.maximumTelemetryData = MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; + return this; + } + + if (maximumTelemetryData > MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS) { + this.maximumTelemetryData = MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; + return this; + } + + this.maximumTelemetryData = maximumTelemetryData; + return this; + } + /** * Builds the {@link Config config}. * @@ -560,6 +591,8 @@ private static class ConfigImpl implements Config { private final boolean truncateLargePayloads; + private final int maximumTelemetryData; + ConfigImpl(ConfigBuilder builder) { this.accessToken = builder.accessToken; this.endpoint = builder.endpoint; @@ -592,6 +625,7 @@ private static class ConfigImpl implements Config { this.enabled = builder.enabled; this.defaultLevels = builder.defaultLevels; this.truncateLargePayloads = builder.truncateLargePayloads; + this.maximumTelemetryData = builder.maximumTelemetryData; } @Override @@ -738,5 +772,10 @@ public Level defaultThrowableLevel() { public boolean truncateLargePayloads() { return this.truncateLargePayloads; } + + @Override + public int maximumTelemetryData() { + return this.maximumTelemetryData; + } } } diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java index 4c05dc14..e78544dc 100644 --- a/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java +++ b/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java @@ -43,6 +43,12 @@ public class ConfigBuilderTest { static final String FRAMEWORK = "framework"; + private static final int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; + + private static final int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; + + private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; + @Rule public MockitoRule rule = MockitoJUnit.rule(); @@ -147,10 +153,12 @@ public void shouldBuildTheConfiguration() { assertThat(config.proxy(), is(proxy)); assertThat(config.handleUncaughtErrors(), is(false)); assertThat(config.isEnabled(), is(false)); + assertThat(config.maximumTelemetryData(), is(DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS)); } @Test public void shouldBuildWithConfig() { + int maximumTelemetryData = 3; Config config = ConfigBuilder.withAccessToken(ACCESS_TOKEN) .environment(ENVIRONMENT) .codeVersion(CODE_VERSION) @@ -172,6 +180,7 @@ public void shouldBuildWithConfig() { .proxy(proxy) .handleUncaughtErrors(false) .enabled(false) + .maximumTelemetryData(maximumTelemetryData) .build(); Config copy = withConfig(config).build(); @@ -197,5 +206,30 @@ public void shouldBuildWithConfig() { assertThat(config.proxy(), is(copy.proxy())); assertThat(config.handleUncaughtErrors(), is(copy.handleUncaughtErrors())); assertThat(config.isEnabled(), is(copy.isEnabled())); + assertThat(config.maximumTelemetryData(), is(maximumTelemetryData)); + } + + @Test + public void shouldSetTheMaximumTelemetryDataLimitedToItsLowerLimit() { + int maximumTelemetryData = MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS - 1; + + Config config = ConfigBuilder + .withAccessToken(ACCESS_TOKEN) + .maximumTelemetryData(maximumTelemetryData) + .build(); + + assertThat(config.maximumTelemetryData(), is(MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS)); + } + + @Test + public void shouldSetTheMaximumTelemetryDataLimitedToItsUpperLimit() { + int maximumTelemetryData = MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS + 1; + + Config config = ConfigBuilder + .withAccessToken(ACCESS_TOKEN) + .maximumTelemetryData(maximumTelemetryData) + .build(); + + assertThat(config.maximumTelemetryData(), is(MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS)); } } \ No newline at end of file From b6e8176c6c083d0eaf1c19f6072a8d619b963596 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 9 Jul 2024 16:07:11 -0300 Subject: [PATCH 06/34] feat(telemetry): describe usage for static factories --- .../api/payload/data/TelemetryEvent.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java index 7300fd27..277e3670 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java @@ -46,7 +46,12 @@ private TelemetryEvent( this.body = body; } - + /** + * Creates a Log TelemetryEvent ({@link TelemetryType#LOG}). + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param message the message sent for this event (e.g. "hello world"). + */ public static TelemetryEvent log(Level level, final String message) { Map body = new HashMap() { private static final long serialVersionUID = 3746979871039874692L; @@ -57,6 +62,12 @@ public static TelemetryEvent log(Level level, final String message) { return new TelemetryEvent(TelemetryType.LOG, level, body); } + /** + * Creates a Manual TelemetryEvent ({@link TelemetryType#MANUAL}) . + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param message the message sent for this event (e.g. "hello world"). + */ public static TelemetryEvent manual(Level level, final String message) { Map body = new HashMap() { private static final long serialVersionUID = 3746979871039874692L; @@ -67,6 +78,13 @@ public static TelemetryEvent manual(Level level, final String message) { return new TelemetryEvent(TelemetryType.MANUAL, level, body); } + /** + * Creates a Navigation TelemetryEvent ({@link TelemetryType#NAVIGATION}) . + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param from the starting point (e.g. "SettingView"). + * @param to the destination point (e.g. "HomeView"). + */ public static TelemetryEvent navigation(Level level, final String from, final String to) { Map body = new HashMap() { private static final long serialVersionUID = 3746979871039874692L; @@ -78,6 +96,14 @@ public static TelemetryEvent navigation(Level level, final String from, final St return new TelemetryEvent(TelemetryType.NAVIGATION, level, body); } + /** + * Creates a Network TelemetryEvent ({@link TelemetryType#NETWORK}). + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param method the verb used (e.g. "POST"). + * @param url the api url (e.g. "http://rollbar.com/test/api"). + * @param statusCode the response status code (e.g. "404"). + */ public static TelemetryEvent network(Level level, final String method, final String url, final String statusCode) { Map body = new HashMap() { private static final long serialVersionUID = 3746979871039874692L; From 49177f86e0305e1753d24ed2becd5d0a16be58b2 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 9 Jul 2024 21:06:03 -0300 Subject: [PATCH 07/34] fix(telemetry): add maximumTelemetryData to Reactive Streams ConfigBuilder --- .../notifier/config/ConfigBuilder.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java index 16746f87..944c599e 100644 --- a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java +++ b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java @@ -59,6 +59,10 @@ public final class ConfigBuilder { private boolean enabled; private DefaultLevels defaultLevels; private boolean truncateLargePayloads; + private int maximumTelemetryData = DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS; + private final static int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; + private final static int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; + private final static int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; /** * Constructor with an access token. @@ -461,6 +465,29 @@ public ConfigBuilder truncateLargePayloads(boolean truncate) { return this; } + /** + *

+ * Maximum Telemetry Events sent in a payload (This value can be between 1 and 50, exceed any of + * these thresholds and the closest will be taken). Default: 10. + *

+ * @param maximumTelemetryData max quantity of telemetry events sent. + * @return the builder instance. + */ + public ConfigBuilder maximumTelemetryData(int maximumTelemetryData) { + if (maximumTelemetryData < MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS) { + this.maximumTelemetryData = MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; + return this; + } + + if (maximumTelemetryData > MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS) { + this.maximumTelemetryData = MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; + return this; + } + + this.maximumTelemetryData = maximumTelemetryData; + return this; + } + /** * Builds the {@link Config config}. * @@ -525,6 +552,7 @@ private static class ConfigImpl implements Config { private final DefaultLevels defaultLevels; private final JsonSerializer jsonSerializer; private final boolean truncateLargePayloads; + private final int maximumTelemetryData; ConfigImpl(ConfigBuilder builder) { this.accessToken = builder.accessToken; @@ -557,6 +585,7 @@ private static class ConfigImpl implements Config { this.defaultLevels = builder.defaultLevels; this.jsonSerializer = builder.jsonSerializer; this.truncateLargePayloads = builder.truncateLargePayloads; + this.maximumTelemetryData = builder.maximumTelemetryData; } @Override @@ -698,5 +727,10 @@ public Level defaultThrowableLevel() { public boolean truncateLargePayloads() { return truncateLargePayloads; } + + @Override + public int maximumTelemetryData() { + return this.maximumTelemetryData; + } } } From 935c93331ae941d51e3ff02f16d0cad80d469de6 Mon Sep 17 00:00:00 2001 From: chris Date: Wed, 10 Jul 2024 01:54:40 -0300 Subject: [PATCH 08/34] refactor(telemetry): replace static factories for TelemetryEventTracker --- .../java/com/rollbar/android/Rollbar.java | 60 ++++- .../api/payload/data/TelemetryEvent.java | 211 ++++++------------ .../api/payload/data/TelemetryType.java | 3 + .../api/payload/data/TelemetryEventTest.java | 26 +++ .../com/rollbar/notifier/RollbarBase.java | 58 ++++- .../telemetry/TelemetryEventTracker.java | 119 ++++++++++ .../telemetry/TelemetryEventTrackerTest.java | 161 +++++++++++++ 7 files changed, 472 insertions(+), 166 deletions(-) create mode 100644 rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java create mode 100644 rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java create mode 100644 rollbar-java/src/test/java/com/rollbar/notifier/telemetry/TelemetryEventTrackerTest.java diff --git a/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java b/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java index fdc6fcbf..677c8993 100644 --- a/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java +++ b/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java @@ -12,7 +12,7 @@ import android.util.Log; import com.rollbar.android.notifier.sender.ConnectionAwareSenderFailureStrategy; import com.rollbar.android.provider.ClientProvider; -import com.rollbar.api.payload.data.TelemetryEvent; +import com.rollbar.api.payload.data.TelemetryType; import com.rollbar.notifier.config.ConfigProvider; import com.rollbar.notifier.uncaughtexception.RollbarUncaughtExceptionHandler; import com.rollbar.android.provider.NotifierProvider; @@ -499,9 +499,6 @@ public void configure(Config config) { this.rollbar.configure(config); } - public void addEvent(TelemetryEvent telemetryEvent) { - rollbar.addEvent(telemetryEvent); - } /** * Record a critical error. * @@ -798,7 +795,7 @@ public void debug(Throwable error, Map custom, String descriptio } /** - * Log an error at the level returned by {@link com.rollbar.notifier.Rollbar#level}. + * Log an error at the level returned by {@link Level}. * * @param error the error. */ @@ -808,7 +805,7 @@ public void log(Throwable error) { /** * Record an error with human readable description at the default level returned by {@link - * com.rollbar.notifier.Rollbar#level}. + * Level}. * * @param error the error. * @param description human readable description of error. @@ -819,7 +816,7 @@ public void log(Throwable error, String description) { /** * Record an error with extra information attached at the default level returned by {@link - * com.rollbar.notifier.Rollbar#level}. + * Level}. * * @param error the error. * @param custom the extra information. @@ -862,7 +859,7 @@ public void log(Throwable error, String description, Level level) { /** * Record an error with custom parameters and human readable description at the default level - * returned by {@link com.rollbar.notifier.Rollbar#level}. + * returned by {@link Level}. * * @param error the error. * @param custom the custom data. @@ -873,7 +870,7 @@ public void log(Throwable error, Map custom, String description) } /** - * Record a debugging message at the level returned by {@link com.rollbar.notifier.Rollbar#level} (WARNING unless level + * Record a debugging message at the level returned by {@link Level} (WARNING unless level * is overridden). * * @param message the message. @@ -884,7 +881,7 @@ public void log(String message) { /** * Record a message with extra information attached at the default level returned by {@link - * com.rollbar.notifier.Rollbar#level}, (WARNING unless level overridden). + * Level}, (WARNING unless level overridden). * * @param message the message. * @param custom the extra information. @@ -930,6 +927,49 @@ public void log(final Throwable error, final Map custom, final S rollbar.log(error, custom, description, level); } + /** + * Record log telemetry event. ({@link TelemetryType#LOG}). + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param message the message sent for this event (e.g. "hello world"). + */ + public void recordLogEventFor(Level level, final String message) { + rollbar.recordLogEventFor(level, message); + } + + /** + * Record manual telemetry event. ({@link TelemetryType#MANUAL}) + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param message the message sent for this event (e.g. "hello world"). + */ + public void recordManualEventFor(Level level, final String message) { + rollbar.recordManualEventFor(level, message); + } + + /** + * Record navigation telemetry event with from (origin) and to (destination).({@link TelemetryType#NAVIGATION}) + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param from the starting point (e.g. "SettingView"). + * @param to the destination point (e.g. "HomeView"). + */ + public void recordNavigationEventFor(Level level, final String from, final String to) { + rollbar.recordNavigationEventFor(level, from, to); + } + + /** + * Record network telemetry event with method, url, and status code.({@link TelemetryType#NETWORK}) + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param method the verb used (e.g. "POST"). + * @param url the api url (e.g. "http://rollbar.com/test/api"). + * @param statusCode the response status code (e.g. "404"). + */ + public void recordNetworkEventFor(Level level, final String method, final String url, final String statusCode) { + rollbar.recordNetworkEventFor(level, method, url, statusCode); + } + /** * Send payload to Rollbar. * diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java index 277e3670..57dfae17 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java @@ -8,161 +8,80 @@ import java.util.Map; import java.util.Objects; -public class TelemetryEvent implements JsonSerializable, StringTruncatable { +/** + * Represents an event that allows you to leave a 'breadcrumb' leading up to an exception. + */ +public class TelemetryEvent implements JsonSerializable, StringTruncatable { - private final TelemetryType type; - private final Level level; - private final Long timestamp; - private final Map body; - private static final long serialVersionUID = 2843361810242481727L; - private static final String SOURCE = "client"; - private static final String LOG_KEY_MESSAGE = "message"; - private static final String NAVIGATION_KEY_FROM = "from"; - private static final String NAVIGATION_KEY_TO = "to"; - private static final String NETWORK_KEY_METHOD = "method"; - private static final String NETWORK_KEY_URL = "url"; - private static final String NETWORK_KEY_STATUS_CODE = "status_code"; + private final TelemetryType type; + private final Level level; + private final Long timestamp; + private final Map body; + private final String source; + private static final long serialVersionUID = 2843361810242481727L; - private TelemetryEvent( + public TelemetryEvent( TelemetryType telemetryType, Level level, + Long timestamp, + String source, Map body - ) { - timestamp = System.currentTimeMillis(); - type = telemetryType; - this.level = level; - this.body = body; - } - - private TelemetryEvent( - Long timestamp, - TelemetryType telemetryType, - Level level, - Map body - ) { - this.timestamp = timestamp; - type = telemetryType; - this.level = level; - this.body = body; - } - - /** - * Creates a Log TelemetryEvent ({@link TelemetryType#LOG}). - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param message the message sent for this event (e.g. "hello world"). - */ - public static TelemetryEvent log(Level level, final String message) { - Map body = new HashMap() { - private static final long serialVersionUID = 3746979871039874692L; - { - put(LOG_KEY_MESSAGE, message); - } - }; - return new TelemetryEvent(TelemetryType.LOG, level, body); - } + ) { + type = telemetryType; + this.timestamp = timestamp; + this.level = level; + this.source = source; + this.body = body; + } - /** - * Creates a Manual TelemetryEvent ({@link TelemetryType#MANUAL}) . - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param message the message sent for this event (e.g. "hello world"). - */ - public static TelemetryEvent manual(Level level, final String message) { - Map body = new HashMap() { - private static final long serialVersionUID = 3746979871039874692L; - { - put(LOG_KEY_MESSAGE, message); - } - }; - return new TelemetryEvent(TelemetryType.MANUAL, level, body); - } + @Override + public Map asJson() { + Map values = new HashMap<>(); + values.put("type", type.asJson()); + values.put("level", level.asJson()); + values.put("source", source); + values.put("timestamp_ms", timestamp); + values.put("body", body); + return values; + } - /** - * Creates a Navigation TelemetryEvent ({@link TelemetryType#NAVIGATION}) . - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param from the starting point (e.g. "SettingView"). - * @param to the destination point (e.g. "HomeView"). - */ - public static TelemetryEvent navigation(Level level, final String from, final String to) { - Map body = new HashMap() { - private static final long serialVersionUID = 3746979871039874692L; - { - put(NAVIGATION_KEY_FROM, from); - put(NAVIGATION_KEY_TO, to); - } - }; - return new TelemetryEvent(TelemetryType.NAVIGATION, level, body); + @Override + public TelemetryEvent truncateStrings(int maxLength) { + Map truncatedMap = new HashMap<>(); + for (Map.Entry entry : body.entrySet()) { + String truncatedValue = TruncationHelper.truncateString(entry.getValue(), maxLength); + truncatedMap.put(entry.getKey(), truncatedValue); } + return new TelemetryEvent( + this.type, + this.level, + this.timestamp, + this.source, + truncatedMap + ); + } - /** - * Creates a Network TelemetryEvent ({@link TelemetryType#NETWORK}). - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param method the verb used (e.g. "POST"). - * @param url the api url (e.g. "http://rollbar.com/test/api"). - * @param statusCode the response status code (e.g. "404"). - */ - public static TelemetryEvent network(Level level, final String method, final String url, final String statusCode) { - Map body = new HashMap() { - private static final long serialVersionUID = 3746979871039874692L; - { - put(NETWORK_KEY_METHOD, method); - put(NETWORK_KEY_URL, url); - put(NETWORK_KEY_STATUS_CODE, statusCode); - } - }; - return new TelemetryEvent(TelemetryType.NETWORK, level, body); - } + @Override + public int hashCode() { + return Objects.hash(type, level, body); + } - @Override - public Map asJson() { - Map values = new HashMap<>(); - values.put("type", type.asJson()); - values.put("level", level.asJson()); - values.put("source", SOURCE); - values.put("timestamp_ms", timestamp); - values.put("body", body); - return values; - } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TelemetryEvent that = (TelemetryEvent) o; + return Objects.equals(type, that.type) && Objects.equals(level, that.level) && Objects.equals(timestamp, that.timestamp) && Objects.equals(body, that.body); + } - @Override - public TelemetryEvent truncateStrings(int maxLength) { - Map truncatedMap = new HashMap<>(); - for (Map.Entry entry : body.entrySet()) { - String truncatedValue = TruncationHelper.truncateString(entry.getValue(), maxLength); - truncatedMap.put(entry.getKey(), truncatedValue); - } - return new TelemetryEvent( - this.timestamp, - this.type, - this.level, - truncatedMap - ); - } - - @Override - public int hashCode() { - return Objects.hash(type, level, body); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - TelemetryEvent that = (TelemetryEvent) o; - return Objects.equals(type, that.type) && Objects.equals(level, that.level) && Objects.equals(timestamp, that.timestamp) && Objects.equals(body, that.body); - } - - @Override - public String toString() { - return "TelemetryEvent{" + - "type='" + type.asJson() + '\'' + - ", level='" + level.asJson() + '\'' + - ", source='" + SOURCE + '\'' + - ", timestamp_ms=" + timestamp + - ", body=" + body + - '}'; - } + @Override + public String toString() { + return "TelemetryEvent{" + + "type='" + type.asJson() + '\'' + + ", level='" + level.asJson() + '\'' + + ", source='" + source + '\'' + + ", timestamp_ms=" + timestamp + + ", body=" + body + + '}'; + } } diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java index b1a7a2f7..eda1759c 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryType.java @@ -2,6 +2,9 @@ import com.rollbar.api.json.JsonSerializable; +/** + * Represents the different types of {@link TelemetryEvent} available. + */ public enum TelemetryType implements JsonSerializable { LOG("log"), MANUAL("manual"), diff --git a/rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java b/rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java new file mode 100644 index 00000000..f3ef6cf1 --- /dev/null +++ b/rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java @@ -0,0 +1,26 @@ +package com.rollbar.api.payload.data; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +import org.junit.Test; + +import java.util.HashMap; + +public class TelemetryEventTest { + private static final Level LEVEL = Level.DEBUG; + private static final String SOURCE = "Any message"; + private static final long TIMESTAMP = 10L; + + @Test + public void shouldBeEqual() { + TelemetryEvent telemetryEvent1 = logEvent(); + TelemetryEvent telemetryEvent2 = logEvent(); + + assertThat(telemetryEvent1, is(telemetryEvent2)); + } + + private TelemetryEvent logEvent() { + return new TelemetryEvent(TelemetryType.LOG, LEVEL, TIMESTAMP, SOURCE, new HashMap<>()); + } +} diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java index 0caa5171..764dbebf 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java @@ -5,9 +5,12 @@ import com.rollbar.api.payload.data.Data; import com.rollbar.api.payload.data.Level; import com.rollbar.api.payload.data.TelemetryEvent; +import com.rollbar.api.payload.data.TelemetryType; import com.rollbar.api.payload.data.body.Body; import com.rollbar.jvmti.ThrowableCache; import com.rollbar.notifier.config.CommonConfig; +import com.rollbar.notifier.provider.timestamp.TimestampProvider; +import com.rollbar.notifier.telemetry.TelemetryEventTracker; import com.rollbar.notifier.truncation.PayloadTruncator; import com.rollbar.notifier.util.BodyFactory; import com.rollbar.notifier.util.ObjectsUtils; @@ -15,7 +18,6 @@ import com.rollbar.notifier.wrapper.ThrowableWrapper; import java.util.*; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -33,7 +35,6 @@ public abstract class RollbarBase { private static final Logger LOGGER = LoggerFactory.getLogger(RollbarBase.class); private static final int MAX_PAYLOAD_SIZE_BYTES = 512 * 1024; // 512kb - private final Queue telemetryEvents = new ConcurrentLinkedQueue<>(); protected BodyFactory bodyFactory; protected PayloadTruncator payloadTruncator; @@ -44,19 +45,57 @@ public abstract class RollbarBase { protected final Lock configReadLock = configReadWriteLock.readLock(); protected final Lock configWriteLock = configReadWriteLock.writeLock(); private final RESULT emptyResult; + private final TelemetryEventTracker telemetryEventTracker; protected RollbarBase(C config, BodyFactory bodyFactory, RESULT emptyResult) { this.config = config; configureTruncation(config); this.bodyFactory = bodyFactory; this.emptyResult = emptyResult; + this.telemetryEventTracker = new TelemetryEventTracker(new TimestampProvider(), config.maximumTelemetryData()); } - public void addEvent(TelemetryEvent telemetryEvent) { - if (telemetryEvents.size() >= config.maximumTelemetryData()) { - telemetryEvents.poll(); - } - telemetryEvents.add(telemetryEvent); + /** + * Record log telemetry event. ({@link TelemetryType#LOG}). + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param message the message sent for this event (e.g. "hello world"). + */ + public void recordLogEventFor(Level level, final String message) { + telemetryEventTracker.recordLogEventFor(level, config.platform(), message); + } + + /** + * Record manual telemetry event. ({@link TelemetryType#MANUAL}) + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param message the message sent for this event (e.g. "hello world"). + */ + public void recordManualEventFor(Level level, final String message) { + telemetryEventTracker.recordManualEventFor(level, config.platform(), message); + } + + /** + * Record navigation telemetry event with from (origin) and to (destination).({@link TelemetryType#NAVIGATION}) + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param from the starting point (e.g. "SettingView"). + * @param to the destination point (e.g. "HomeView"). + */ + public void recordNavigationEventFor(Level level, final String from, final String to) { + telemetryEventTracker.recordNavigationEventFor(level, config.platform(), from, to); + } + + /** + * Record network telemetry event with method, url, and status code.({@link TelemetryType#NETWORK}) + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param method the verb used (e.g. "POST"). + * @param url the api url (e.g. "http://rollbar.com/test/api"). + * @param statusCode the response status code (e.g. "404"). + */ + public void recordNetworkEventFor(Level level, final String method, final String url, final String statusCode) { + telemetryEventTracker.recordNetworkEventFor(level, config.platform(), method, url, statusCode); } /** @@ -295,11 +334,10 @@ protected RollbarThrowableWrapper wrapThrowable(Throwable error) { protected abstract RESULT sendPayload(C config, Payload payload); private Body makeBody(ThrowableWrapper error, String description) { + List telemetryEvents = telemetryEventTracker.dump(); if (telemetryEvents.isEmpty()) { return bodyFactory.from(error, description); } - Body body = bodyFactory.from(error, description, new ArrayList<>(telemetryEvents)); - telemetryEvents.clear(); - return body; + return bodyFactory.from(error, description, telemetryEvents); } } diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java new file mode 100644 index 00000000..c0614e38 --- /dev/null +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java @@ -0,0 +1,119 @@ +package com.rollbar.notifier.telemetry; + +import com.rollbar.api.payload.data.Level; +import com.rollbar.api.payload.data.TelemetryEvent; +import com.rollbar.api.payload.data.TelemetryType; +import com.rollbar.notifier.provider.timestamp.TimestampProvider; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +public class TelemetryEventTracker { + private final int maximumTelemetryData; + private final Queue telemetryEvents = new ConcurrentLinkedQueue<>(); + private final TimestampProvider timestampProvider; + private static final String LOG_KEY_MESSAGE = "message"; + private static final String NAVIGATION_KEY_FROM = "from"; + private static final String NAVIGATION_KEY_TO = "to"; + private static final String NETWORK_KEY_METHOD = "method"; + private static final String NETWORK_KEY_URL = "url"; + private static final String NETWORK_KEY_STATUS_CODE = "status_code"; + + public TelemetryEventTracker( + TimestampProvider timestampProvider, + int maximumTelemetryData + ) { + this.timestampProvider = timestampProvider; + this.maximumTelemetryData = maximumTelemetryData; + } + + public List dump() { + List events = new ArrayList<>(telemetryEvents); + telemetryEvents.clear(); + return events; + } + /** + * Record log telemetry event. ({@link TelemetryType#LOG}). + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param message the message sent for this event (e.g. "hello world"). + */ + public void recordLogEventFor(Level level, String source, final String message) { + Map body = new HashMap() { + private static final long serialVersionUID = 3746979871039874692L; + + { + put(LOG_KEY_MESSAGE, message); + } + }; + addEvent(new TelemetryEvent(TelemetryType.LOG, level, timestampProvider.provide(), source, body)); + } + + /** + * Record manual telemetry event. ({@link TelemetryType#MANUAL}) . + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param message the message sent for this event (e.g. "hello world"). + */ + public void recordManualEventFor(Level level, String source, final String message) { + Map body = new HashMap() { + private static final long serialVersionUID = 3746979871039874692L; + + { + put(LOG_KEY_MESSAGE, message); + } + }; + addEvent(new TelemetryEvent(TelemetryType.MANUAL, level, timestampProvider.provide(), source, body)); + } + + /** + * Record navigation telemetry event with from (origin) and to (destination).({@link TelemetryType#NAVIGATION}) . + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param from the starting point (e.g. "SettingView"). + * @param to the destination point (e.g. "HomeView"). + */ + public void recordNavigationEventFor(Level level, String source, final String from, final String to) { + Map body = new HashMap() { + private static final long serialVersionUID = 3746979871039874692L; + + { + put(NAVIGATION_KEY_FROM, from); + put(NAVIGATION_KEY_TO, to); + } + }; + addEvent(new TelemetryEvent(TelemetryType.NAVIGATION, level, timestampProvider.provide(), source, body)); + } + + /** + * Record network telemetry event with method, url, and status code.({@link TelemetryType#NETWORK}). + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param method the verb used (e.g. "POST"). + * @param url the api url (e.g. "http://rollbar.com/test/api"). + * @param statusCode the response status code (e.g. "404"). + */ + public void recordNetworkEventFor(Level level, String source, final String method, final String url, final String statusCode) { + Map body = new HashMap() { + private static final long serialVersionUID = 3746979871039874692L; + + { + put(NETWORK_KEY_METHOD, method); + put(NETWORK_KEY_URL, url); + put(NETWORK_KEY_STATUS_CODE, statusCode); + } + }; + addEvent(new TelemetryEvent(TelemetryType.NETWORK, level, timestampProvider.provide(), source, body)); + } + + private void addEvent(TelemetryEvent telemetryEvent) { + if (telemetryEvents.size() >= maximumTelemetryData) { + telemetryEvents.poll(); + } + telemetryEvents.add(telemetryEvent); + } +} diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/TelemetryEventTrackerTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/TelemetryEventTrackerTest.java new file mode 100644 index 00000000..dd68ec2a --- /dev/null +++ b/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/TelemetryEventTrackerTest.java @@ -0,0 +1,161 @@ +package com.rollbar.notifier.telemetry; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.*; + +import com.rollbar.api.payload.data.Level; +import com.rollbar.api.payload.data.TelemetryEvent; +import com.rollbar.api.payload.data.TelemetryType; +import com.rollbar.notifier.provider.timestamp.TimestampProvider; + +import org.junit.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TelemetryEventTrackerTest { + + private static final String SOURCE = "Any source"; + private static final String MESSAGE = "Any message"; + private static final String FROM = "Any origin"; + private static final String TO = "Any destination"; + private static final String METHOD = "Any method"; + private static final String URL = "Any url"; + private static final String STATUS_CODE = "Any status code"; + private static final Level LEVEL = Level.DEBUG; + private static final int MAXIMUM_TELEMETRY_DATA = 2; + private static final long TIMESTAMP = 10L; + private final TimestampProvider fakeTimestampProvider = new TimestampProviderFake(); + private final TelemetryEventTracker telemetryEventTracker = new TelemetryEventTracker( + fakeTimestampProvider, + MAXIMUM_TELEMETRY_DATA + ); + + @Test + public void shouldDiscardOldestEventsWhenMaxCapacityIsReached() { + telemetryEventTracker.recordManualEventFor(LEVEL, SOURCE, MESSAGE); + telemetryEventTracker.recordLogEventFor(LEVEL, SOURCE, MESSAGE); + telemetryEventTracker.recordLogEventFor(LEVEL, SOURCE, MESSAGE); + + List telemetryEvents = telemetryEventTracker.dump(); + + assertThat(telemetryEvents.size(), is(MAXIMUM_TELEMETRY_DATA)); + verifyContainsOnlyLogEvents(telemetryEvents); + } + + @Test + public void shouldTrackALogEvent() { + Map expectedJson = getExpectedJsonForALogTelemetryEvent(); + + telemetryEventTracker.recordLogEventFor(LEVEL, SOURCE, MESSAGE); + + assertThat(getTrackedEventAsJson(), is(expectedJson)); + } + + @Test + public void shouldTrackAManualEvent() { + Map expectedJson = getExpectedJsonForAManualTelemetryEvent(); + + telemetryEventTracker.recordManualEventFor(LEVEL, SOURCE, MESSAGE); + + assertThat(getTrackedEventAsJson(), is(expectedJson)); + } + + @Test + public void shouldTrackANavigationEvent() { + Map expectedJson = getExpectedJsonForANavigationTelemetryEvent(); + + telemetryEventTracker.recordNavigationEventFor(LEVEL, SOURCE, FROM, TO); + + assertThat(getTrackedEventAsJson(), is(expectedJson)); + } + + @Test + public void shouldTrackANetworkEvent() { + Map expectedJson = getExpectedJsonForANetworkTelemetryEvent(); + + telemetryEventTracker.recordNetworkEventFor(LEVEL, SOURCE, METHOD, URL, STATUS_CODE); + + assertThat(getTrackedEventAsJson(), is(expectedJson)); + } + + private Map getTrackedEventAsJson() { + return getFirstEvent().asJson(); + } + + private TelemetryEvent getFirstEvent() { + return telemetryEventTracker.dump().get(0); + } + + private Map getExpectedJsonForALogTelemetryEvent() { + Map map = commonFields(); + map.put("type", TelemetryType.LOG.asJson()); + + Map body = new HashMap<>(); + body.put("message", MESSAGE); + + map.put("body", body); + return map; + } + + private Map getExpectedJsonForAManualTelemetryEvent() { + Map map = commonFields(); + map.put("type", TelemetryType.MANUAL.asJson()); + + Map body = new HashMap<>(); + body.put("message", MESSAGE); + + map.put("body", body); + return map; + } + + private Map getExpectedJsonForANavigationTelemetryEvent() { + Map map = commonFields(); + map.put("type", TelemetryType.NAVIGATION.asJson()); + + Map body = new HashMap<>(); + body.put("from", FROM); + body.put("to", TO); + + map.put("body", body); + return map; + } + + private Map getExpectedJsonForANetworkTelemetryEvent() { + Map map = commonFields(); + map.put("type", TelemetryType.NETWORK.asJson()); + + Map body = new HashMap<>(); + body.put("method", METHOD); + body.put("url", URL); + body.put("status_code", STATUS_CODE); + + map.put("body", body); + return map; + } + + private Map commonFields() { + Map map = new HashMap<>(); + map.put("level", LEVEL.asJson()); + map.put("source", SOURCE); + map.put("timestamp_ms", TIMESTAMP); + return map; + } + + private void verifyContainsOnlyLogEvents(List telemetryEvents) { + Map expectedJson = getExpectedJsonForALogTelemetryEvent(); + + for (int index = 0; index < telemetryEvents.size(); index++) { + TelemetryEvent telemetryEvent = telemetryEvents.get(index); + assertThat(telemetryEvent.asJson(), is(expectedJson)); + } + } + + private static class TimestampProviderFake extends TimestampProvider { + @Override + public Long provide() { + return TIMESTAMP; + } + } +} From b459e2d19cea3e7b17064990f43f6c2d7eb68dcc Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 12 Jul 2024 00:17:24 -0300 Subject: [PATCH 09/34] fix(telemetry): remove reference to TelemetryEventTracker in Body --- .../telemetry/TelemetryEventTracker.java | 42 +++++-------------- 1 file changed, 11 insertions(+), 31 deletions(-) diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java index c0614e38..ef904646 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java @@ -43,13 +43,8 @@ public List dump() { * @param message the message sent for this event (e.g. "hello world"). */ public void recordLogEventFor(Level level, String source, final String message) { - Map body = new HashMap() { - private static final long serialVersionUID = 3746979871039874692L; - - { - put(LOG_KEY_MESSAGE, message); - } - }; + Map body = new HashMap<>(); + body.put(LOG_KEY_MESSAGE, message); addEvent(new TelemetryEvent(TelemetryType.LOG, level, timestampProvider.provide(), source, body)); } @@ -60,13 +55,8 @@ public void recordLogEventFor(Level level, String source, final String message) * @param message the message sent for this event (e.g. "hello world"). */ public void recordManualEventFor(Level level, String source, final String message) { - Map body = new HashMap() { - private static final long serialVersionUID = 3746979871039874692L; - - { - put(LOG_KEY_MESSAGE, message); - } - }; + Map body = new HashMap<>(); + body.put(LOG_KEY_MESSAGE, message); addEvent(new TelemetryEvent(TelemetryType.MANUAL, level, timestampProvider.provide(), source, body)); } @@ -78,14 +68,9 @@ public void recordManualEventFor(Level level, String source, final String messag * @param to the destination point (e.g. "HomeView"). */ public void recordNavigationEventFor(Level level, String source, final String from, final String to) { - Map body = new HashMap() { - private static final long serialVersionUID = 3746979871039874692L; - - { - put(NAVIGATION_KEY_FROM, from); - put(NAVIGATION_KEY_TO, to); - } - }; + Map body = new HashMap<>(); + body.put(NAVIGATION_KEY_FROM, from); + body.put(NAVIGATION_KEY_TO, to); addEvent(new TelemetryEvent(TelemetryType.NAVIGATION, level, timestampProvider.provide(), source, body)); } @@ -98,15 +83,10 @@ public void recordNavigationEventFor(Level level, String source, final String fr * @param statusCode the response status code (e.g. "404"). */ public void recordNetworkEventFor(Level level, String source, final String method, final String url, final String statusCode) { - Map body = new HashMap() { - private static final long serialVersionUID = 3746979871039874692L; - - { - put(NETWORK_KEY_METHOD, method); - put(NETWORK_KEY_URL, url); - put(NETWORK_KEY_STATUS_CODE, statusCode); - } - }; + Map body = new HashMap<>(); + body.put(NETWORK_KEY_METHOD, method); + body.put(NETWORK_KEY_URL, url); + body.put(NETWORK_KEY_STATUS_CODE, statusCode); addEvent(new TelemetryEvent(TelemetryType.NETWORK, level, timestampProvider.provide(), source, body)); } From 818453c9530f555e3a226e22b693f701679a3e0a Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 12 Jul 2024 01:44:35 -0300 Subject: [PATCH 10/34] fix(telemetry): set source only as "client" or "server" for Telemetry events --- .../com/rollbar/notifier/RollbarBase.java | 28 ++-- .../rollbar/notifier/config/CommonConfig.java | 3 + .../notifier/config/ConfigBuilder.java | 31 ++++ .../RollbarTelemetryEventTracker.java | 100 +++++++++++++ .../telemetry/TelemetryEventTracker.java | 97 +------------ .../com/rollbar/notifier/RollbarBaseTest.java | 135 ++++++++++++++++++ ... => RollbarTelemetryEventTrackerTest.java} | 4 +- .../notifier/config/ConfigBuilder.java | 29 ++++ 8 files changed, 324 insertions(+), 103 deletions(-) create mode 100644 rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java create mode 100644 rollbar-java/src/test/java/com/rollbar/notifier/RollbarBaseTest.java rename rollbar-java/src/test/java/com/rollbar/notifier/telemetry/{TelemetryEventTrackerTest.java => RollbarTelemetryEventTrackerTest.java} (97%) diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java index 764dbebf..68cd2495 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java @@ -9,7 +9,6 @@ import com.rollbar.api.payload.data.body.Body; import com.rollbar.jvmti.ThrowableCache; import com.rollbar.notifier.config.CommonConfig; -import com.rollbar.notifier.provider.timestamp.TimestampProvider; import com.rollbar.notifier.telemetry.TelemetryEventTracker; import com.rollbar.notifier.truncation.PayloadTruncator; import com.rollbar.notifier.util.BodyFactory; @@ -52,7 +51,7 @@ protected RollbarBase(C config, BodyFactory bodyFactory, RESULT emptyResult) { configureTruncation(config); this.bodyFactory = bodyFactory; this.emptyResult = emptyResult; - this.telemetryEventTracker = new TelemetryEventTracker(new TimestampProvider(), config.maximumTelemetryData()); + this.telemetryEventTracker = config.telemetryEventTracker(); } /** @@ -61,8 +60,8 @@ protected RollbarBase(C config, BodyFactory bodyFactory, RESULT emptyResult) { * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). * @param message the message sent for this event (e.g. "hello world"). */ - public void recordLogEventFor(Level level, final String message) { - telemetryEventTracker.recordLogEventFor(level, config.platform(), message); + public void recordLogEventFor(Level level, String message) { + telemetryEventTracker.recordLogEventFor(level, getSource(), message); } /** @@ -71,8 +70,8 @@ public void recordLogEventFor(Level level, final String message) { * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). * @param message the message sent for this event (e.g. "hello world"). */ - public void recordManualEventFor(Level level, final String message) { - telemetryEventTracker.recordManualEventFor(level, config.platform(), message); + public void recordManualEventFor(Level level, String message) { + telemetryEventTracker.recordManualEventFor(level, getSource(), message); } /** @@ -82,8 +81,8 @@ public void recordManualEventFor(Level level, final String message) { * @param from the starting point (e.g. "SettingView"). * @param to the destination point (e.g. "HomeView"). */ - public void recordNavigationEventFor(Level level, final String from, final String to) { - telemetryEventTracker.recordNavigationEventFor(level, config.platform(), from, to); + public void recordNavigationEventFor(Level level, String from, String to) { + telemetryEventTracker.recordNavigationEventFor(level, getSource(), from, to); } /** @@ -94,8 +93,8 @@ public void recordNavigationEventFor(Level level, final String from, final Strin * @param url the api url (e.g. "http://rollbar.com/test/api"). * @param statusCode the response status code (e.g. "404"). */ - public void recordNetworkEventFor(Level level, final String method, final String url, final String statusCode) { - telemetryEventTracker.recordNetworkEventFor(level, config.platform(), method, url, statusCode); + public void recordNetworkEventFor(Level level, String method, String url, String statusCode) { + telemetryEventTracker.recordNetworkEventFor(level, getSource(), method, url, statusCode); } /** @@ -340,4 +339,13 @@ private Body makeBody(ThrowableWrapper error, String description) { } return bodyFactory.from(error, description, telemetryEvents); } + + private String getSource() { + String platform = config.platform(); + if ("android".equals(platform)) { + return "client"; + } else { + return "server"; + } + } } diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/config/CommonConfig.java b/rollbar-java/src/main/java/com/rollbar/notifier/config/CommonConfig.java index ddcc0e3d..f2fac03c 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/config/CommonConfig.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/config/CommonConfig.java @@ -10,6 +10,7 @@ import com.rollbar.notifier.fingerprint.FingerprintGenerator; import com.rollbar.notifier.provider.Provider; import com.rollbar.notifier.sender.json.JsonSerializer; +import com.rollbar.notifier.telemetry.TelemetryEventTracker; import com.rollbar.notifier.transformer.Transformer; import com.rollbar.notifier.uuid.UuidGenerator; import java.util.List; @@ -212,4 +213,6 @@ public interface CommonConfig { boolean truncateLargePayloads(); int maximumTelemetryData(); + + TelemetryEventTracker telemetryEventTracker(); } diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java index 2f6968fb..07ff487d 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java @@ -17,6 +17,8 @@ import com.rollbar.notifier.sender.SyncSender; import com.rollbar.notifier.sender.json.JsonSerializer; import com.rollbar.notifier.sender.json.JsonSerializerImpl; +import com.rollbar.notifier.telemetry.RollbarTelemetryEventTracker; +import com.rollbar.notifier.telemetry.TelemetryEventTracker; import com.rollbar.notifier.transformer.Transformer; import com.rollbar.notifier.uuid.UuidGenerator; import java.lang.Thread.UncaughtExceptionHandler; @@ -87,6 +89,8 @@ public class ConfigBuilder { private int maximumTelemetryData = DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS; + private TelemetryEventTracker telemetryEventTracker; + private final static int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; private final static int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; @@ -137,6 +141,8 @@ private ConfigBuilder(Config config) { this.appPackages = config.appPackages(); this.defaultLevels = new DefaultLevels(config); this.truncateLargePayloads = config.truncateLargePayloads(); + this.maximumTelemetryData = config.maximumTelemetryData(); + this.telemetryEventTracker = config.telemetryEventTracker(); } /** @@ -502,6 +508,19 @@ public ConfigBuilder maximumTelemetryData(int maximumTelemetryData) { return this; } + /** + *

+ * Set a {@link TelemetryEventTracker} implementation. + * Default: {@link RollbarTelemetryEventTracker} with a {@link TimestampProvider}. + *

+ * @param telemetryEventTracker true to enable truncation. + * @return the builder instance. + */ + public ConfigBuilder telemetryEventTracker(TelemetryEventTracker telemetryEventTracker) { + this.telemetryEventTracker = telemetryEventTracker; + return this; + } + /** * Builds the {@link Config config}. * @@ -532,6 +551,10 @@ public Config build() { this.timestamp = new TimestampProvider(); } + if (telemetryEventTracker == null) { + telemetryEventTracker = new RollbarTelemetryEventTracker(new TimestampProvider(), maximumTelemetryData); + } + return new ConfigImpl(this); } @@ -593,6 +616,8 @@ private static class ConfigImpl implements Config { private final int maximumTelemetryData; + private final TelemetryEventTracker telemetryEventTracker; + ConfigImpl(ConfigBuilder builder) { this.accessToken = builder.accessToken; this.endpoint = builder.endpoint; @@ -626,6 +651,7 @@ private static class ConfigImpl implements Config { this.defaultLevels = builder.defaultLevels; this.truncateLargePayloads = builder.truncateLargePayloads; this.maximumTelemetryData = builder.maximumTelemetryData; + this.telemetryEventTracker = builder.telemetryEventTracker; } @Override @@ -777,5 +803,10 @@ public boolean truncateLargePayloads() { public int maximumTelemetryData() { return this.maximumTelemetryData; } + + @Override + public TelemetryEventTracker telemetryEventTracker() { + return this.telemetryEventTracker; + } } } diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java new file mode 100644 index 00000000..fca27128 --- /dev/null +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java @@ -0,0 +1,100 @@ +package com.rollbar.notifier.telemetry; + +import com.rollbar.api.payload.data.Level; +import com.rollbar.api.payload.data.TelemetryEvent; +import com.rollbar.api.payload.data.TelemetryType; +import com.rollbar.notifier.provider.Provider; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +public class RollbarTelemetryEventTracker implements TelemetryEventTracker { + private final int maximumTelemetryData; + private final Queue telemetryEvents = new ConcurrentLinkedQueue<>(); + private final Provider timestampProvider; + private static final String LOG_KEY_MESSAGE = "message"; + private static final String NAVIGATION_KEY_FROM = "from"; + private static final String NAVIGATION_KEY_TO = "to"; + private static final String NETWORK_KEY_METHOD = "method"; + private static final String NETWORK_KEY_URL = "url"; + private static final String NETWORK_KEY_STATUS_CODE = "status_code"; + + public RollbarTelemetryEventTracker( + Provider timestampProvider, + int maximumTelemetryData + ) { + this.timestampProvider = timestampProvider; + this.maximumTelemetryData = maximumTelemetryData; + } + + public List dump() { + List events = new ArrayList<>(telemetryEvents); + telemetryEvents.clear(); + return events; + } + + /** + * Record log telemetry event. ({@link TelemetryType#LOG}). + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param message the message sent for this event (e.g. "hello world"). + */ + public void recordLogEventFor(Level level, String source, String message) { + Map body = new HashMap<>(); + body.put(LOG_KEY_MESSAGE, message); + addEvent(new TelemetryEvent(TelemetryType.LOG, level, timestampProvider.provide(), source, body)); + } + + /** + * Record manual telemetry event. ({@link TelemetryType#MANUAL}) . + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param message the message sent for this event (e.g. "hello world"). + */ + public void recordManualEventFor(Level level, String source, String message) { + Map body = new HashMap<>(); + body.put(LOG_KEY_MESSAGE, message); + addEvent(new TelemetryEvent(TelemetryType.MANUAL, level, timestampProvider.provide(), source, body)); + } + + /** + * Record navigation telemetry event with from (origin) and to (destination).({@link TelemetryType#NAVIGATION}) . + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param from the starting point (e.g. "SettingView"). + * @param to the destination point (e.g. "HomeView"). + */ + public void recordNavigationEventFor(Level level, String source, String from, String to) { + Map body = new HashMap<>(); + body.put(NAVIGATION_KEY_FROM, from); + body.put(NAVIGATION_KEY_TO, to); + addEvent(new TelemetryEvent(TelemetryType.NAVIGATION, level, timestampProvider.provide(), source, body)); + } + + /** + * Record network telemetry event with method, url, and status code.({@link TelemetryType#NETWORK}). + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param method the verb used (e.g. "POST"). + * @param url the api url (e.g. "http://rollbar.com/test/api"). + * @param statusCode the response status code (e.g. "404"). + */ + public void recordNetworkEventFor(Level level, String source, String method, String url, String statusCode) { + Map body = new HashMap<>(); + body.put(NETWORK_KEY_METHOD, method); + body.put(NETWORK_KEY_URL, url); + body.put(NETWORK_KEY_STATUS_CODE, statusCode); + addEvent(new TelemetryEvent(TelemetryType.NETWORK, level, timestampProvider.provide(), source, body)); + } + + private void addEvent(TelemetryEvent telemetryEvent) { + if (telemetryEvents.size() >= maximumTelemetryData) { + telemetryEvents.poll(); + } + telemetryEvents.add(telemetryEvent); + } +} diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java index ef904646..03d0b4ed 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java @@ -2,98 +2,13 @@ import com.rollbar.api.payload.data.Level; import com.rollbar.api.payload.data.TelemetryEvent; -import com.rollbar.api.payload.data.TelemetryType; -import com.rollbar.notifier.provider.timestamp.TimestampProvider; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; -public class TelemetryEventTracker { - private final int maximumTelemetryData; - private final Queue telemetryEvents = new ConcurrentLinkedQueue<>(); - private final TimestampProvider timestampProvider; - private static final String LOG_KEY_MESSAGE = "message"; - private static final String NAVIGATION_KEY_FROM = "from"; - private static final String NAVIGATION_KEY_TO = "to"; - private static final String NETWORK_KEY_METHOD = "method"; - private static final String NETWORK_KEY_URL = "url"; - private static final String NETWORK_KEY_STATUS_CODE = "status_code"; - - public TelemetryEventTracker( - TimestampProvider timestampProvider, - int maximumTelemetryData - ) { - this.timestampProvider = timestampProvider; - this.maximumTelemetryData = maximumTelemetryData; - } - - public List dump() { - List events = new ArrayList<>(telemetryEvents); - telemetryEvents.clear(); - return events; - } - /** - * Record log telemetry event. ({@link TelemetryType#LOG}). - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param message the message sent for this event (e.g. "hello world"). - */ - public void recordLogEventFor(Level level, String source, final String message) { - Map body = new HashMap<>(); - body.put(LOG_KEY_MESSAGE, message); - addEvent(new TelemetryEvent(TelemetryType.LOG, level, timestampProvider.provide(), source, body)); - } - - /** - * Record manual telemetry event. ({@link TelemetryType#MANUAL}) . - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param message the message sent for this event (e.g. "hello world"). - */ - public void recordManualEventFor(Level level, String source, final String message) { - Map body = new HashMap<>(); - body.put(LOG_KEY_MESSAGE, message); - addEvent(new TelemetryEvent(TelemetryType.MANUAL, level, timestampProvider.provide(), source, body)); - } - - /** - * Record navigation telemetry event with from (origin) and to (destination).({@link TelemetryType#NAVIGATION}) . - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param from the starting point (e.g. "SettingView"). - * @param to the destination point (e.g. "HomeView"). - */ - public void recordNavigationEventFor(Level level, String source, final String from, final String to) { - Map body = new HashMap<>(); - body.put(NAVIGATION_KEY_FROM, from); - body.put(NAVIGATION_KEY_TO, to); - addEvent(new TelemetryEvent(TelemetryType.NAVIGATION, level, timestampProvider.provide(), source, body)); - } - - /** - * Record network telemetry event with method, url, and status code.({@link TelemetryType#NETWORK}). - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param method the verb used (e.g. "POST"). - * @param url the api url (e.g. "http://rollbar.com/test/api"). - * @param statusCode the response status code (e.g. "404"). - */ - public void recordNetworkEventFor(Level level, String source, final String method, final String url, final String statusCode) { - Map body = new HashMap<>(); - body.put(NETWORK_KEY_METHOD, method); - body.put(NETWORK_KEY_URL, url); - body.put(NETWORK_KEY_STATUS_CODE, statusCode); - addEvent(new TelemetryEvent(TelemetryType.NETWORK, level, timestampProvider.provide(), source, body)); - } - - private void addEvent(TelemetryEvent telemetryEvent) { - if (telemetryEvents.size() >= maximumTelemetryData) { - telemetryEvents.poll(); - } - telemetryEvents.add(telemetryEvent); - } +public interface TelemetryEventTracker { + List dump(); + void recordLogEventFor(Level level, String source, String message); + void recordManualEventFor(Level level, String source, String message); + void recordNavigationEventFor(Level level, String source, String from, String to); + void recordNetworkEventFor(Level level, String source, String method, String url, String statusCode); } diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/RollbarBaseTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/RollbarBaseTest.java new file mode 100644 index 00000000..cfae37b6 --- /dev/null +++ b/rollbar-java/src/test/java/com/rollbar/notifier/RollbarBaseTest.java @@ -0,0 +1,135 @@ +package com.rollbar.notifier; + +import static com.rollbar.notifier.config.ConfigBuilder.withAccessToken; + +import static org.mockito.Mockito.verify; + +import com.rollbar.api.payload.Payload; +import com.rollbar.api.payload.data.Level; +import com.rollbar.notifier.config.Config; +import com.rollbar.notifier.telemetry.TelemetryEventTracker; +import com.rollbar.notifier.util.BodyFactory; + +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +public class RollbarBaseTest { + private final Level level = Level.DEBUG; + + @Rule + public MockitoRule rule = MockitoJUnit.rule(); + + @Mock + private TelemetryEventTracker telemetryEventTracker; + + @Mock + private BodyFactory dummyFactory; + + @Test + public void shouldRecordALogEventWithServerSourceWhenThePlatformIsNotAndroid() { + String message = "message"; + RollbarBase sut = new RollbarBaseImpl(getConfigWith("spring"), dummyFactory, null); + + sut.recordLogEventFor(level, message); + + verify(telemetryEventTracker).recordLogEventFor(level, "server", message); + } + + @Test + public void shouldRecordALogEventWithClientSourceWhenThePlatformIsAndroid() { + String message = "message"; + RollbarBase sut = new RollbarBaseImpl(getConfigWith("android"), dummyFactory, null); + + sut.recordLogEventFor(level, message); + + verify(telemetryEventTracker).recordLogEventFor(level, "client", message); + } + + @Test + public void shouldRecordAManualEventWithServerSourceWhenThePlatformIsNotAndroid() { + String message = "message"; + RollbarBase sut = new RollbarBaseImpl(getConfigWith(null), dummyFactory, null); + + sut.recordManualEventFor(level, message); + + verify(telemetryEventTracker).recordManualEventFor(level, "server", message); + } + + @Test + public void shouldRecordAManualEventWithClientSourceWhenThePlatformIsAndroid() { + String message = "message"; + RollbarBase sut = new RollbarBaseImpl(getConfigWith("android"), dummyFactory, null); + + sut.recordManualEventFor(level, message); + + verify(telemetryEventTracker).recordManualEventFor(level, "client", message); + } + + @Test + public void shouldRecordANetworkEventWithServerSourceWhenThePlatformIsNotAndroid() { + String method = "method"; + String url = "url"; + String statusCode = "status code"; + RollbarBase sut = new RollbarBaseImpl(getConfigWith("any"), dummyFactory, null); + + sut.recordNetworkEventFor(level, method, url, statusCode); + + verify(telemetryEventTracker).recordNetworkEventFor(level, "server", method, url, statusCode); + } + + @Test + public void shouldRecordANetworkEventWithClientSourceWhenThePlatformIsAndroid() { + String method = "method"; + String url = "url"; + String statusCode = "status code"; + RollbarBase sut = new RollbarBaseImpl(getConfigWith("android"), dummyFactory, null); + + sut.recordNetworkEventFor(level, method, url, statusCode); + + verify(telemetryEventTracker).recordNetworkEventFor(level, "client", method, url, statusCode); + } + + @Test + public void shouldRecordANavigationEventWithServerSourceWhenThePlatformIsNotAndroid() { + String from = "from"; + String to = "to"; + RollbarBase sut = new RollbarBaseImpl(getConfigWith("any"), dummyFactory, null); + + sut.recordNavigationEventFor(level, from, to); + + verify(telemetryEventTracker).recordNavigationEventFor(level, "server", from, to); + } + + @Test + public void shouldRecordANavigationEventWithClientSourceWhenThePlatformIsAndroid() { + String from = "from"; + String to = "to"; + RollbarBase sut = new RollbarBaseImpl(getConfigWith("android"), dummyFactory, null); + + sut.recordNavigationEventFor(level, from, to); + + verify(telemetryEventTracker).recordNavigationEventFor(level, "client", from, to); + } + + private Config getConfigWith(String platform) { + return withAccessToken("dummy token") + .telemetryEventTracker(telemetryEventTracker) + .platform(platform) + .build(); + } + + static class RollbarBaseImpl extends RollbarBase { + + protected RollbarBaseImpl(Config config, BodyFactory bodyFactory, Void emptyResult) { + super(config, bodyFactory, emptyResult); + } + + @Override + protected Void sendPayload(Config config, Payload payload) { + return null; + } + } +} diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/TelemetryEventTrackerTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java similarity index 97% rename from rollbar-java/src/test/java/com/rollbar/notifier/telemetry/TelemetryEventTrackerTest.java rename to rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java index dd68ec2a..8b90f852 100644 --- a/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/TelemetryEventTrackerTest.java +++ b/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.Map; -public class TelemetryEventTrackerTest { +public class RollbarTelemetryEventTrackerTest { private static final String SOURCE = "Any source"; private static final String MESSAGE = "Any message"; @@ -27,7 +27,7 @@ public class TelemetryEventTrackerTest { private static final int MAXIMUM_TELEMETRY_DATA = 2; private static final long TIMESTAMP = 10L; private final TimestampProvider fakeTimestampProvider = new TimestampProviderFake(); - private final TelemetryEventTracker telemetryEventTracker = new TelemetryEventTracker( + private final RollbarTelemetryEventTracker telemetryEventTracker = new RollbarTelemetryEventTracker( fakeTimestampProvider, MAXIMUM_TELEMETRY_DATA ); diff --git a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java index 944c599e..99cb9c97 100644 --- a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java +++ b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java @@ -15,6 +15,8 @@ import com.rollbar.notifier.provider.timestamp.TimestampProvider; import com.rollbar.notifier.sender.SyncSender; import com.rollbar.notifier.sender.json.JsonSerializer; +import com.rollbar.notifier.telemetry.RollbarTelemetryEventTracker; +import com.rollbar.notifier.telemetry.TelemetryEventTracker; import com.rollbar.notifier.transformer.Transformer; import com.rollbar.notifier.uuid.UuidGenerator; import com.rollbar.reactivestreams.notifier.sender.AsyncSender; @@ -60,6 +62,7 @@ public final class ConfigBuilder { private DefaultLevels defaultLevels; private boolean truncateLargePayloads; private int maximumTelemetryData = DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS; + private TelemetryEventTracker telemetryEventTracker; private final static int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; private final static int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; private final static int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; @@ -104,6 +107,8 @@ private ConfigBuilder(Config config) { this.appPackages = config.appPackages(); this.defaultLevels = new DefaultLevels(config); this.truncateLargePayloads = config.truncateLargePayloads(); + this.maximumTelemetryData = config.maximumTelemetryData(); + this.telemetryEventTracker = config.telemetryEventTracker(); } private ConfigBuilder(Sender sender) { @@ -488,6 +493,19 @@ public ConfigBuilder maximumTelemetryData(int maximumTelemetryData) { return this; } + /** + *

+ * Set a {@link TelemetryEventTracker} implementation. + * Default: {@link RollbarTelemetryEventTracker} with a {@link TimestampProvider}. + *

+ * @param telemetryEventTracker true to enable truncation. + * @return the builder instance. + */ + public ConfigBuilder telemetryEventTracker(TelemetryEventTracker telemetryEventTracker) { + this.telemetryEventTracker = telemetryEventTracker; + return this; + } + /** * Builds the {@link Config config}. * @@ -521,6 +539,10 @@ public Config build() { this.timestamp = new TimestampProvider(); } + if (telemetryEventTracker == null) { + telemetryEventTracker = new RollbarTelemetryEventTracker(new TimestampProvider(), maximumTelemetryData); + } + return new ConfigImpl(this); } @@ -553,6 +575,7 @@ private static class ConfigImpl implements Config { private final JsonSerializer jsonSerializer; private final boolean truncateLargePayloads; private final int maximumTelemetryData; + private final TelemetryEventTracker telemetryEventTracker; ConfigImpl(ConfigBuilder builder) { this.accessToken = builder.accessToken; @@ -586,6 +609,7 @@ private static class ConfigImpl implements Config { this.jsonSerializer = builder.jsonSerializer; this.truncateLargePayloads = builder.truncateLargePayloads; this.maximumTelemetryData = builder.maximumTelemetryData; + this.telemetryEventTracker = builder.telemetryEventTracker; } @Override @@ -732,5 +756,10 @@ public boolean truncateLargePayloads() { public int maximumTelemetryData() { return this.maximumTelemetryData; } + + @Override + public TelemetryEventTracker telemetryEventTracker() { + return this.telemetryEventTracker; + } } } From 7220e5867023123c364cbe516522ee80d861a75a Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 14 Jul 2024 16:54:36 -0300 Subject: [PATCH 11/34] test(telemetry): add tests for TelemetryEvent --- .../api/payload/data/TelemetryEventTest.java | 203 +++++++++++++++++- 1 file changed, 194 insertions(+), 9 deletions(-) diff --git a/rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java b/rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java index f3ef6cf1..c7a69db9 100644 --- a/rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java +++ b/rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java @@ -1,26 +1,211 @@ package com.rollbar.api.payload.data; import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import org.junit.Before; import org.junit.Test; import java.util.HashMap; +import java.util.Map; public class TelemetryEventTest { - private static final Level LEVEL = Level.DEBUG; - private static final String SOURCE = "Any message"; - private static final long TIMESTAMP = 10L; + private HashMap defaultBody; + private static final String TEN_CHARACTERS = "0123456789"; + private static final String BODY_KEY = "someKey"; + TelemetryEventBuilder builder; + + @Before + public void setup() { + builder = new TelemetryEventBuilder(); + defaultBody = makeBody(); + } + + @Test + public void anInstanceShouldBeEqualToIt() { + TelemetryEvent telemetryEvent = builder.build(); + + assertThat(telemetryEvent, is(telemetryEvent)); + } + + @Test + public void shouldNotBeEqualToNull() { + TelemetryEvent telemetryEvent = builder.build(); + + assertNotEquals(telemetryEvent, null); + } @Test - public void shouldBeEqual() { - TelemetryEvent telemetryEvent1 = logEvent(); - TelemetryEvent telemetryEvent2 = logEvent(); + public void shouldNotBeEqualToADifferentObject() { + Object anotherObject = "anotherObject"; + TelemetryEvent telemetryEvent = builder.build(); + + assertNotEquals(telemetryEvent, anotherObject); + } + + @Test + public void shouldNotBeEqualToADifferentTypeOfTelemetryEvent() { + TelemetryEvent manualEvent = builder.setTelemetryType(TelemetryType.MANUAL).build(); + TelemetryEvent logEvent = builder.setTelemetryType(TelemetryType.LOG).build(); + + boolean equality = manualEvent.equals(logEvent); + + assertFalse(equality); + } + + @Test + public void shouldNotBeEqualIfTheyHaveDifferentLevel() { + TelemetryEvent debugEvent = builder.setLevel(Level.DEBUG).build(); + TelemetryEvent criticalEvent = builder.setLevel(Level.CRITICAL).build(); + + boolean equality = debugEvent.equals(criticalEvent); + + assertFalse(equality); + } + + @Test + public void shouldNotBeEqualIfTheyHaveDifferentTimestamp() { + TelemetryEvent firstEvent = builder.setTimestamp(10L).build(); + TelemetryEvent secondEvent = builder.setTimestamp(11L).build(); + + boolean equality = firstEvent.equals(secondEvent); + + assertFalse(equality); + } + + @Test + public void shouldNotBeEqualIfTheyHaveDifferentSource() { + TelemetryEvent clientEvent = builder.setSource("client").build(); + TelemetryEvent serverEvent = builder.setSource("server").build(); + + boolean equality = clientEvent.equals(serverEvent); + + assertFalse(equality); + } + + @Test + public void shouldNotBeEqualIfTheyHaveDifferentBody() { + TelemetryEvent telemetryEvent1 = builder.setBody(defaultBody).build(); + defaultBody.put(BODY_KEY, TEN_CHARACTERS + TEN_CHARACTERS); + TelemetryEvent telemetryEvent2 = builder.setBody(defaultBody).build(); + + boolean equality = telemetryEvent1.equals(telemetryEvent2); + + assertFalse(equality); + } + + + @Test + public void twoTelemetryEventsShouldBeEqualIfTheyHaveTheSameValues() { + TelemetryEvent telemetryEvent1 = builder.setBody(defaultBody).build(); + TelemetryEvent telemetryEvent2 = builder.setBody(defaultBody).build(); + + boolean equality = telemetryEvent1.equals(telemetryEvent2); + + assertTrue(equality); + } + + @Test + public void twoTelemetryEventsShouldHaveTheSameHashCodeIfTheyHaveTheSameValues() { + TelemetryEvent telemetryEvent1 = builder.setBody(defaultBody).build(); + TelemetryEvent telemetryEvent2 = builder.setBody(defaultBody).build(); + + int hashCode1 = telemetryEvent1.hashCode(); + int hashCode2 = telemetryEvent2.hashCode(); + + assertThat(hashCode1, is(hashCode2)); + } + + @Test + public void shouldReturnAJsonRepresentation() { + defaultBody.put("someKey", "someValue"); + HashMap expected = new HashMap<>(); + expected.put("type", "log"); + expected.put("level", "debug"); + expected.put("source", TelemetryEventBuilder.DEFAULT_SOURCE); + expected.put("timestamp_ms", TelemetryEventBuilder.DEFAULT_TIMESTAMP); + expected.put("body", defaultBody); + TelemetryEvent telemetryEvent1 = builder.setBody(defaultBody).build(); + + Map json = telemetryEvent1.asJson(); + + assertThat(json, is(expected)); + } + + + @Test + public void shouldReturnAStringRepresentation() { + String expected = "TelemetryEvent{type='log', level='debug', source='" + TelemetryEventBuilder.DEFAULT_SOURCE + '\'' + + ", timestamp_ms=" + TelemetryEventBuilder.DEFAULT_TIMESTAMP + + ", body=" + defaultBody + + '}'; + TelemetryEvent telemetryEvent1 = builder.setBody(defaultBody).build(); + + String stringRepresentation = telemetryEvent1.toString(); + + assertThat(stringRepresentation, is(expected)); + } + + @Test + public void shouldTruncateBody() { + HashMap body = new HashMap<>(); + body.put("short", TEN_CHARACTERS); + body.put("long", TEN_CHARACTERS + TEN_CHARACTERS); + TelemetryEvent expected = builder.setBody(body).build(); + body.put("long", TEN_CHARACTERS + TEN_CHARACTERS + TEN_CHARACTERS); + TelemetryEvent originalTelemetryEvent = builder.setBody(body).build(); + + TelemetryEvent telemetryEventTruncated = originalTelemetryEvent.truncateStrings(20); + + assertThat(telemetryEventTruncated, is(expected)); + } + + private HashMap makeBody() { + HashMap body = new HashMap<>(); + body.put(BODY_KEY, TEN_CHARACTERS); + return body; + } + +} + +class TelemetryEventBuilder { + public static long DEFAULT_TIMESTAMP = 10L; + public static String DEFAULT_SOURCE = "client"; + private long timestamp = DEFAULT_TIMESTAMP; + private TelemetryType telemetryType = TelemetryType.LOG; + private Level level = Level.DEBUG; + private String source = DEFAULT_SOURCE; + HashMap body = new HashMap<>(); + + TelemetryEventBuilder setTelemetryType(TelemetryType telemetryType) { + this.telemetryType = telemetryType; + return this; + } + + TelemetryEventBuilder setLevel(Level level) { + this.level = level; + return this; + } + + TelemetryEventBuilder setTimestamp(long timestamp) { + this.timestamp = timestamp; + return this; + } + + TelemetryEventBuilder setSource(String source) { + this.source = source; + return this; + } - assertThat(telemetryEvent1, is(telemetryEvent2)); + TelemetryEventBuilder setBody(HashMap body) { + this.body = body; + return this; } - private TelemetryEvent logEvent() { - return new TelemetryEvent(TelemetryType.LOG, LEVEL, TIMESTAMP, SOURCE, new HashMap<>()); + TelemetryEvent build() { + return new TelemetryEvent(telemetryType, level, timestamp, source, body); } } From 9dc8e100670ea2be4dcafbd7c793197472301330 Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 14 Jul 2024 16:55:13 -0300 Subject: [PATCH 12/34] refactor(telemetry): modify equals and hashcode, and create a new hashmap in constructor --- .../api/payload/data/TelemetryEvent.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java index 57dfae17..e24abeb4 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java @@ -31,7 +31,7 @@ public TelemetryEvent( this.timestamp = timestamp; this.level = level; this.source = source; - this.body = body; + this.body = new HashMap<>(body); } @Override @@ -62,8 +62,14 @@ public TelemetryEvent truncateStrings(int maxLength) { } @Override - public int hashCode() { - return Objects.hash(type, level, body); + public String toString() { + return "TelemetryEvent{" + + "type='" + type.asJson() + '\'' + + ", level='" + level.asJson() + '\'' + + ", source='" + source + '\'' + + ", timestamp_ms=" + timestamp + + ", body=" + body + + '}'; } @Override @@ -71,17 +77,11 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; TelemetryEvent that = (TelemetryEvent) o; - return Objects.equals(type, that.type) && Objects.equals(level, that.level) && Objects.equals(timestamp, that.timestamp) && Objects.equals(body, that.body); + return type == that.type && level == that.level && Objects.equals(timestamp, that.timestamp) && Objects.equals(body, that.body) && Objects.equals(source, that.source); } @Override - public String toString() { - return "TelemetryEvent{" + - "type='" + type.asJson() + '\'' + - ", level='" + level.asJson() + '\'' + - ", source='" + source + '\'' + - ", timestamp_ms=" + timestamp + - ", body=" + body + - '}'; + public int hashCode() { + return Objects.hash(type, level, timestamp, body, source); } } From 8796494f852521d01d4f932e4f1c9a2e63b73c28 Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 21 Jul 2024 15:54:32 -0300 Subject: [PATCH 13/34] revert(notifier): previous reference --- .../src/main/java/com/rollbar/android/Rollbar.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java b/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java index 677c8993..5fe245c4 100644 --- a/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java +++ b/rollbar-android/src/main/java/com/rollbar/android/Rollbar.java @@ -795,7 +795,7 @@ public void debug(Throwable error, Map custom, String descriptio } /** - * Log an error at the level returned by {@link Level}. + * Log an error at the level returned by {@link com.rollbar.notifier.Rollbar#level}. * * @param error the error. */ @@ -805,7 +805,7 @@ public void log(Throwable error) { /** * Record an error with human readable description at the default level returned by {@link - * Level}. + * com.rollbar.notifier.Rollbar#level}. * * @param error the error. * @param description human readable description of error. @@ -816,7 +816,7 @@ public void log(Throwable error, String description) { /** * Record an error with extra information attached at the default level returned by {@link - * Level}. + * com.rollbar.notifier.Rollbar#level}. * * @param error the error. * @param custom the extra information. @@ -859,7 +859,7 @@ public void log(Throwable error, String description, Level level) { /** * Record an error with custom parameters and human readable description at the default level - * returned by {@link Level}. + * returned by {@link com.rollbar.notifier.Rollbar#level}. * * @param error the error. * @param custom the custom data. @@ -870,7 +870,7 @@ public void log(Throwable error, Map custom, String description) } /** - * Record a debugging message at the level returned by {@link Level} (WARNING unless level + * Record a debugging message at the level returned by {@link com.rollbar.notifier.Rollbar#level} (WARNING unless level * is overridden). * * @param message the message. @@ -881,7 +881,7 @@ public void log(String message) { /** * Record a message with extra information attached at the default level returned by {@link - * Level}, (WARNING unless level overridden). + * com.rollbar.notifier.Rollbar#level}, (WARNING unless level overridden). * * @param message the message. * @param custom the extra information. From 2fcb32365f3f3fe9554df5cebc78827eb6afdfa9 Mon Sep 17 00:00:00 2001 From: chris Date: Thu, 15 Aug 2024 23:16:46 -0300 Subject: [PATCH 14/34] refactor: set source as an enum --- .../com/rollbar/api/payload/data/Source.java | 19 +++++++++++++++++++ .../api/payload/data/TelemetryEvent.java | 6 +++--- .../com/rollbar/notifier/RollbarBase.java | 7 ++++--- .../RollbarTelemetryEventTracker.java | 9 +++++---- .../telemetry/TelemetryEventTracker.java | 9 +++++---- .../com/rollbar/notifier/RollbarBaseTest.java | 17 +++++++++-------- .../RollbarTelemetryEventTrackerTest.java | 5 +++-- 7 files changed, 48 insertions(+), 24 deletions(-) create mode 100644 rollbar-api/src/main/java/com/rollbar/api/payload/data/Source.java diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/Source.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/Source.java new file mode 100644 index 00000000..9cde0a21 --- /dev/null +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/Source.java @@ -0,0 +1,19 @@ +package com.rollbar.api.payload.data; + +import com.rollbar.api.json.JsonSerializable; + +public enum Source implements JsonSerializable { + CLIENT("client"), + SERVER("server"); + + private final String jsonName; + + Source(String jsonName) { + this.jsonName = jsonName; + } + + @Override + public Object asJson() { + return jsonName; + } +} diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java index e24abeb4..5af18569 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java @@ -17,14 +17,14 @@ public class TelemetryEvent implements JsonSerializable, StringTruncatable body; - private final String source; + private final Source source; private static final long serialVersionUID = 2843361810242481727L; public TelemetryEvent( TelemetryType telemetryType, Level level, Long timestamp, - String source, + Source source, Map body ) { type = telemetryType; @@ -39,7 +39,7 @@ public Map asJson() { Map values = new HashMap<>(); values.put("type", type.asJson()); values.put("level", level.asJson()); - values.put("source", source); + values.put("source", source.asJson()); values.put("timestamp_ms", timestamp); values.put("body", body); return values; diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java index 68cd2495..8af5f667 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/RollbarBase.java @@ -4,6 +4,7 @@ import com.rollbar.api.payload.Payload; import com.rollbar.api.payload.data.Data; import com.rollbar.api.payload.data.Level; +import com.rollbar.api.payload.data.Source; import com.rollbar.api.payload.data.TelemetryEvent; import com.rollbar.api.payload.data.TelemetryType; import com.rollbar.api.payload.data.body.Body; @@ -340,12 +341,12 @@ private Body makeBody(ThrowableWrapper error, String description) { return bodyFactory.from(error, description, telemetryEvents); } - private String getSource() { + private Source getSource() { String platform = config.platform(); if ("android".equals(platform)) { - return "client"; + return Source.CLIENT; } else { - return "server"; + return Source.SERVER; } } } diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java index fca27128..8b60e3d2 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java @@ -1,6 +1,7 @@ package com.rollbar.notifier.telemetry; import com.rollbar.api.payload.data.Level; +import com.rollbar.api.payload.data.Source; import com.rollbar.api.payload.data.TelemetryEvent; import com.rollbar.api.payload.data.TelemetryType; import com.rollbar.notifier.provider.Provider; @@ -43,7 +44,7 @@ public List dump() { * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). * @param message the message sent for this event (e.g. "hello world"). */ - public void recordLogEventFor(Level level, String source, String message) { + public void recordLogEventFor(Level level, Source source, String message) { Map body = new HashMap<>(); body.put(LOG_KEY_MESSAGE, message); addEvent(new TelemetryEvent(TelemetryType.LOG, level, timestampProvider.provide(), source, body)); @@ -55,7 +56,7 @@ public void recordLogEventFor(Level level, String source, String message) { * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). * @param message the message sent for this event (e.g. "hello world"). */ - public void recordManualEventFor(Level level, String source, String message) { + public void recordManualEventFor(Level level, Source source, String message) { Map body = new HashMap<>(); body.put(LOG_KEY_MESSAGE, message); addEvent(new TelemetryEvent(TelemetryType.MANUAL, level, timestampProvider.provide(), source, body)); @@ -68,7 +69,7 @@ public void recordManualEventFor(Level level, String source, String message) { * @param from the starting point (e.g. "SettingView"). * @param to the destination point (e.g. "HomeView"). */ - public void recordNavigationEventFor(Level level, String source, String from, String to) { + public void recordNavigationEventFor(Level level, Source source, String from, String to) { Map body = new HashMap<>(); body.put(NAVIGATION_KEY_FROM, from); body.put(NAVIGATION_KEY_TO, to); @@ -83,7 +84,7 @@ public void recordNavigationEventFor(Level level, String source, String from, St * @param url the api url (e.g. "http://rollbar.com/test/api"). * @param statusCode the response status code (e.g. "404"). */ - public void recordNetworkEventFor(Level level, String source, String method, String url, String statusCode) { + public void recordNetworkEventFor(Level level, Source source, String method, String url, String statusCode) { Map body = new HashMap<>(); body.put(NETWORK_KEY_METHOD, method); body.put(NETWORK_KEY_URL, url); diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java index 03d0b4ed..5f63067e 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java @@ -1,14 +1,15 @@ package com.rollbar.notifier.telemetry; import com.rollbar.api.payload.data.Level; +import com.rollbar.api.payload.data.Source; import com.rollbar.api.payload.data.TelemetryEvent; import java.util.List; public interface TelemetryEventTracker { List dump(); - void recordLogEventFor(Level level, String source, String message); - void recordManualEventFor(Level level, String source, String message); - void recordNavigationEventFor(Level level, String source, String from, String to); - void recordNetworkEventFor(Level level, String source, String method, String url, String statusCode); + void recordLogEventFor(Level level, Source source, String message); + void recordManualEventFor(Level level, Source source, String message); + void recordNavigationEventFor(Level level, Source source, String from, String to); + void recordNetworkEventFor(Level level, Source source, String method, String url, String statusCode); } diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/RollbarBaseTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/RollbarBaseTest.java index cfae37b6..1d1465fc 100644 --- a/rollbar-java/src/test/java/com/rollbar/notifier/RollbarBaseTest.java +++ b/rollbar-java/src/test/java/com/rollbar/notifier/RollbarBaseTest.java @@ -6,6 +6,7 @@ import com.rollbar.api.payload.Payload; import com.rollbar.api.payload.data.Level; +import com.rollbar.api.payload.data.Source; import com.rollbar.notifier.config.Config; import com.rollbar.notifier.telemetry.TelemetryEventTracker; import com.rollbar.notifier.util.BodyFactory; @@ -35,7 +36,7 @@ public void shouldRecordALogEventWithServerSourceWhenThePlatformIsNotAndroid() { sut.recordLogEventFor(level, message); - verify(telemetryEventTracker).recordLogEventFor(level, "server", message); + verify(telemetryEventTracker).recordLogEventFor(level, Source.SERVER, message); } @Test @@ -45,7 +46,7 @@ public void shouldRecordALogEventWithClientSourceWhenThePlatformIsAndroid() { sut.recordLogEventFor(level, message); - verify(telemetryEventTracker).recordLogEventFor(level, "client", message); + verify(telemetryEventTracker).recordLogEventFor(level, Source.CLIENT, message); } @Test @@ -55,7 +56,7 @@ public void shouldRecordAManualEventWithServerSourceWhenThePlatformIsNotAndroid( sut.recordManualEventFor(level, message); - verify(telemetryEventTracker).recordManualEventFor(level, "server", message); + verify(telemetryEventTracker).recordManualEventFor(level, Source.SERVER, message); } @Test @@ -65,7 +66,7 @@ public void shouldRecordAManualEventWithClientSourceWhenThePlatformIsAndroid() { sut.recordManualEventFor(level, message); - verify(telemetryEventTracker).recordManualEventFor(level, "client", message); + verify(telemetryEventTracker).recordManualEventFor(level, Source.CLIENT, message); } @Test @@ -77,7 +78,7 @@ public void shouldRecordANetworkEventWithServerSourceWhenThePlatformIsNotAndroid sut.recordNetworkEventFor(level, method, url, statusCode); - verify(telemetryEventTracker).recordNetworkEventFor(level, "server", method, url, statusCode); + verify(telemetryEventTracker).recordNetworkEventFor(level, Source.SERVER, method, url, statusCode); } @Test @@ -89,7 +90,7 @@ public void shouldRecordANetworkEventWithClientSourceWhenThePlatformIsAndroid() sut.recordNetworkEventFor(level, method, url, statusCode); - verify(telemetryEventTracker).recordNetworkEventFor(level, "client", method, url, statusCode); + verify(telemetryEventTracker).recordNetworkEventFor(level, Source.CLIENT, method, url, statusCode); } @Test @@ -100,7 +101,7 @@ public void shouldRecordANavigationEventWithServerSourceWhenThePlatformIsNotAndr sut.recordNavigationEventFor(level, from, to); - verify(telemetryEventTracker).recordNavigationEventFor(level, "server", from, to); + verify(telemetryEventTracker).recordNavigationEventFor(level, Source.SERVER, from, to); } @Test @@ -111,7 +112,7 @@ public void shouldRecordANavigationEventWithClientSourceWhenThePlatformIsAndroid sut.recordNavigationEventFor(level, from, to); - verify(telemetryEventTracker).recordNavigationEventFor(level, "client", from, to); + verify(telemetryEventTracker).recordNavigationEventFor(level, Source.CLIENT, from, to); } private Config getConfigWith(String platform) { diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java index 8b90f852..37d93670 100644 --- a/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java +++ b/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java @@ -4,6 +4,7 @@ import static org.junit.Assert.*; import com.rollbar.api.payload.data.Level; +import com.rollbar.api.payload.data.Source; import com.rollbar.api.payload.data.TelemetryEvent; import com.rollbar.api.payload.data.TelemetryType; import com.rollbar.notifier.provider.timestamp.TimestampProvider; @@ -16,7 +17,7 @@ public class RollbarTelemetryEventTrackerTest { - private static final String SOURCE = "Any source"; + private static final Source SOURCE = Source.SERVER; private static final String MESSAGE = "Any message"; private static final String FROM = "Any origin"; private static final String TO = "Any destination"; @@ -138,7 +139,7 @@ private Map getExpectedJsonForANetworkTelemetryEvent() { private Map commonFields() { Map map = new HashMap<>(); map.put("level", LEVEL.asJson()); - map.put("source", SOURCE); + map.put("source", SOURCE.asJson()); map.put("timestamp_ms", TIMESTAMP); return map; } From 7477b4149fed7b89f83b60eec4dfc49ca1ac8ecd Mon Sep 17 00:00:00 2001 From: chris Date: Thu, 15 Aug 2024 23:41:46 -0300 Subject: [PATCH 15/34] refactor: docs --- .../com/rollbar/api/payload/data/Source.java | 11 +++++ .../RollbarTelemetryEventTracker.java | 27 ------------- .../telemetry/TelemetryEventTracker.java | 40 +++++++++++++++++++ 3 files changed, 51 insertions(+), 27 deletions(-) diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/Source.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/Source.java index 9cde0a21..58048168 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/Source.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/Source.java @@ -2,8 +2,19 @@ import com.rollbar.api.json.JsonSerializable; +/** + * The Source of a payload. + */ public enum Source implements JsonSerializable { + + /** + * A Client source (e.g. Android) + */ CLIENT("client"), + + /** + * A Server source (e.g. Spring) + */ SERVER("server"); private final String jsonName; diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java index 8b60e3d2..44ddaeb3 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java @@ -38,37 +38,18 @@ public List dump() { return events; } - /** - * Record log telemetry event. ({@link TelemetryType#LOG}). - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param message the message sent for this event (e.g. "hello world"). - */ public void recordLogEventFor(Level level, Source source, String message) { Map body = new HashMap<>(); body.put(LOG_KEY_MESSAGE, message); addEvent(new TelemetryEvent(TelemetryType.LOG, level, timestampProvider.provide(), source, body)); } - /** - * Record manual telemetry event. ({@link TelemetryType#MANUAL}) . - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param message the message sent for this event (e.g. "hello world"). - */ public void recordManualEventFor(Level level, Source source, String message) { Map body = new HashMap<>(); body.put(LOG_KEY_MESSAGE, message); addEvent(new TelemetryEvent(TelemetryType.MANUAL, level, timestampProvider.provide(), source, body)); } - /** - * Record navigation telemetry event with from (origin) and to (destination).({@link TelemetryType#NAVIGATION}) . - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param from the starting point (e.g. "SettingView"). - * @param to the destination point (e.g. "HomeView"). - */ public void recordNavigationEventFor(Level level, Source source, String from, String to) { Map body = new HashMap<>(); body.put(NAVIGATION_KEY_FROM, from); @@ -76,14 +57,6 @@ public void recordNavigationEventFor(Level level, Source source, String from, St addEvent(new TelemetryEvent(TelemetryType.NAVIGATION, level, timestampProvider.provide(), source, body)); } - /** - * Record network telemetry event with method, url, and status code.({@link TelemetryType#NETWORK}). - * - * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). - * @param method the verb used (e.g. "POST"). - * @param url the api url (e.g. "http://rollbar.com/test/api"). - * @param statusCode the response status code (e.g. "404"). - */ public void recordNetworkEventFor(Level level, Source source, String method, String url, String statusCode) { Map body = new HashMap<>(); body.put(NETWORK_KEY_METHOD, method); diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java index 5f63067e..685e393c 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java @@ -3,13 +3,53 @@ import com.rollbar.api.payload.data.Level; import com.rollbar.api.payload.data.Source; import com.rollbar.api.payload.data.TelemetryEvent; +import com.rollbar.api.payload.data.TelemetryType; import java.util.List; public interface TelemetryEventTracker { + + /** + * Dump all the events recorded + */ List dump(); + + /** + * Record log telemetry event. ({@link TelemetryType#LOG}). + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param source the {@link Source} this event is recorded from (e.g. {@link Source#CLIENT}). + * @param message the message sent for this event (e.g. "hello world"). + */ void recordLogEventFor(Level level, Source source, String message); + + /** + * Record manual telemetry event. ({@link TelemetryType#MANUAL}) . + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param source the {@link Source} this event is recorded from (e.g. {@link Source#CLIENT}). + * @param message the message sent for this event (e.g. "hello world"). + */ void recordManualEventFor(Level level, Source source, String message); + + /** + * Record navigation telemetry event with from (origin) and to (destination).({@link TelemetryType#NAVIGATION}) . + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param source the {@link Source} this event is recorded from (e.g. {@link Source#CLIENT}). + * @param from the starting point (e.g. "SettingView"). + * @param to the destination point (e.g. "HomeView"). + */ void recordNavigationEventFor(Level level, Source source, String from, String to); + + /** + * Record network telemetry event with method, url, and status code.({@link TelemetryType#NETWORK}). + * + * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). + * @param source the {@link Source} this event is recorded from (e.g. {@link Source#CLIENT}). + * @param method the verb used (e.g. "POST"). + * @param url the api url (e.g. "http://rollbar.com/test/api"). + * @param statusCode the response status code (e.g. "404"). + */ void recordNetworkEventFor(Level level, Source source, String method, String url, String statusCode); } From 19051b7d5966a3852d30a9b7f38931ad2ffcf385 Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 16 Aug 2024 00:15:40 -0300 Subject: [PATCH 16/34] fix: test --- .../rollbar/api/payload/data/TelemetryEventTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java b/rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java index c7a69db9..525ea574 100644 --- a/rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java +++ b/rollbar-api/src/test/java/com/rollbar/api/payload/data/TelemetryEventTest.java @@ -78,8 +78,8 @@ public void shouldNotBeEqualIfTheyHaveDifferentTimestamp() { @Test public void shouldNotBeEqualIfTheyHaveDifferentSource() { - TelemetryEvent clientEvent = builder.setSource("client").build(); - TelemetryEvent serverEvent = builder.setSource("server").build(); + TelemetryEvent clientEvent = builder.setSource(Source.CLIENT).build(); + TelemetryEvent serverEvent = builder.setSource(Source.SERVER).build(); boolean equality = clientEvent.equals(serverEvent); @@ -125,7 +125,7 @@ public void shouldReturnAJsonRepresentation() { HashMap expected = new HashMap<>(); expected.put("type", "log"); expected.put("level", "debug"); - expected.put("source", TelemetryEventBuilder.DEFAULT_SOURCE); + expected.put("source", TelemetryEventBuilder.DEFAULT_SOURCE.asJson()); expected.put("timestamp_ms", TelemetryEventBuilder.DEFAULT_TIMESTAMP); expected.put("body", defaultBody); TelemetryEvent telemetryEvent1 = builder.setBody(defaultBody).build(); @@ -173,11 +173,11 @@ private HashMap makeBody() { class TelemetryEventBuilder { public static long DEFAULT_TIMESTAMP = 10L; - public static String DEFAULT_SOURCE = "client"; + public static Source DEFAULT_SOURCE = Source.CLIENT; private long timestamp = DEFAULT_TIMESTAMP; private TelemetryType telemetryType = TelemetryType.LOG; private Level level = Level.DEBUG; - private String source = DEFAULT_SOURCE; + private Source source = DEFAULT_SOURCE; HashMap body = new HashMap<>(); TelemetryEventBuilder setTelemetryType(TelemetryType telemetryType) { @@ -195,7 +195,7 @@ TelemetryEventBuilder setTimestamp(long timestamp) { return this; } - TelemetryEventBuilder setSource(String source) { + TelemetryEventBuilder setSource(Source source) { this.source = source; return this; } From 130968267367cd4936a5fd547ef9c44dd817654e Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 16 Aug 2024 00:39:47 -0300 Subject: [PATCH 17/34] fix: checkstyle --- .../com/rollbar/api/payload/data/TelemetryEvent.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java index 5af18569..8cd95197 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java @@ -20,6 +20,15 @@ public class TelemetryEvent implements JsonSerializable, StringTruncatable Date: Fri, 16 Aug 2024 00:47:17 -0300 Subject: [PATCH 18/34] fix: checkstyle --- .../api/payload/data/TelemetryEvent.java | 28 +++++++++++-------- .../rollbar/api/payload/data/body/Body.java | 13 +++++++-- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java index 8cd95197..37209f64 100644 --- a/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java +++ b/rollbar-api/src/main/java/com/rollbar/api/payload/data/TelemetryEvent.java @@ -21,7 +21,7 @@ public class TelemetryEvent implements JsonSerializable, StringTruncatablehttp://rollbar.com/test/api"). + * @param url the api url (e.g. " + * http://rollbar.com/test/api"). * @param statusCode the response status code (e.g. "404"). */ public void recordNetworkEventFor(Level level, String method, String url, String statusCode) { diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java index 07ff487d..cbf9fd1e 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java @@ -91,11 +91,11 @@ public class ConfigBuilder { private TelemetryEventTracker telemetryEventTracker; - private final static int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; + private static final int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; - private final static int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; + private static final int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; - private final static int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; + private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; /** * Constructor with an access token. @@ -552,7 +552,8 @@ public Config build() { } if (telemetryEventTracker == null) { - telemetryEventTracker = new RollbarTelemetryEventTracker(new TimestampProvider(), maximumTelemetryData); + telemetryEventTracker = + new RollbarTelemetryEventTracker(new TimestampProvider(), maximumTelemetryData); } return new ConfigImpl(this); diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java index 44ddaeb3..8adf6eb1 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java @@ -13,6 +13,9 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; +/** + * Default {@link TelemetryEventTracker}. + */ public class RollbarTelemetryEventTracker implements TelemetryEventTracker { private final int maximumTelemetryData; private final Queue telemetryEvents = new ConcurrentLinkedQueue<>(); @@ -24,6 +27,12 @@ public class RollbarTelemetryEventTracker implements TelemetryEventTracker { private static final String NETWORK_KEY_URL = "url"; private static final String NETWORK_KEY_STATUS_CODE = "status_code"; + /** + * Construct a {@link RollbarTelemetryEventTracker}. + * + * @param timestampProvider A Provider of timestamps for the events + * @param maximumTelemetryData Maximum number of accumulated events + */ public RollbarTelemetryEventTracker( Provider timestampProvider, int maximumTelemetryData @@ -32,37 +41,48 @@ public RollbarTelemetryEventTracker( this.maximumTelemetryData = maximumTelemetryData; } + @Override public List dump() { List events = new ArrayList<>(telemetryEvents); telemetryEvents.clear(); return events; } + @Override public void recordLogEventFor(Level level, Source source, String message) { Map body = new HashMap<>(); body.put(LOG_KEY_MESSAGE, message); - addEvent(new TelemetryEvent(TelemetryType.LOG, level, timestampProvider.provide(), source, body)); + addEvent(new TelemetryEvent(TelemetryType.LOG, level, getTimestamp(), source, body)); } + @Override public void recordManualEventFor(Level level, Source source, String message) { Map body = new HashMap<>(); body.put(LOG_KEY_MESSAGE, message); - addEvent(new TelemetryEvent(TelemetryType.MANUAL, level, timestampProvider.provide(), source, body)); + addEvent(new TelemetryEvent(TelemetryType.MANUAL, level, getTimestamp(), source, body)); } + @Override public void recordNavigationEventFor(Level level, Source source, String from, String to) { Map body = new HashMap<>(); body.put(NAVIGATION_KEY_FROM, from); body.put(NAVIGATION_KEY_TO, to); - addEvent(new TelemetryEvent(TelemetryType.NAVIGATION, level, timestampProvider.provide(), source, body)); + addEvent(new TelemetryEvent(TelemetryType.NAVIGATION, level, getTimestamp(), source, body)); } - public void recordNetworkEventFor(Level level, Source source, String method, String url, String statusCode) { + @Override + public void recordNetworkEventFor( + Level level, + Source source, + String method, + String url, + String statusCode + ) { Map body = new HashMap<>(); body.put(NETWORK_KEY_METHOD, method); body.put(NETWORK_KEY_URL, url); body.put(NETWORK_KEY_STATUS_CODE, statusCode); - addEvent(new TelemetryEvent(TelemetryType.NETWORK, level, timestampProvider.provide(), source, body)); + addEvent(new TelemetryEvent(TelemetryType.NETWORK, level, getTimestamp(), source, body)); } private void addEvent(TelemetryEvent telemetryEvent) { @@ -71,4 +91,8 @@ private void addEvent(TelemetryEvent telemetryEvent) { } telemetryEvents.add(telemetryEvent); } + + private long getTimestamp() { + return timestampProvider.provide(); + } } diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java index 685e393c..7458d7bf 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java @@ -10,7 +10,7 @@ public interface TelemetryEventTracker { /** - * Dump all the events recorded + * Dump all the events recorded. */ List dump(); @@ -33,7 +33,8 @@ public interface TelemetryEventTracker { void recordManualEventFor(Level level, Source source, String message); /** - * Record navigation telemetry event with from (origin) and to (destination).({@link TelemetryType#NAVIGATION}) . + * Record navigation telemetry event with from (origin) and to (destination). + * ({@link TelemetryType#NAVIGATION}). * * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). * @param source the {@link Source} this event is recorded from (e.g. {@link Source#CLIENT}). @@ -43,12 +44,14 @@ public interface TelemetryEventTracker { void recordNavigationEventFor(Level level, Source source, String from, String to); /** - * Record network telemetry event with method, url, and status code.({@link TelemetryType#NETWORK}). + * Record network telemetry event with method, url, and status code. + * ({@link TelemetryType#NETWORK}). * * @param level the TelemetryEvent severity (e.g. {@link Level#DEBUG}). * @param source the {@link Source} this event is recorded from (e.g. {@link Source#CLIENT}). * @param method the verb used (e.g. "POST"). - * @param url the api url (e.g. "http://rollbar.com/test/api"). + * @param url the api url (e.g. " + * http://rollbar.com/test/api"). * @param statusCode the response status code (e.g. "404"). */ void recordNetworkEventFor(Level level, Source source, String method, String url, String statusCode); diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/util/BodyFactory.java b/rollbar-java/src/main/java/com/rollbar/notifier/util/BodyFactory.java index 1ad62f8c..50a847c0 100755 --- a/rollbar-java/src/main/java/com/rollbar/notifier/util/BodyFactory.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/util/BodyFactory.java @@ -11,6 +11,7 @@ import com.rollbar.jvmti.ThrowableCache; import com.rollbar.notifier.wrapper.RollbarThrowableWrapper; import com.rollbar.notifier.wrapper.ThrowableWrapper; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -23,11 +24,10 @@ public class BodyFactory { /** * Builds the body for the throwable and description supplied. * - * @param throwable the throwable. + * @param throwable the throwable. * @param description the description. * @return the body. - * - * @deprecated Replaced by {@link #from(ThrowableWrapper, String)}. + * @deprecated Replaced by {@link #from(ThrowableWrapper, String)}. */ @Deprecated public Body from(Throwable throwable, String description) { @@ -42,7 +42,7 @@ public Body from(Throwable throwable, String description) { * supplied. * * @param throwableWrapper the throwable proxy. - * @param description the description. + * @param description the description. * @return the body. */ public Body from(ThrowableWrapper throwableWrapper, String description) { @@ -55,11 +55,15 @@ public Body from(ThrowableWrapper throwableWrapper, String description) { * supplied and telemetry events. * * @param throwableWrapper the throwable proxy. - * @param description the description. - * @param telemetryEvents the telemetry events. + * @param description the description. + * @param telemetryEvents the telemetry events. * @return the body. */ - public Body from(ThrowableWrapper throwableWrapper, String description, List telemetryEvents) { + public Body from( + ThrowableWrapper throwableWrapper, + String description, + List telemetryEvents + ) { Body.Builder builder = new Body.Builder().telemetryEvents(telemetryEvents); return from(throwableWrapper, description, builder); } From ec3ebb527ea6a942e3641c330481815c25a4095a Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 16 Aug 2024 01:16:47 -0300 Subject: [PATCH 20/34] fix: checkstyle --- .../rollbar/notifier/telemetry/TelemetryEventTracker.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java index 7458d7bf..a5bbc16d 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/TelemetryEventTracker.java @@ -54,5 +54,11 @@ public interface TelemetryEventTracker { * http://rollbar.com/test/api"). * @param statusCode the response status code (e.g. "404"). */ - void recordNetworkEventFor(Level level, Source source, String method, String url, String statusCode); + void recordNetworkEventFor( + Level level, + Source source, + String method, + String url, + String statusCode + ); } From c8fe4dc847c77005d4211dca0fe4514812cbfe93 Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 20 Sep 2024 17:38:03 -0300 Subject: [PATCH 21/34] fix: add revapi acceptedBreaks --- .palantir/revapi.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.palantir/revapi.yml b/.palantir/revapi.yml index d16694e0..1c1ab03c 100644 --- a/.palantir/revapi.yml +++ b/.palantir/revapi.yml @@ -25,3 +25,11 @@ acceptedBreaks: justification: "This is a binary compatible change, which could only break custom\ \ implementations of our config interfaces, but those interfaces are not meant\ \ to be implemented by users" + "2.0.0": + com.rollbar:rollbar-java: + - code: "java.method.addedToInterface" + new: "method com.rollbar.notifier.telemetry.TelemetryEventTracker com.rollbar.notifier.config.CommonConfig::telemetryEventTracker()" + justification: "This is going to be added in a major version" + - code: "java.method.addedToInterface" + new: "method int com.rollbar.notifier.config.CommonConfig::maximumTelemetryData()" + justification: "This is going to be added in a major version" From e36cd502b428c0fb2862c3338054746bcc8d667c Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 20 Sep 2024 17:58:24 -0300 Subject: [PATCH 22/34] fix: checkstyles --- .../reactivestreams/notifier/config/ConfigBuilder.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java index 99cb9c97..9e5dfc25 100644 --- a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java +++ b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java @@ -63,9 +63,9 @@ public final class ConfigBuilder { private boolean truncateLargePayloads; private int maximumTelemetryData = DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS; private TelemetryEventTracker telemetryEventTracker; - private final static int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; - private final static int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; - private final static int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; + private static final int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; + private static final int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; + private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; /** * Constructor with an access token. @@ -540,7 +540,8 @@ public Config build() { } if (telemetryEventTracker == null) { - telemetryEventTracker = new RollbarTelemetryEventTracker(new TimestampProvider(), maximumTelemetryData); + telemetryEventTracker = + new RollbarTelemetryEventTracker(new TimestampProvider(), maximumTelemetryData); } return new ConfigImpl(this); From 630f3af2f84fd398b834ed2b533ea719463a1912 Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 20 Sep 2024 20:26:24 -0300 Subject: [PATCH 23/34] fix(ci): set expected release configuration --- .github/workflows/ci.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 582e95a3..76b8acfc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -105,4 +105,13 @@ jobs: NEXUS_USERNAME: ${{ secrets.NEXUS_USERNAME }} NEXUS_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} run: | - ./gradlew -Dorg.gradle.internal.http.socketTimeout=300000 -Dorg.gradle.internal.http.connectionTimeout=300000 publishToSonatype + if test "$GITHUB_REPOSITORY" = "rollbar/rollbar-java" -a "$GITHUB_BASE_REF" = ""; then + openssl enc -aes-256-cbc -K "$SECRING_GPG_KEY" -iv "$SECRING_GPG_IV" -in "$ENCRYPTED_GPG_KEY_LOCATION" -out "$GPG_KEY_LOCATION" -d + fi && + source ~/.jdk7_home && + ./.github/release.sh + + - name: Cleanup Gradle cache + run: | + rm -f ~/.gradle/caches/modules-2/modules-2.lock + rm -f ~/.gradle/caches/modules-2/gc.properties From b0923c56d60fd3f460fa8f53d357b1d9e5c1b46f Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 20 Sep 2024 20:33:09 -0300 Subject: [PATCH 24/34] fix(ci): remove jdk7 condition --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 76b8acfc..ddeddc41 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,7 +108,6 @@ jobs: if test "$GITHUB_REPOSITORY" = "rollbar/rollbar-java" -a "$GITHUB_BASE_REF" = ""; then openssl enc -aes-256-cbc -K "$SECRING_GPG_KEY" -iv "$SECRING_GPG_IV" -in "$ENCRYPTED_GPG_KEY_LOCATION" -out "$GPG_KEY_LOCATION" -d fi && - source ~/.jdk7_home && ./.github/release.sh - name: Cleanup Gradle cache From 0dd3b31846ed06f418c544db4ab52124d3bf12dd Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 20 Sep 2024 20:45:28 -0300 Subject: [PATCH 25/34] fix(ci): set release.sh new folder --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ddeddc41..e1f1d7fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,7 +108,7 @@ jobs: if test "$GITHUB_REPOSITORY" = "rollbar/rollbar-java" -a "$GITHUB_BASE_REF" = ""; then openssl enc -aes-256-cbc -K "$SECRING_GPG_KEY" -iv "$SECRING_GPG_IV" -in "$ENCRYPTED_GPG_KEY_LOCATION" -out "$GPG_KEY_LOCATION" -d fi && - ./.github/release.sh + ./.github/scripts/release.sh - name: Cleanup Gradle cache run: | From 72345bf8640f2b0e34468c41644cdc47915dc848 Mon Sep 17 00:00:00 2001 From: chris Date: Wed, 25 Sep 2024 18:59:15 -0300 Subject: [PATCH 26/34] fix(ci): suggested change --- .github/workflows/ci.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e1f1d7fb..85459fbf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -105,12 +105,4 @@ jobs: NEXUS_USERNAME: ${{ secrets.NEXUS_USERNAME }} NEXUS_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} run: | - if test "$GITHUB_REPOSITORY" = "rollbar/rollbar-java" -a "$GITHUB_BASE_REF" = ""; then - openssl enc -aes-256-cbc -K "$SECRING_GPG_KEY" -iv "$SECRING_GPG_IV" -in "$ENCRYPTED_GPG_KEY_LOCATION" -out "$GPG_KEY_LOCATION" -d - fi && ./.github/scripts/release.sh - - - name: Cleanup Gradle cache - run: | - rm -f ~/.gradle/caches/modules-2/modules-2.lock - rm -f ~/.gradle/caches/modules-2/gc.properties From 52ae70739da89d0883fe4244f3f5713e5315b1c4 Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 29 Sep 2024 16:04:31 -0300 Subject: [PATCH 27/34] refactor(telemetry): move coerce in logic to RollbarTelemetryEventTracker --- .../RollbarTelemetryEventTracker.java | 12 ++++- .../notifier/config/ConfigBuilderTest.java | 28 ---------- .../RollbarTelemetryEventTrackerTest.java | 51 +++++++++++++++++-- .../notifier/config/ConfigBuilder.java | 18 ++----- 4 files changed, 60 insertions(+), 49 deletions(-) diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java index 8adf6eb1..b9c9b41f 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java @@ -26,19 +26,27 @@ public class RollbarTelemetryEventTracker implements TelemetryEventTracker { private static final String NETWORK_KEY_METHOD = "method"; private static final String NETWORK_KEY_URL = "url"; private static final String NETWORK_KEY_STATUS_CODE = "status_code"; + private static final int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; + private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; /** * Construct a {@link RollbarTelemetryEventTracker}. * * @param timestampProvider A Provider of timestamps for the events - * @param maximumTelemetryData Maximum number of accumulated events + * @param maximumTelemetryData Maximum number of accumulated events (This value can be between 1 and 50, exceed any of + * these thresholds and the closest will be taken) */ public RollbarTelemetryEventTracker( Provider timestampProvider, int maximumTelemetryData ) { + if (maximumTelemetryData < MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS) { + this.maximumTelemetryData = MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; + } else { + this.maximumTelemetryData = + Math.min(maximumTelemetryData, MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS); + } this.timestampProvider = timestampProvider; - this.maximumTelemetryData = maximumTelemetryData; } @Override diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java index e78544dc..a23aca01 100644 --- a/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java +++ b/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java @@ -45,10 +45,6 @@ public class ConfigBuilderTest { private static final int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; - private static final int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; - - private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; - @Rule public MockitoRule rule = MockitoJUnit.rule(); @@ -208,28 +204,4 @@ public void shouldBuildWithConfig() { assertThat(config.isEnabled(), is(copy.isEnabled())); assertThat(config.maximumTelemetryData(), is(maximumTelemetryData)); } - - @Test - public void shouldSetTheMaximumTelemetryDataLimitedToItsLowerLimit() { - int maximumTelemetryData = MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS - 1; - - Config config = ConfigBuilder - .withAccessToken(ACCESS_TOKEN) - .maximumTelemetryData(maximumTelemetryData) - .build(); - - assertThat(config.maximumTelemetryData(), is(MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS)); - } - - @Test - public void shouldSetTheMaximumTelemetryDataLimitedToItsUpperLimit() { - int maximumTelemetryData = MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS + 1; - - Config config = ConfigBuilder - .withAccessToken(ACCESS_TOKEN) - .maximumTelemetryData(maximumTelemetryData) - .build(); - - assertThat(config.maximumTelemetryData(), is(MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS)); - } } \ No newline at end of file diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java index 37d93670..120fc064 100644 --- a/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java +++ b/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java @@ -1,7 +1,7 @@ package com.rollbar.notifier.telemetry; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.*; +import static org.hamcrest.MatcherAssert.assertThat; import com.rollbar.api.payload.data.Level; import com.rollbar.api.payload.data.Source; @@ -28,10 +28,9 @@ public class RollbarTelemetryEventTrackerTest { private static final int MAXIMUM_TELEMETRY_DATA = 2; private static final long TIMESTAMP = 10L; private final TimestampProvider fakeTimestampProvider = new TimestampProviderFake(); - private final RollbarTelemetryEventTracker telemetryEventTracker = new RollbarTelemetryEventTracker( - fakeTimestampProvider, - MAXIMUM_TELEMETRY_DATA - ); + private final TelemetryEventTracker telemetryEventTracker = newEventTracker(MAXIMUM_TELEMETRY_DATA); + private static final int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; + private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; @Test public void shouldDiscardOldestEventsWhenMaxCapacityIsReached() { @@ -81,6 +80,48 @@ public void shouldTrackANetworkEvent() { assertThat(getTrackedEventAsJson(), is(expectedJson)); } + @Test + public void shouldSetTheMaximumTelemetryDataLimitedToItsLowerLimit() { + TelemetryEventTracker telemetryEventTracker = newEventTracker(MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS - 1); + + List telemetryEvents = record70EventsAndDump(telemetryEventTracker); + + assertThat(telemetryEvents.size(), is(MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS)); + } + + @Test + public void shouldSetTheMaximumTelemetryDataLimitedToItsUpperLimit() { + TelemetryEventTracker telemetryEventTracker = newEventTracker(MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS + 1); + + List telemetryEvents = record70EventsAndDump(telemetryEventTracker); + + assertThat(telemetryEvents.size(), is(MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS)); + } + + @Test + public void shouldSetTheMaximumTelemetryDataLimitedToAValueBetweenBounds() { + int maximumTelemetryEvents = 20; + TelemetryEventTracker telemetryEventTracker = newEventTracker(maximumTelemetryEvents); + + List telemetryEvents = record70EventsAndDump(telemetryEventTracker); + + assertThat(telemetryEvents.size(), is(maximumTelemetryEvents)); + } + + private TelemetryEventTracker newEventTracker(int maximumTelemetryData) { + return new RollbarTelemetryEventTracker( + fakeTimestampProvider, + maximumTelemetryData + ); + } + + private List record70EventsAndDump(TelemetryEventTracker telemetryEventTracker) { + for (int i = 0; i < 70; i++) { + telemetryEventTracker.recordManualEventFor(LEVEL, SOURCE, MESSAGE); + } + return telemetryEventTracker.dump(); + } + private Map getTrackedEventAsJson() { return getFirstEvent().asJson(); } diff --git a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java index 9e5dfc25..10961f51 100644 --- a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java +++ b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java @@ -63,9 +63,8 @@ public final class ConfigBuilder { private boolean truncateLargePayloads; private int maximumTelemetryData = DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS; private TelemetryEventTracker telemetryEventTracker; - private static final int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; private static final int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; - private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; + /** * Constructor with an access token. @@ -472,23 +471,14 @@ public ConfigBuilder truncateLargePayloads(boolean truncate) { /** *

- * Maximum Telemetry Events sent in a payload (This value can be between 1 and 50, exceed any of - * these thresholds and the closest will be taken). Default: 10. + * Maximum Telemetry Events sent in a payload (can be overwritten if the + * {@link TelemetryEventTracker} has thresholds like the {@link RollbarTelemetryEventTracker}). + * Default: 10. *

* @param maximumTelemetryData max quantity of telemetry events sent. * @return the builder instance. */ public ConfigBuilder maximumTelemetryData(int maximumTelemetryData) { - if (maximumTelemetryData < MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS) { - this.maximumTelemetryData = MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; - return this; - } - - if (maximumTelemetryData > MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS) { - this.maximumTelemetryData = MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; - return this; - } - this.maximumTelemetryData = maximumTelemetryData; return this; } From ba343f81746fe5ed93ada93aa9d53fdf3744e2ac Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 29 Sep 2024 16:06:53 -0300 Subject: [PATCH 28/34] refactor(telemetry): rename class --- .../{RollbarBaseTest.java => RollbarRecordTelemetryTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename rollbar-java/src/test/java/com/rollbar/notifier/{RollbarBaseTest.java => RollbarRecordTelemetryTest.java} (99%) diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/RollbarBaseTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/RollbarRecordTelemetryTest.java similarity index 99% rename from rollbar-java/src/test/java/com/rollbar/notifier/RollbarBaseTest.java rename to rollbar-java/src/test/java/com/rollbar/notifier/RollbarRecordTelemetryTest.java index 1d1465fc..e645fae3 100644 --- a/rollbar-java/src/test/java/com/rollbar/notifier/RollbarBaseTest.java +++ b/rollbar-java/src/test/java/com/rollbar/notifier/RollbarRecordTelemetryTest.java @@ -17,7 +17,7 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; -public class RollbarBaseTest { +public class RollbarRecordTelemetryTest { private final Level level = Level.DEBUG; @Rule From 566694067dc5df38a8912faec6a35c2febcb5fb0 Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 29 Sep 2024 16:28:21 -0300 Subject: [PATCH 29/34] fix(telemetry): checkstyle --- .../notifier/telemetry/RollbarTelemetryEventTracker.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java index b9c9b41f..eb1b710f 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java @@ -33,8 +33,9 @@ public class RollbarTelemetryEventTracker implements TelemetryEventTracker { * Construct a {@link RollbarTelemetryEventTracker}. * * @param timestampProvider A Provider of timestamps for the events - * @param maximumTelemetryData Maximum number of accumulated events (This value can be between 1 and 50, exceed any of - * these thresholds and the closest will be taken) + * @param maximumTelemetryData Maximum number of accumulated events (This value can be between 1 + * and 50, exceed any of these thresholds and the closest will be + * taken) */ public RollbarTelemetryEventTracker( Provider timestampProvider, From 5540c0815f629bda4db5269baec99105332d0551 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 1 Oct 2024 01:38:13 -0300 Subject: [PATCH 30/34] refactor(telemetry): modify Telemetry queue capacity --- .../RollbarTelemetryEventTracker.java | 30 ++++++++++++++----- .../RollbarTelemetryEventTrackerTest.java | 6 ++-- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java index eb1b710f..bfa0ad0d 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java @@ -26,23 +26,23 @@ public class RollbarTelemetryEventTracker implements TelemetryEventTracker { private static final String NETWORK_KEY_METHOD = "method"; private static final String NETWORK_KEY_URL = "url"; private static final String NETWORK_KEY_STATUS_CODE = "status_code"; - private static final int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; - private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; + private static final int NO_CAPACITY = 0; + private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 100; /** * Construct a {@link RollbarTelemetryEventTracker}. * * @param timestampProvider A Provider of timestamps for the events - * @param maximumTelemetryData Maximum number of accumulated events (This value can be between 1 - * and 50, exceed any of these thresholds and the closest will be + * @param maximumTelemetryData Maximum number of accumulated events (This value can be between 0 + * and 100, exceed any of these thresholds and the closest will be * taken) */ public RollbarTelemetryEventTracker( Provider timestampProvider, int maximumTelemetryData ) { - if (maximumTelemetryData < MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS) { - this.maximumTelemetryData = MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; + if (maximumTelemetryData < NO_CAPACITY) { + this.maximumTelemetryData = NO_CAPACITY; } else { this.maximumTelemetryData = Math.min(maximumTelemetryData, MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS); @@ -95,12 +95,26 @@ public void recordNetworkEventFor( } private void addEvent(TelemetryEvent telemetryEvent) { - if (telemetryEvents.size() >= maximumTelemetryData) { - telemetryEvents.poll(); + if (doNotRecordEvents()) return; + + if (maxCapacityReached()) { + removeOldestEvent(); } telemetryEvents.add(telemetryEvent); } + private boolean doNotRecordEvents() { + return maximumTelemetryData == NO_CAPACITY; + } + + private boolean maxCapacityReached() { + return telemetryEvents.size() >= maximumTelemetryData; + } + + private void removeOldestEvent() { + telemetryEvents.poll(); + } + private long getTimestamp() { return timestampProvider.provide(); } diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java index 120fc064..a0d4475f 100644 --- a/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java +++ b/rollbar-java/src/test/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTrackerTest.java @@ -29,8 +29,8 @@ public class RollbarTelemetryEventTrackerTest { private static final long TIMESTAMP = 10L; private final TimestampProvider fakeTimestampProvider = new TimestampProviderFake(); private final TelemetryEventTracker telemetryEventTracker = newEventTracker(MAXIMUM_TELEMETRY_DATA); - private static final int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; - private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; + private static final int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 0; + private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 100; @Test public void shouldDiscardOldestEventsWhenMaxCapacityIsReached() { @@ -116,7 +116,7 @@ private TelemetryEventTracker newEventTracker(int maximumTelemetryData) { } private List record70EventsAndDump(TelemetryEventTracker telemetryEventTracker) { - for (int i = 0; i < 70; i++) { + for (int i = 0; i < 120; i++) { telemetryEventTracker.recordManualEventFor(LEVEL, SOURCE, MESSAGE); } return telemetryEventTracker.dump(); From 9968f7ca5489d18a55b4d20614a765021ee4c204 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 1 Oct 2024 01:50:29 -0300 Subject: [PATCH 31/34] refactor(telemetry): modify Telemetry capacity default value --- .../notifier/config/ConfigBuilder.java | 23 ++++--------------- .../RollbarTelemetryEventTracker.java | 2 +- .../notifier/config/ConfigBuilderTest.java | 2 +- .../notifier/config/ConfigBuilder.java | 9 ++++---- 4 files changed, 10 insertions(+), 26 deletions(-) diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java index cbf9fd1e..519b1a78 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java @@ -87,16 +87,11 @@ public class ConfigBuilder { protected boolean truncateLargePayloads; - private int maximumTelemetryData = DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS; + private int maximumTelemetryData = + RollbarTelemetryEventTracker.MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; private TelemetryEventTracker telemetryEventTracker; - private static final int MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 1; - - private static final int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; - - private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 50; - /** * Constructor with an access token. */ @@ -487,23 +482,13 @@ public ConfigBuilder truncateLargePayloads(boolean truncate) { /** *

- * Maximum Telemetry Events sent in a payload (This value can be between 1 and 50, exceed any of - * these thresholds and the closest will be taken). Default: 10. + * Maximum Telemetry Events sent in a payload. Default is + * {@value RollbarTelemetryEventTracker#MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS}. *

* @param maximumTelemetryData max quantity of telemetry events sent. * @return the builder instance. */ public ConfigBuilder maximumTelemetryData(int maximumTelemetryData) { - if (maximumTelemetryData < MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS) { - this.maximumTelemetryData = MINIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; - return this; - } - - if (maximumTelemetryData > MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS) { - this.maximumTelemetryData = MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; - return this; - } - this.maximumTelemetryData = maximumTelemetryData; return this; } diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java index bfa0ad0d..4aaf053e 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java @@ -17,6 +17,7 @@ * Default {@link TelemetryEventTracker}. */ public class RollbarTelemetryEventTracker implements TelemetryEventTracker { + public static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 100; private final int maximumTelemetryData; private final Queue telemetryEvents = new ConcurrentLinkedQueue<>(); private final Provider timestampProvider; @@ -27,7 +28,6 @@ public class RollbarTelemetryEventTracker implements TelemetryEventTracker { private static final String NETWORK_KEY_URL = "url"; private static final String NETWORK_KEY_STATUS_CODE = "status_code"; private static final int NO_CAPACITY = 0; - private static final int MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS = 100; /** * Construct a {@link RollbarTelemetryEventTracker}. diff --git a/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java b/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java index a23aca01..b8199ee7 100644 --- a/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java +++ b/rollbar-java/src/test/java/com/rollbar/notifier/config/ConfigBuilderTest.java @@ -43,7 +43,7 @@ public class ConfigBuilderTest { static final String FRAMEWORK = "framework"; - private static final int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; + private static final int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 100; @Rule public MockitoRule rule = MockitoJUnit.rule(); diff --git a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java index 10961f51..8deeb153 100644 --- a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java +++ b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java @@ -61,9 +61,9 @@ public final class ConfigBuilder { private boolean enabled; private DefaultLevels defaultLevels; private boolean truncateLargePayloads; - private int maximumTelemetryData = DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS; + private int maximumTelemetryData = + RollbarTelemetryEventTracker.MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS; private TelemetryEventTracker telemetryEventTracker; - private static final int DEFAULT_CAPACITY_FOR_TELEMETRY_EVENTS = 10; /** @@ -471,9 +471,8 @@ public ConfigBuilder truncateLargePayloads(boolean truncate) { /** *

- * Maximum Telemetry Events sent in a payload (can be overwritten if the - * {@link TelemetryEventTracker} has thresholds like the {@link RollbarTelemetryEventTracker}). - * Default: 10. + * Maximum Telemetry Events sent in a payload. Default is + * {@value RollbarTelemetryEventTracker#MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS}. *

* @param maximumTelemetryData max quantity of telemetry events sent. * @return the builder instance. From 78b297400b4ea3d870246411d785f3f5aafaea52 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 1 Oct 2024 01:54:07 -0300 Subject: [PATCH 32/34] fix(telemetry): checkstyle --- .../notifier/telemetry/RollbarTelemetryEventTracker.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java index 4aaf053e..265f11db 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/telemetry/RollbarTelemetryEventTracker.java @@ -95,7 +95,9 @@ public void recordNetworkEventFor( } private void addEvent(TelemetryEvent telemetryEvent) { - if (doNotRecordEvents()) return; + if (doNotRecordEvents()) { + return; + } if (maxCapacityReached()) { removeOldestEvent(); From 92e45848a47082b13aa1440904906248a9d077e6 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 1 Oct 2024 21:29:13 -0300 Subject: [PATCH 33/34] docs(telemetry): fix ConfigBuilder.telemetryEventTracker javadoc --- .../main/java/com/rollbar/notifier/config/ConfigBuilder.java | 2 +- .../rollbar/reactivestreams/notifier/config/ConfigBuilder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java index 519b1a78..b21d1a2c 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java @@ -498,7 +498,7 @@ public ConfigBuilder maximumTelemetryData(int maximumTelemetryData) { * Set a {@link TelemetryEventTracker} implementation. * Default: {@link RollbarTelemetryEventTracker} with a {@link TimestampProvider}. *

- * @param telemetryEventTracker true to enable truncation. + * @param telemetryEventTracker the TelemetryEventTracker implementation. * @return the builder instance. */ public ConfigBuilder telemetryEventTracker(TelemetryEventTracker telemetryEventTracker) { diff --git a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java index 8deeb153..94b05644 100644 --- a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java +++ b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java @@ -487,7 +487,7 @@ public ConfigBuilder maximumTelemetryData(int maximumTelemetryData) { * Set a {@link TelemetryEventTracker} implementation. * Default: {@link RollbarTelemetryEventTracker} with a {@link TimestampProvider}. *

- * @param telemetryEventTracker true to enable truncation. + * @param telemetryEventTracker the TelemetryEventTracker implementation. * @return the builder instance. */ public ConfigBuilder telemetryEventTracker(TelemetryEventTracker telemetryEventTracker) { From 873bee3c45cb632019342324c6053f8793148bcf Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 1 Oct 2024 23:54:47 -0300 Subject: [PATCH 34/34] docs(telemetry): fix ConfigBuilder.maximumTelemetryData javadoc --- .../main/java/com/rollbar/notifier/config/ConfigBuilder.java | 3 ++- .../rollbar/reactivestreams/notifier/config/ConfigBuilder.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java index b21d1a2c..88f56b53 100644 --- a/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java +++ b/rollbar-java/src/main/java/com/rollbar/notifier/config/ConfigBuilder.java @@ -482,7 +482,8 @@ public ConfigBuilder truncateLargePayloads(boolean truncate) { /** *

- * Maximum Telemetry Events sent in a payload. Default is + * Maximum Telemetry events sent in a payload, only for the default TelemetryEventTracker, if + * a custom implementation is used this value will be ignored. Default is * {@value RollbarTelemetryEventTracker#MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS}. *

* @param maximumTelemetryData max quantity of telemetry events sent. diff --git a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java index 94b05644..48536116 100644 --- a/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java +++ b/rollbar-reactive-streams/src/main/java/com/rollbar/reactivestreams/notifier/config/ConfigBuilder.java @@ -471,7 +471,8 @@ public ConfigBuilder truncateLargePayloads(boolean truncate) { /** *

- * Maximum Telemetry Events sent in a payload. Default is + * Maximum Telemetry events sent in a payload, only for the default TelemetryEventTracker, if + * a custom implementation is used this value will be ignored. Default is * {@value RollbarTelemetryEventTracker#MAXIMUM_CAPACITY_FOR_TELEMETRY_EVENTS}. *

* @param maximumTelemetryData max quantity of telemetry events sent.