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.