From 5a44c4880a85ba3e5b7091bfb8bf489717c92e90 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 27 Sep 2022 16:18:03 +0200 Subject: [PATCH 01/23] Add custom measurements --- .../android/core/ActivityFramesTracker.java | 12 +++--- .../PerformanceAndroidEventProcessor.java | 5 ++- .../PerformanceAndroidEventProcessorTest.kt | 4 +- sentry/api/sentry.api | 27 +++++++++++++- sentry/src/main/java/io/sentry/ISpan.java | 23 ++++++++++++ sentry/src/main/java/io/sentry/NoOpSpan.java | 7 ++++ .../main/java/io/sentry/NoOpTransaction.java | 7 ++++ .../java/io/sentry/SentryMeasurementUnit.java | 37 +++++++++++++++++++ .../src/main/java/io/sentry/SentryTracer.java | 18 +++++++++ sentry/src/main/java/io/sentry/Span.java | 11 ++++++ .../io/sentry/protocol/MeasurementValue.java | 3 -- 11 files changed, 140 insertions(+), 14 deletions(-) create mode 100644 sentry/src/main/java/io/sentry/SentryMeasurementUnit.java diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java index d71cab5213c..46972447784 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java @@ -1,11 +1,10 @@ package io.sentry.android.core; -import static io.sentry.protocol.MeasurementValue.NONE_UNIT; - import android.app.Activity; import android.util.SparseIntArray; import androidx.core.app.FrameMetricsAggregator; import io.sentry.ILogger; +import io.sentry.SentryMeasurementUnit; import io.sentry.protocol.MeasurementValue; import io.sentry.protocol.SentryId; import java.util.HashMap; @@ -104,9 +103,12 @@ public synchronized void setMetrics( return; } - final MeasurementValue tfValues = new MeasurementValue(totalFrames, NONE_UNIT); - final MeasurementValue sfValues = new MeasurementValue(slowFrames, NONE_UNIT); - final MeasurementValue ffValues = new MeasurementValue(frozenFrames, NONE_UNIT); + final MeasurementValue tfValues = + new MeasurementValue(totalFrames, SentryMeasurementUnit.NONE.apiName()); + final MeasurementValue sfValues = + new MeasurementValue(slowFrames, SentryMeasurementUnit.NONE.apiName()); + final MeasurementValue ffValues = + new MeasurementValue(frozenFrames, SentryMeasurementUnit.NONE.apiName()); final Map measurements = new HashMap<>(); measurements.put("frames_total", tfValues); measurements.put("frames_slow", sfValues); diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java index a3fca88156e..9d5b4447536 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java @@ -3,11 +3,11 @@ import static io.sentry.android.core.ActivityLifecycleIntegration.APP_START_COLD; import static io.sentry.android.core.ActivityLifecycleIntegration.APP_START_WARM; import static io.sentry.android.core.ActivityLifecycleIntegration.UI_LOAD_OP; -import static io.sentry.protocol.MeasurementValue.MILLISECOND_UNIT; import io.sentry.EventProcessor; import io.sentry.Hint; import io.sentry.SentryEvent; +import io.sentry.SentryMeasurementUnit; import io.sentry.SpanContext; import io.sentry.protocol.MeasurementValue; import io.sentry.protocol.SentryId; @@ -67,7 +67,8 @@ public SentryEvent process(@NotNull SentryEvent event, @NotNull Hint hint) { // if appStartUpInterval is null, metrics are not ready to be sent if (appStartUpInterval != null) { final MeasurementValue value = - new MeasurementValue((float) appStartUpInterval, MILLISECOND_UNIT); + new MeasurementValue( + (float) appStartUpInterval, SentryMeasurementUnit.MILLISECOND.apiName()); final String appStartKey = AppStartState.getInstance().isColdStart() ? "app_start_cold" : "app_start_warm"; diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt index df595b6a356..99c197f1e01 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt @@ -5,12 +5,12 @@ import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever import io.sentry.Hint import io.sentry.IHub +import io.sentry.SentryMeasurementUnit import io.sentry.SentryTracer import io.sentry.TracesSamplingDecision import io.sentry.TransactionContext import io.sentry.android.core.ActivityLifecycleIntegration.UI_LOAD_OP import io.sentry.protocol.MeasurementValue -import io.sentry.protocol.MeasurementValue.MILLISECOND_UNIT import io.sentry.protocol.SentryTransaction import java.util.Date import kotlin.test.BeforeTest @@ -156,7 +156,7 @@ class PerformanceAndroidEventProcessorTest { val tracer = SentryTracer(context, fixture.hub) var tr = SentryTransaction(tracer) - val metrics = mapOf("frames_total" to MeasurementValue(1f, MILLISECOND_UNIT)) + val metrics = mapOf("frames_total" to MeasurementValue(1f, SentryMeasurementUnit.MILLISECOND.apiName())) whenever(fixture.activityFramesTracker.takeMetrics(any())).thenReturn(metrics) tr = sut.process(tr, Hint()) diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index a17ca1471c9..2f7a89269bc 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -483,6 +483,8 @@ public abstract interface class io/sentry/ISpan { public abstract fun isFinished ()Z public abstract fun setData (Ljava/lang/String;Ljava/lang/Object;)V public abstract fun setDescription (Ljava/lang/String;)V + public abstract fun setMeasurement (Ljava/lang/String;F)V + public abstract fun setMeasurement (Ljava/lang/String;FLio/sentry/SentryMeasurementUnit;)V public abstract fun setOperation (Ljava/lang/String;)V public abstract fun setStatus (Lio/sentry/SpanStatus;)V public abstract fun setTag (Ljava/lang/String;Ljava/lang/String;)V @@ -668,6 +670,8 @@ public final class io/sentry/NoOpSpan : io/sentry/ISpan { public fun isFinished ()Z public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V + public fun setMeasurement (Ljava/lang/String;F)V + public fun setMeasurement (Ljava/lang/String;FLio/sentry/SentryMeasurementUnit;)V public fun setOperation (Ljava/lang/String;)V public fun setStatus (Lio/sentry/SpanStatus;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V @@ -703,6 +707,8 @@ public final class io/sentry/NoOpTransaction : io/sentry/ITransaction { public fun scheduleFinish ()V public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V + public fun setMeasurement (Ljava/lang/String;F)V + public fun setMeasurement (Ljava/lang/String;FLio/sentry/SentryMeasurementUnit;)V public fun setName (Ljava/lang/String;)V public fun setName (Ljava/lang/String;Lio/sentry/protocol/TransactionNameSource;)V public fun setOperation (Ljava/lang/String;)V @@ -1268,6 +1274,21 @@ public final class io/sentry/SentryLevel : java/lang/Enum, io/sentry/JsonSeriali public static fun values ()[Lio/sentry/SentryLevel; } +public final class io/sentry/SentryMeasurementUnit : java/lang/Enum { + public static final field DAY Lio/sentry/SentryMeasurementUnit; + public static final field HOUR Lio/sentry/SentryMeasurementUnit; + public static final field MICROSECOND Lio/sentry/SentryMeasurementUnit; + public static final field MILLISECOND Lio/sentry/SentryMeasurementUnit; + public static final field MINUTE Lio/sentry/SentryMeasurementUnit; + public static final field NANOSECOND Lio/sentry/SentryMeasurementUnit; + public static final field NONE Lio/sentry/SentryMeasurementUnit; + public static final field SECOND Lio/sentry/SentryMeasurementUnit; + public static final field WEEK Lio/sentry/SentryMeasurementUnit; + public fun apiName ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryMeasurementUnit; + public static fun values ()[Lio/sentry/SentryMeasurementUnit; +} + public class io/sentry/SentryOptions { public fun ()V public fun addContextTag (Ljava/lang/String;)V @@ -1492,6 +1513,8 @@ public final class io/sentry/SentryTracer : io/sentry/ITransaction { public fun scheduleFinish ()V public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V + public fun setMeasurement (Ljava/lang/String;F)V + public fun setMeasurement (Ljava/lang/String;FLio/sentry/SentryMeasurementUnit;)V public fun setName (Ljava/lang/String;)V public fun setName (Ljava/lang/String;Lio/sentry/protocol/TransactionNameSource;)V public fun setOperation (Ljava/lang/String;)V @@ -1598,6 +1621,8 @@ public final class io/sentry/Span : io/sentry/ISpan { public fun isSampled ()Ljava/lang/Boolean; public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V + public fun setMeasurement (Ljava/lang/String;F)V + public fun setMeasurement (Ljava/lang/String;FLio/sentry/SentryMeasurementUnit;)V public fun setOperation (Ljava/lang/String;)V public fun setStatus (Lio/sentry/SpanStatus;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V @@ -2444,8 +2469,6 @@ public final class io/sentry/protocol/Gpu$JsonKeys { } public final class io/sentry/protocol/MeasurementValue : io/sentry/JsonSerializable, io/sentry/JsonUnknown { - public static final field MILLISECOND_UNIT Ljava/lang/String; - public static final field NONE_UNIT Ljava/lang/String; public fun (FLjava/lang/String;)V public fun (FLjava/lang/String;Ljava/util/Map;)V public fun getUnit ()Ljava/lang/String; diff --git a/sentry/src/main/java/io/sentry/ISpan.java b/sentry/src/main/java/io/sentry/ISpan.java index 537d72de022..3e250631b76 100644 --- a/sentry/src/main/java/io/sentry/ISpan.java +++ b/sentry/src/main/java/io/sentry/ISpan.java @@ -169,4 +169,27 @@ ISpan startChild( */ @Nullable Object getData(@NotNull String key); + + /** + * Set a measurement with NONE unit. + * + *

NOTE: Setting a measurement with the same name on the same transaction multiple times only + * keeps the last value. + * + * @param name the name of the measurement + * @param value the value of the measurement + */ + void setMeasurement(@NotNull String name, float value); + + /** + * Set a measurement with specific unit. + * + *

NOTE: Setting a measurement with the same name on the same transaction multiple times only + * keeps the last value. + * + * @param name the name of the measurement + * @param value the value of the measurement + * @param unit the unit the value is measured in + */ + void setMeasurement(@NotNull String name, float value, @NotNull SentryMeasurementUnit unit); } diff --git a/sentry/src/main/java/io/sentry/NoOpSpan.java b/sentry/src/main/java/io/sentry/NoOpSpan.java index 21294bf63f1..ab81a02d4da 100644 --- a/sentry/src/main/java/io/sentry/NoOpSpan.java +++ b/sentry/src/main/java/io/sentry/NoOpSpan.java @@ -111,4 +111,11 @@ public void setData(@NotNull String key, @NotNull Object value) {} public @Nullable Object getData(@NotNull String key) { return null; } + + @Override + public void setMeasurement(@NotNull String name, float value) {} + + @Override + public void setMeasurement( + @NotNull String name, float value, @NotNull SentryMeasurementUnit unit) {} } diff --git a/sentry/src/main/java/io/sentry/NoOpTransaction.java b/sentry/src/main/java/io/sentry/NoOpTransaction.java index ed5ac8bc727..8973e4ae81e 100644 --- a/sentry/src/main/java/io/sentry/NoOpTransaction.java +++ b/sentry/src/main/java/io/sentry/NoOpTransaction.java @@ -164,4 +164,11 @@ public void setData(@NotNull String key, @NotNull Object value) {} public @Nullable Object getData(@NotNull String key) { return null; } + + @Override + public void setMeasurement(@NotNull String name, float value) {} + + @Override + public void setMeasurement( + @NotNull String name, float value, @NotNull SentryMeasurementUnit unit) {} } diff --git a/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java b/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java new file mode 100644 index 00000000000..8a819f8ead8 --- /dev/null +++ b/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java @@ -0,0 +1,37 @@ +package io.sentry; + +import java.util.Locale; +import org.jetbrains.annotations.NotNull; + +public enum SentryMeasurementUnit { + /** Nanosecond (`"nanosecond"`), 10^-9 seconds. */ + NANOSECOND, + + /** Microsecond (`"microsecond"`), 10^-6 seconds. */ + MICROSECOND, + + /** Millisecond (`"millisecond"`), 10^-3 seconds. */ + MILLISECOND, + + /** Full second (`"second"`). */ + SECOND, + + /** Minute (`"minute"`), 60 seconds. */ + MINUTE, + + /** Hour (`"hour"`), 3600 seconds. */ + HOUR, + + /** Day (`"day"`), 86,400 seconds. */ + DAY, + + /** Week (`"week"`), 604,800 seconds. */ + WEEK, + + /** Untyped value without a unit. */ + NONE; + + public @NotNull String apiName() { + return name().toLowerCase(Locale.ROOT); + } +} diff --git a/sentry/src/main/java/io/sentry/SentryTracer.java b/sentry/src/main/java/io/sentry/SentryTracer.java index c40a74ecd71..d25ad9106b6 100644 --- a/sentry/src/main/java/io/sentry/SentryTracer.java +++ b/sentry/src/main/java/io/sentry/SentryTracer.java @@ -1,5 +1,6 @@ package io.sentry; +import io.sentry.protocol.MeasurementValue; import io.sentry.protocol.SentryId; import io.sentry.protocol.SentryTransaction; import io.sentry.protocol.TransactionNameSource; @@ -13,6 +14,7 @@ import java.util.Map; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -74,6 +76,7 @@ public final class SentryTracer implements ITransaction { private final @NotNull Baggage baggage; private @NotNull TransactionNameSource transactionNameSource; + private final @NotNull Map measurements; public SentryTracer(final @NotNull TransactionContext context, final @NotNull IHub hub) { this(context, hub, null); @@ -104,6 +107,7 @@ public SentryTracer( final @Nullable TransactionFinishedCallback transactionFinishedCallback) { Objects.requireNonNull(context, "context is required"); Objects.requireNonNull(hub, "hub is required"); + this.measurements = new ConcurrentHashMap<>(); this.root = new Span(context, this, hub, startTimestamp); this.name = context.getName(); this.hub = hub; @@ -360,6 +364,9 @@ public void finish(@Nullable SpanStatus status) { // if it's an idle transaction which has no children, we drop it to save user's quota return; } + + transaction.getMeasurements().putAll(measurements); + hub.captureTransaction(transaction, traceContext(), null, profilingTraceData); } } @@ -506,6 +513,17 @@ public void setData(@NotNull String key, @NotNull Object value) { return this.root.getData(key); } + @Override + public void setMeasurement(@NotNull String name, float value) { + this.measurements.put(name, new MeasurementValue(value, SentryMeasurementUnit.NONE.apiName())); + } + + @Override + public void setMeasurement( + @NotNull String name, float value, @NotNull SentryMeasurementUnit unit) { + this.measurements.put(name, new MeasurementValue(value, unit.apiName())); + } + public @Nullable Map getData() { return this.root.getData(); } diff --git a/sentry/src/main/java/io/sentry/Span.java b/sentry/src/main/java/io/sentry/Span.java index 8ae6d0cbb06..f7dd49d6853 100644 --- a/sentry/src/main/java/io/sentry/Span.java +++ b/sentry/src/main/java/io/sentry/Span.java @@ -313,6 +313,17 @@ public void setData(@NotNull String key, @NotNull Object value) { return data.get(key); } + @Override + public void setMeasurement(@NotNull String name, float value) { + this.transaction.setMeasurement(name, value); + } + + @Override + public void setMeasurement( + @NotNull String name, float value, @NotNull SentryMeasurementUnit unit) { + this.transaction.setMeasurement(name, value, unit); + } + @Nullable Long getEndNanos() { return endNanos; diff --git a/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java b/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java index c80b3a47acc..99fafe3125c 100644 --- a/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java +++ b/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java @@ -18,9 +18,6 @@ @ApiStatus.Internal public final class MeasurementValue implements JsonUnknown, JsonSerializable { - public static final @NotNull String NONE_UNIT = "none"; - public static final @NotNull String MILLISECOND_UNIT = "millisecond"; - @SuppressWarnings("UnusedVariable") private final float value; From dd3a1833fd1c73133e17458fc3120f69977afb55 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Wed, 28 Sep 2022 11:54:54 +0200 Subject: [PATCH 02/23] Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b8ae0af67e..58b41ec5b76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Make user segment a top level property ([#2257](https://github.com/getsentry/sentry-java/pull/2257)) - Replace user `other` with `data` ([#2258](https://github.com/getsentry/sentry-java/pull/2258)) +- Provide API for attaching custom measurements to transactions ([#2260](https://github.com/getsentry/sentry-java/pull/2260)) ## 6.5.0-beta.1 From 0d10f60a8650dfc008a49a912d107ba02939191d Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Wed, 28 Sep 2022 20:23:39 +0200 Subject: [PATCH 03/23] Add tests --- .../src/main/java/io/sentry/SentryTracer.java | 14 ++++++++++ .../io/sentry/SentryMeasurementUnitTest.kt | 20 ++++++++++++++ .../test/java/io/sentry/SentryTracerTest.kt | 27 +++++++++++++++++-- 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt diff --git a/sentry/src/main/java/io/sentry/SentryTracer.java b/sentry/src/main/java/io/sentry/SentryTracer.java index d25ad9106b6..42f7687a5be 100644 --- a/sentry/src/main/java/io/sentry/SentryTracer.java +++ b/sentry/src/main/java/io/sentry/SentryTracer.java @@ -515,12 +515,20 @@ public void setData(@NotNull String key, @NotNull Object value) { @Override public void setMeasurement(@NotNull String name, float value) { + if (root.isFinished()) { + return; + } + this.measurements.put(name, new MeasurementValue(value, SentryMeasurementUnit.NONE.apiName())); } @Override public void setMeasurement( @NotNull String name, float value, @NotNull SentryMeasurementUnit unit) { + if (root.isFinished()) { + return; + } + this.measurements.put(name, new MeasurementValue(value, unit.apiName())); } @@ -619,6 +627,12 @@ AtomicBoolean isFinishTimerRunning() { return isFinishTimerRunning; } + @TestOnly + @NotNull + Map getMeasurements() { + return measurements; + } + private static final class FinishStatus { static final FinishStatus NOT_FINISHED = FinishStatus.notFinished(); diff --git a/sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt b/sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt new file mode 100644 index 00000000000..19487e28274 --- /dev/null +++ b/sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt @@ -0,0 +1,20 @@ +package io.sentry + +import kotlin.test.Test +import kotlin.test.assertEquals + +class SentryMeasurementUnitTest { + + @Test + fun `apiName converts enum to lowercase`() { + assertEquals("nanosecond", SentryMeasurementUnit.NANOSECOND.apiName()) + assertEquals("microsecond", SentryMeasurementUnit.MICROSECOND.apiName()) + assertEquals("millisecond", SentryMeasurementUnit.MILLISECOND.apiName()) + assertEquals("second", SentryMeasurementUnit.SECOND.apiName()) + assertEquals("minute", SentryMeasurementUnit.MINUTE.apiName()) + assertEquals("hour", SentryMeasurementUnit.HOUR.apiName()) + assertEquals("day", SentryMeasurementUnit.DAY.apiName()) + assertEquals("week", SentryMeasurementUnit.WEEK.apiName()) + assertEquals("none", SentryMeasurementUnit.NONE.apiName()) + } +} diff --git a/sentry/src/test/java/io/sentry/SentryTracerTest.kt b/sentry/src/test/java/io/sentry/SentryTracerTest.kt index db3e7b36b37..5bb39687c14 100644 --- a/sentry/src/test/java/io/sentry/SentryTracerTest.kt +++ b/sentry/src/test/java/io/sentry/SentryTracerTest.kt @@ -8,6 +8,7 @@ import com.nhaarman.mockitokotlin2.never import com.nhaarman.mockitokotlin2.spy import com.nhaarman.mockitokotlin2.times import com.nhaarman.mockitokotlin2.verify +import io.sentry.SentryMeasurementUnit.DAY import io.sentry.protocol.User import org.awaitility.kotlin.await import java.util.Date @@ -367,6 +368,7 @@ class SentryTracerTest { transaction.description = "desc" transaction.setTag("myTag", "myValue") transaction.setData("myData", "myValue") + transaction.setMeasurement("myMetric", 1.0f) val ex = RuntimeException() transaction.throwable = ex @@ -382,13 +384,14 @@ class SentryTracerTest { transaction.setTag("myTag", "myNewValue") transaction.throwable = RuntimeException() transaction.setData("myData", "myNewValue") - transaction.name = "newName" + transaction.setMeasurement("myMetric", 2.0f) assertEquals(SpanStatus.OK, transaction.status) assertEquals("op", transaction.operation) assertEquals("desc", transaction.description) assertEquals("myValue", transaction.getTag("myTag")) assertEquals("myValue", transaction.getData("myData")) + assertEquals(1.0f, transaction.measurements["myMetric"]!!.value) assertEquals("name", transaction.name) assertEquals(ex, transaction.throwable) } @@ -708,7 +711,7 @@ class SentryTracerTest { @Test fun `when idle transaction with children, finishes the transaction after the idle timeout`() { - val transaction = fixture.getSut(waitForChildren = true, idleTimeout = 10) + val transaction = fixture.getSut(waitForChildren = true, idleTimeout = 1000) val span = transaction.startChild("op") span.finish() @@ -804,4 +807,24 @@ class SentryTracerTest { transaction.finish(SpanStatus.OK) assertNull(transaction.timer) } + + @Test + fun `when tracer is finished, puts custom measurements into underlying transaction`() { + val transaction = fixture.getSut() + transaction.setMeasurement("metric1", 1.0f) + transaction.setMeasurement("days", 2f, DAY) + transaction.finish() + + verify(fixture.hub).captureTransaction( + check { + assertEquals(1.0f, it.measurements["metric1"]!!.value) + + assertEquals(2f, it.measurements["days"]!!.value) + assertEquals("day", it.measurements["days"]!!.unit) + }, + anyOrNull(), + anyOrNull(), + anyOrNull(), + ) + } } From 018e0db898a74377397ba8230b0e59502515947a Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Wed, 28 Sep 2022 20:27:08 +0200 Subject: [PATCH 04/23] Update sentry/src/test/java/io/sentry/SentryTracerTest.kt --- sentry/src/test/java/io/sentry/SentryTracerTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry/src/test/java/io/sentry/SentryTracerTest.kt b/sentry/src/test/java/io/sentry/SentryTracerTest.kt index 5bb39687c14..8c1fe0f8181 100644 --- a/sentry/src/test/java/io/sentry/SentryTracerTest.kt +++ b/sentry/src/test/java/io/sentry/SentryTracerTest.kt @@ -384,6 +384,7 @@ class SentryTracerTest { transaction.setTag("myTag", "myNewValue") transaction.throwable = RuntimeException() transaction.setData("myData", "myNewValue") + transaction.name = "newName" transaction.setMeasurement("myMetric", 2.0f) assertEquals(SpanStatus.OK, transaction.status) From f765bcf06ce5a5deeb5c7bf991a133081493113b Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Wed, 28 Sep 2022 20:49:21 +0200 Subject: [PATCH 05/23] Add example custom metrics to samples --- .../java/io/sentry/samples/android/MainActivity.java | 3 +++ .../io/sentry/samples/spring/boot/PersonService.java | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java index b337973bcf8..dc328720f43 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java @@ -27,6 +27,7 @@ public class MainActivity extends AppCompatActivity { private int crashCount = 0; + private int screenLoadCount = 0; @Override protected void onCreate(Bundle savedInstanceState) { @@ -200,8 +201,10 @@ protected void onCreate(Bundle savedInstanceState) { @Override protected void onResume() { super.onResume(); + screenLoadCount++; final ISpan span = Sentry.getSpan(); if (span != null) { + span.setMeasurement("screen_load_count", screenLoadCount); span.finish(SpanStatus.OK); } } diff --git a/sentry-samples/sentry-samples-spring-boot/src/main/java/io/sentry/samples/spring/boot/PersonService.java b/sentry-samples/sentry-samples-spring-boot/src/main/java/io/sentry/samples/spring/boot/PersonService.java index 76d528f585c..0eb67e85788 100644 --- a/sentry-samples/sentry-samples-spring-boot/src/main/java/io/sentry/samples/spring/boot/PersonService.java +++ b/sentry-samples/sentry-samples-spring-boot/src/main/java/io/sentry/samples/spring/boot/PersonService.java @@ -1,5 +1,7 @@ package io.sentry.samples.spring.boot; +import io.sentry.ISpan; +import io.sentry.Sentry; import io.sentry.spring.tracing.SentrySpan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,12 +18,19 @@ public class PersonService { private static final Logger LOGGER = LoggerFactory.getLogger(PersonService.class); private final JdbcTemplate jdbcTemplate; + private int createCount = 0; public PersonService(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } Person create(Person person) { + createCount++; + final ISpan span = Sentry.getSpan(); + if (span != null) { + span.setMeasurement("create_count", createCount); + } + jdbcTemplate.update( "insert into person (firstName, lastName) values (?, ?)", person.getFirstName(), From 2d60a976ff31ae402142310f4e46dcea5e87a68f Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 29 Sep 2022 12:57:31 +0200 Subject: [PATCH 06/23] Address PR reviews --- .../src/main/java/io/sentry/samples/android/MainActivity.java | 3 ++- sentry/src/main/java/io/sentry/ISpan.java | 2 +- sentry/src/main/java/io/sentry/SentryMeasurementUnit.java | 3 +++ sentry/src/main/java/io/sentry/SentryTracer.java | 2 +- sentry/src/test/java/io/sentry/SentryTracerTest.kt | 1 + 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java index dc328720f43..e08c851cb77 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java @@ -6,6 +6,7 @@ import io.sentry.Attachment; import io.sentry.ISpan; import io.sentry.Sentry; +import io.sentry.SentryMeasurementUnit; import io.sentry.SpanStatus; import io.sentry.UserFeedback; import io.sentry.protocol.SentryId; @@ -204,7 +205,7 @@ protected void onResume() { screenLoadCount++; final ISpan span = Sentry.getSpan(); if (span != null) { - span.setMeasurement("screen_load_count", screenLoadCount); + span.setMeasurement("screen_load_count", screenLoadCount, SentryMeasurementUnit.DAY); span.finish(SpanStatus.OK); } } diff --git a/sentry/src/main/java/io/sentry/ISpan.java b/sentry/src/main/java/io/sentry/ISpan.java index 3e250631b76..023f636b526 100644 --- a/sentry/src/main/java/io/sentry/ISpan.java +++ b/sentry/src/main/java/io/sentry/ISpan.java @@ -171,7 +171,7 @@ ISpan startChild( Object getData(@NotNull String key); /** - * Set a measurement with NONE unit. + * Set a measurement without unit. * *

NOTE: Setting a measurement with the same name on the same transaction multiple times only * keeps the last value. diff --git a/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java b/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java index 8a819f8ead8..3e981657b8e 100644 --- a/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java +++ b/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java @@ -3,6 +3,9 @@ import java.util.Locale; import org.jetbrains.annotations.NotNull; +/** + * Develop Docs + */ public enum SentryMeasurementUnit { /** Nanosecond (`"nanosecond"`), 10^-9 seconds. */ NANOSECOND, diff --git a/sentry/src/main/java/io/sentry/SentryTracer.java b/sentry/src/main/java/io/sentry/SentryTracer.java index 42f7687a5be..71fbef617d4 100644 --- a/sentry/src/main/java/io/sentry/SentryTracer.java +++ b/sentry/src/main/java/io/sentry/SentryTracer.java @@ -519,7 +519,7 @@ public void setMeasurement(@NotNull String name, float value) { return; } - this.measurements.put(name, new MeasurementValue(value, SentryMeasurementUnit.NONE.apiName())); + this.measurements.put(name, new MeasurementValue(value, null)); } @Override diff --git a/sentry/src/test/java/io/sentry/SentryTracerTest.kt b/sentry/src/test/java/io/sentry/SentryTracerTest.kt index 8c1fe0f8181..419ba494210 100644 --- a/sentry/src/test/java/io/sentry/SentryTracerTest.kt +++ b/sentry/src/test/java/io/sentry/SentryTracerTest.kt @@ -819,6 +819,7 @@ class SentryTracerTest { verify(fixture.hub).captureTransaction( check { assertEquals(1.0f, it.measurements["metric1"]!!.value) + assertEquals(null, it.measurements["metric1"]!!.unit) assertEquals(2f, it.measurements["days"]!!.value) assertEquals("day", it.measurements["days"]!!.unit) From 4c66b5b01a40b24bc4fa234d0299129dce23059f Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Fri, 30 Sep 2022 11:21:08 +0200 Subject: [PATCH 07/23] Add missing units --- .../android/core/ActivityFramesTracker.java | 6 +- .../PerformanceAndroidEventProcessor.java | 2 +- .../sentry/samples/android/MainActivity.java | 2 +- .../java/io/sentry/SentryMeasurementUnit.java | 98 +++++++++++++++---- 4 files changed, 83 insertions(+), 25 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java index 46972447784..834bf84edcd 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java @@ -104,11 +104,11 @@ public synchronized void setMetrics( } final MeasurementValue tfValues = - new MeasurementValue(totalFrames, SentryMeasurementUnit.NONE.apiName()); + new MeasurementValue(totalFrames, SentryMeasurementUnit.Duration.NONE.apiName()); final MeasurementValue sfValues = - new MeasurementValue(slowFrames, SentryMeasurementUnit.NONE.apiName()); + new MeasurementValue(slowFrames, SentryMeasurementUnit.Duration.NONE.apiName()); final MeasurementValue ffValues = - new MeasurementValue(frozenFrames, SentryMeasurementUnit.NONE.apiName()); + new MeasurementValue(frozenFrames, SentryMeasurementUnit.Duration.NONE.apiName()); final Map measurements = new HashMap<>(); measurements.put("frames_total", tfValues); measurements.put("frames_slow", sfValues); diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java index 9d5b4447536..d0170b4bf80 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java @@ -68,7 +68,7 @@ public SentryEvent process(@NotNull SentryEvent event, @NotNull Hint hint) { if (appStartUpInterval != null) { final MeasurementValue value = new MeasurementValue( - (float) appStartUpInterval, SentryMeasurementUnit.MILLISECOND.apiName()); + (float) appStartUpInterval, SentryMeasurementUnit.Duration.MILLISECOND.apiName()); final String appStartKey = AppStartState.getInstance().isColdStart() ? "app_start_cold" : "app_start_warm"; diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java index e08c851cb77..fdb5c348d08 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java @@ -205,7 +205,7 @@ protected void onResume() { screenLoadCount++; final ISpan span = Sentry.getSpan(); if (span != null) { - span.setMeasurement("screen_load_count", screenLoadCount, SentryMeasurementUnit.DAY); + span.setMeasurement("screen_load_count", screenLoadCount, new SentryMeasurementUnit.Custom("test")); span.finish(SpanStatus.OK); } } diff --git a/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java b/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java index 3e981657b8e..b7763451c9b 100644 --- a/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java +++ b/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java @@ -6,35 +6,93 @@ /** * Develop Docs */ -public enum SentryMeasurementUnit { - /** Nanosecond (`"nanosecond"`), 10^-9 seconds. */ - NANOSECOND, +public interface SentryMeasurementUnit { + enum Duration implements SentryMeasurementUnit { + /** Nanosecond (`"nanosecond"`), 10^-9 seconds. */ + NANOSECOND, - /** Microsecond (`"microsecond"`), 10^-6 seconds. */ - MICROSECOND, + /** Microsecond (`"microsecond"`), 10^-6 seconds. */ + MICROSECOND, - /** Millisecond (`"millisecond"`), 10^-3 seconds. */ - MILLISECOND, + /** Millisecond (`"millisecond"`), 10^-3 seconds. */ + MILLISECOND, - /** Full second (`"second"`). */ - SECOND, + /** Full second (`"second"`). */ + SECOND, - /** Minute (`"minute"`), 60 seconds. */ - MINUTE, + /** Minute (`"minute"`), 60 seconds. */ + MINUTE, - /** Hour (`"hour"`), 3600 seconds. */ - HOUR, + /** Hour (`"hour"`), 3600 seconds. */ + HOUR, - /** Day (`"day"`), 86,400 seconds. */ - DAY, + /** Day (`"day"`), 86,400 seconds. */ + DAY, - /** Week (`"week"`), 604,800 seconds. */ - WEEK, + /** Week (`"week"`), 604,800 seconds. */ + WEEK, - /** Untyped value without a unit. */ - NONE; + /** Untyped value without a unit. */ + NONE; + } + + enum Information implements SentryMeasurementUnit { + /// Bit (`"bit"`), corresponding to 1/8 of a byte. + /// + /// Note that there are computer systems with a different number of bits per byte. + BIT, + /// Byte (`"byte"`). + BYTE, + /// Kilobyte (`"kilobyte"`), 10^3 bytes. + KILOBYTE, + /// Kibibyte (`"kibibyte"`), 2^10 bytes. + KIBIBYTE, + /// Megabyte (`"megabyte"`), 10^6 bytes. + MEGABYTE, + /// Mebibyte (`"mebibyte"`), 2^20 bytes. + MEBIBYTE, + /// Gigabyte (`"gigabyte"`), 10^9 bytes. + GIGABYTE, + /// Gibibyte (`"gibibyte"`), 2^30 bytes. + GIBIBYTE, + /// Terabyte (`"terabyte"`), 10^12 bytes. + TERABYTE, + /// Tebibyte (`"tebibyte"`), 2^40 bytes. + TEBIBYTE, + /// Petabyte (`"petabyte"`), 10^15 bytes. + PETABYTE, + /// Pebibyte (`"pebibyte"`), 2^50 bytes. + PEBIBYTE, + /// Exabyte (`"exabyte"`), 10^18 bytes. + EXABYTE, + /// Exbibyte (`"exbibyte"`), 2^60 bytes. + EXBIBYTE, + } + + enum Fraction implements SentryMeasurementUnit { + /// Floating point fraction of `1`. + RATIO, + + /// Ratio expressed as a fraction of `100`. `100%` equals a ratio of `1.0`. + PERCENT; + } + + final class Custom implements SentryMeasurementUnit { + + private final @NotNull String name; + + public Custom(@NotNull String name) { + this.name = name; + } + + @Override public @NotNull String name() { + return name; + } + } + + @NotNull String name(); - public @NotNull String apiName() { + default @NotNull String apiName() { return name().toLowerCase(Locale.ROOT); } } From c9441547e62589d866dd204a42dd64c0698cc8d3 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Fri, 30 Sep 2022 15:57:43 +0200 Subject: [PATCH 08/23] Add missing units --- .../android/core/ActivityFramesTracker.java | 10 +--- .../sentry/samples/android/MainActivity.java | 2 +- .../java/io/sentry/SentryMeasurementUnit.java | 59 +++++++++++-------- .../src/main/java/io/sentry/SentryTracer.java | 4 +- .../io/sentry/SentryMeasurementUnitTest.kt | 48 +++++++++++---- .../test/java/io/sentry/SentryTracerTest.kt | 3 +- 6 files changed, 80 insertions(+), 46 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java index 834bf84edcd..b6b7dc44bf3 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java @@ -4,7 +4,6 @@ import android.util.SparseIntArray; import androidx.core.app.FrameMetricsAggregator; import io.sentry.ILogger; -import io.sentry.SentryMeasurementUnit; import io.sentry.protocol.MeasurementValue; import io.sentry.protocol.SentryId; import java.util.HashMap; @@ -103,12 +102,9 @@ public synchronized void setMetrics( return; } - final MeasurementValue tfValues = - new MeasurementValue(totalFrames, SentryMeasurementUnit.Duration.NONE.apiName()); - final MeasurementValue sfValues = - new MeasurementValue(slowFrames, SentryMeasurementUnit.Duration.NONE.apiName()); - final MeasurementValue ffValues = - new MeasurementValue(frozenFrames, SentryMeasurementUnit.Duration.NONE.apiName()); + final MeasurementValue tfValues = new MeasurementValue(totalFrames, null); + final MeasurementValue sfValues = new MeasurementValue(slowFrames, null); + final MeasurementValue ffValues = new MeasurementValue(frozenFrames, null); final Map measurements = new HashMap<>(); measurements.put("frames_total", tfValues); measurements.put("frames_slow", sfValues); diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java index fdb5c348d08..b5b1a72e313 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java @@ -205,7 +205,7 @@ protected void onResume() { screenLoadCount++; final ISpan span = Sentry.getSpan(); if (span != null) { - span.setMeasurement("screen_load_count", screenLoadCount, new SentryMeasurementUnit.Custom("test")); + span.setMeasurement("screen_load_count", screenLoadCount); span.finish(SpanStatus.OK); } } diff --git a/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java b/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java index b7763451c9b..d9ac8dd605b 100644 --- a/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java +++ b/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java @@ -1,12 +1,14 @@ package io.sentry; import java.util.Locale; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** - * Develop Docs + * Develop Docs */ public interface SentryMeasurementUnit { + enum Duration implements SentryMeasurementUnit { /** Nanosecond (`"nanosecond"`), 10^-9 seconds. */ NANOSECOND, @@ -30,50 +32,58 @@ enum Duration implements SentryMeasurementUnit { DAY, /** Week (`"week"`), 604,800 seconds. */ - WEEK, - - /** Untyped value without a unit. */ - NONE; + WEEK; } enum Information implements SentryMeasurementUnit { - /// Bit (`"bit"`), corresponding to 1/8 of a byte. - /// - /// Note that there are computer systems with a different number of bits per byte. + /** Bit (`"bit"`), corresponding to 1/8 of a byte. */ BIT, - /// Byte (`"byte"`). + + /** Byte (`"byte"`). */ BYTE, - /// Kilobyte (`"kilobyte"`), 10^3 bytes. + + /** Kilobyte (`"kilobyte"`), 10^3 bytes. */ KILOBYTE, - /// Kibibyte (`"kibibyte"`), 2^10 bytes. + + /** Kibibyte (`"kibibyte"`), 2^10 bytes. */ KIBIBYTE, - /// Megabyte (`"megabyte"`), 10^6 bytes. + + /** Megabyte (`"megabyte"`), 10^6 bytes. */ MEGABYTE, - /// Mebibyte (`"mebibyte"`), 2^20 bytes. + + /** Mebibyte (`"mebibyte"`), 2^20 bytes. */ MEBIBYTE, - /// Gigabyte (`"gigabyte"`), 10^9 bytes. + + /** Gigabyte (`"gigabyte"`), 10^9 bytes. */ GIGABYTE, - /// Gibibyte (`"gibibyte"`), 2^30 bytes. + + /** Gibibyte (`"gibibyte"`), 2^30 bytes. */ GIBIBYTE, - /// Terabyte (`"terabyte"`), 10^12 bytes. + + /** Terabyte (`"terabyte"`), 10^12 bytes. */ TERABYTE, - /// Tebibyte (`"tebibyte"`), 2^40 bytes. + + /** Tebibyte (`"tebibyte"`), 2^40 bytes. */ TEBIBYTE, - /// Petabyte (`"petabyte"`), 10^15 bytes. + + /** Petabyte (`"petabyte"`), 10^15 bytes. */ PETABYTE, - /// Pebibyte (`"pebibyte"`), 2^50 bytes. + + /** Pebibyte (`"pebibyte"`), 2^50 bytes. */ PEBIBYTE, - /// Exabyte (`"exabyte"`), 10^18 bytes. + + /** Exabyte (`"exabyte"`), 10^18 bytes. */ EXABYTE, - /// Exbibyte (`"exbibyte"`), 2^60 bytes. - EXBIBYTE, + + /** Exbibyte (`"exbibyte"`), 2^60 bytes. */ + EXBIBYTE; } enum Fraction implements SentryMeasurementUnit { - /// Floating point fraction of `1`. + /** Floating point fraction of `1`. */ RATIO, - /// Ratio expressed as a fraction of `100`. `100%` equals a ratio of `1.0`. + /** Ratio expressed as a fraction of `100`. `100%` equals a ratio of `1.0`. */ PERCENT; } @@ -92,6 +102,7 @@ public Custom(@NotNull String name) { @NotNull String name(); + @ApiStatus.Internal default @NotNull String apiName() { return name().toLowerCase(Locale.ROOT); } diff --git a/sentry/src/main/java/io/sentry/SentryTracer.java b/sentry/src/main/java/io/sentry/SentryTracer.java index 71fbef617d4..7abc5e4b787 100644 --- a/sentry/src/main/java/io/sentry/SentryTracer.java +++ b/sentry/src/main/java/io/sentry/SentryTracer.java @@ -514,7 +514,7 @@ public void setData(@NotNull String key, @NotNull Object value) { } @Override - public void setMeasurement(@NotNull String name, float value) { + public void setMeasurement(final @NotNull String name, final float value) { if (root.isFinished()) { return; } @@ -524,7 +524,7 @@ public void setMeasurement(@NotNull String name, float value) { @Override public void setMeasurement( - @NotNull String name, float value, @NotNull SentryMeasurementUnit unit) { + final @NotNull String name, final float value, final @NotNull SentryMeasurementUnit unit) { if (root.isFinished()) { return; } diff --git a/sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt b/sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt index 19487e28274..610ebc1eb19 100644 --- a/sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt +++ b/sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt @@ -6,15 +6,43 @@ import kotlin.test.assertEquals class SentryMeasurementUnitTest { @Test - fun `apiName converts enum to lowercase`() { - assertEquals("nanosecond", SentryMeasurementUnit.NANOSECOND.apiName()) - assertEquals("microsecond", SentryMeasurementUnit.MICROSECOND.apiName()) - assertEquals("millisecond", SentryMeasurementUnit.MILLISECOND.apiName()) - assertEquals("second", SentryMeasurementUnit.SECOND.apiName()) - assertEquals("minute", SentryMeasurementUnit.MINUTE.apiName()) - assertEquals("hour", SentryMeasurementUnit.HOUR.apiName()) - assertEquals("day", SentryMeasurementUnit.DAY.apiName()) - assertEquals("week", SentryMeasurementUnit.WEEK.apiName()) - assertEquals("none", SentryMeasurementUnit.NONE.apiName()) + fun `apiName converts Duration enum to lowercase`() { + assertEquals("nanosecond", SentryMeasurementUnit.Duration.NANOSECOND.apiName()) + assertEquals("microsecond", SentryMeasurementUnit.Duration.MICROSECOND.apiName()) + assertEquals("millisecond", SentryMeasurementUnit.Duration.MILLISECOND.apiName()) + assertEquals("second", SentryMeasurementUnit.Duration.SECOND.apiName()) + assertEquals("minute", SentryMeasurementUnit.Duration.MINUTE.apiName()) + assertEquals("hour", SentryMeasurementUnit.Duration.HOUR.apiName()) + assertEquals("day", SentryMeasurementUnit.Duration.DAY.apiName()) + assertEquals("week", SentryMeasurementUnit.Duration.WEEK.apiName()) + } + + @Test + fun `apiName converts Information enum to lowercase`() { + assertEquals("bit", SentryMeasurementUnit.Information.BIT.apiName()) + assertEquals("byte", SentryMeasurementUnit.Information.BYTE.apiName()) + assertEquals("kilobyte", SentryMeasurementUnit.Information.KILOBYTE.apiName()) + assertEquals("kibibyte", SentryMeasurementUnit.Information.KIBIBYTE.apiName()) + assertEquals("megabyte", SentryMeasurementUnit.Information.MEGABYTE.apiName()) + assertEquals("mebibyte", SentryMeasurementUnit.Information.MEBIBYTE.apiName()) + assertEquals("gigabyte", SentryMeasurementUnit.Information.GIGABYTE.apiName()) + assertEquals("gibibyte", SentryMeasurementUnit.Information.GIBIBYTE.apiName()) + assertEquals("terabyte", SentryMeasurementUnit.Information.TERABYTE.apiName()) + assertEquals("tebibyte", SentryMeasurementUnit.Information.TEBIBYTE.apiName()) + assertEquals("petabyte", SentryMeasurementUnit.Information.PETABYTE.apiName()) + assertEquals("pebibyte", SentryMeasurementUnit.Information.PEBIBYTE.apiName()) + assertEquals("exabyte", SentryMeasurementUnit.Information.EXABYTE.apiName()) + assertEquals("exbibyte", SentryMeasurementUnit.Information.EXBIBYTE.apiName()) + } + + @Test + fun `apiName converts Fraction enum to lowercase`() { + assertEquals("ratio", SentryMeasurementUnit.Fraction.RATIO.apiName()) + assertEquals("percent", SentryMeasurementUnit.Fraction.PERCENT.apiName()) + } + + @Test + fun `apiName converts Custom to lowercase`() { + assertEquals("test", SentryMeasurementUnit.Custom("Test").apiName()) } } diff --git a/sentry/src/test/java/io/sentry/SentryTracerTest.kt b/sentry/src/test/java/io/sentry/SentryTracerTest.kt index 419ba494210..955e58f8d56 100644 --- a/sentry/src/test/java/io/sentry/SentryTracerTest.kt +++ b/sentry/src/test/java/io/sentry/SentryTracerTest.kt @@ -8,7 +8,6 @@ import com.nhaarman.mockitokotlin2.never import com.nhaarman.mockitokotlin2.spy import com.nhaarman.mockitokotlin2.times import com.nhaarman.mockitokotlin2.verify -import io.sentry.SentryMeasurementUnit.DAY import io.sentry.protocol.User import org.awaitility.kotlin.await import java.util.Date @@ -813,7 +812,7 @@ class SentryTracerTest { fun `when tracer is finished, puts custom measurements into underlying transaction`() { val transaction = fixture.getSut() transaction.setMeasurement("metric1", 1.0f) - transaction.setMeasurement("days", 2f, DAY) + transaction.setMeasurement("days", 2f, SentryMeasurementUnit.Duration.DAY) transaction.finish() verify(fixture.hub).captureTransaction( From bc3c3b346cf56b20936409435748655058eda20b Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Fri, 30 Sep 2022 17:40:14 +0200 Subject: [PATCH 09/23] Convert float to Number for MeasurementValue --- .../android/core/ActivityFramesTrackerTest.kt | 18 +++++------ .../PerformanceAndroidEventProcessorTest.kt | 2 +- .../sentry/samples/android/MainActivity.java | 2 +- sentry/src/main/java/io/sentry/ISpan.java | 4 +-- sentry/src/main/java/io/sentry/NoOpSpan.java | 4 +-- .../main/java/io/sentry/NoOpTransaction.java | 4 +-- .../src/main/java/io/sentry/SentryTracer.java | 4 +-- sentry/src/main/java/io/sentry/Span.java | 4 +-- .../io/sentry/protocol/MeasurementValue.java | 21 +++++++++---- .../test/java/io/sentry/SentryTracerTest.kt | 4 +-- .../MeasurementValueSerializationTest.kt | 31 ++++++++++++++++--- ...lue.json => measurement_value_double.json} | 0 .../resources/json/measurement_value_int.json | 5 +++ .../json/measurement_value_missing.json | 4 +++ 14 files changed, 73 insertions(+), 34 deletions(-) rename sentry/src/test/resources/json/{measurement_value.json => measurement_value_double.json} (100%) create mode 100644 sentry/src/test/resources/json/measurement_value_int.json create mode 100644 sentry/src/test/resources/json/measurement_value_missing.json diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt index 0e3b0e437b9..45bc38443ec 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt @@ -41,8 +41,8 @@ class ActivityFramesTrackerTest { val metrics = sut.takeMetrics(fixture.sentryId) val totalFrames = metrics!!["frames_total"] - assertEquals(totalFrames!!.value, 1f) - assertEquals(totalFrames.unit, "none") + assertEquals(totalFrames!!.value, 1) + assertEquals(totalFrames.unit, null) } @Test @@ -57,8 +57,8 @@ class ActivityFramesTrackerTest { val metrics = sut.takeMetrics(fixture.sentryId) val frozenFrames = metrics!!["frames_frozen"] - assertEquals(frozenFrames!!.value, 5f) - assertEquals(frozenFrames.unit, "none") + assertEquals(frozenFrames!!.value, 5) + assertEquals(frozenFrames.unit, null) } @Test @@ -73,8 +73,8 @@ class ActivityFramesTrackerTest { val metrics = sut.takeMetrics(fixture.sentryId) val slowFrames = metrics!!["frames_slow"] - assertEquals(slowFrames!!.value, 5f) - assertEquals(slowFrames.unit, "none") + assertEquals(slowFrames!!.value, 5) + assertEquals(slowFrames.unit, null) } @Test @@ -93,13 +93,13 @@ class ActivityFramesTrackerTest { val metrics = sut.takeMetrics(fixture.sentryId) val totalFrames = metrics!!["frames_total"] - assertEquals(totalFrames!!.value, 111f) + assertEquals(totalFrames!!.value, 111) val frozenFrames = metrics["frames_frozen"] - assertEquals(frozenFrames!!.value, 6f) + assertEquals(frozenFrames!!.value, 6) val slowFrames = metrics["frames_slow"] - assertEquals(slowFrames!!.value, 5f) + assertEquals(slowFrames!!.value, 5) } @Test diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt index 99c197f1e01..88eac8b682b 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt @@ -156,7 +156,7 @@ class PerformanceAndroidEventProcessorTest { val tracer = SentryTracer(context, fixture.hub) var tr = SentryTransaction(tracer) - val metrics = mapOf("frames_total" to MeasurementValue(1f, SentryMeasurementUnit.MILLISECOND.apiName())) + val metrics = mapOf("frames_total" to MeasurementValue(1f, SentryMeasurementUnit.Duration.MILLISECOND.apiName())) whenever(fixture.activityFramesTracker.takeMetrics(any())).thenReturn(metrics) tr = sut.process(tr, Hint()) diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java index b5b1a72e313..fdb5c348d08 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java @@ -205,7 +205,7 @@ protected void onResume() { screenLoadCount++; final ISpan span = Sentry.getSpan(); if (span != null) { - span.setMeasurement("screen_load_count", screenLoadCount); + span.setMeasurement("screen_load_count", screenLoadCount, new SentryMeasurementUnit.Custom("test")); span.finish(SpanStatus.OK); } } diff --git a/sentry/src/main/java/io/sentry/ISpan.java b/sentry/src/main/java/io/sentry/ISpan.java index 023f636b526..49f34ee654d 100644 --- a/sentry/src/main/java/io/sentry/ISpan.java +++ b/sentry/src/main/java/io/sentry/ISpan.java @@ -179,7 +179,7 @@ ISpan startChild( * @param name the name of the measurement * @param value the value of the measurement */ - void setMeasurement(@NotNull String name, float value); + void setMeasurement(@NotNull String name, @NotNull Number value); /** * Set a measurement with specific unit. @@ -191,5 +191,5 @@ ISpan startChild( * @param value the value of the measurement * @param unit the unit the value is measured in */ - void setMeasurement(@NotNull String name, float value, @NotNull SentryMeasurementUnit unit); + void setMeasurement(@NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit); } diff --git a/sentry/src/main/java/io/sentry/NoOpSpan.java b/sentry/src/main/java/io/sentry/NoOpSpan.java index ab81a02d4da..e4f5f548d64 100644 --- a/sentry/src/main/java/io/sentry/NoOpSpan.java +++ b/sentry/src/main/java/io/sentry/NoOpSpan.java @@ -113,9 +113,9 @@ public void setData(@NotNull String key, @NotNull Object value) {} } @Override - public void setMeasurement(@NotNull String name, float value) {} + public void setMeasurement(@NotNull String name, @NotNull Number value) {} @Override public void setMeasurement( - @NotNull String name, float value, @NotNull SentryMeasurementUnit unit) {} + @NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit) {} } diff --git a/sentry/src/main/java/io/sentry/NoOpTransaction.java b/sentry/src/main/java/io/sentry/NoOpTransaction.java index 8973e4ae81e..62aac440b94 100644 --- a/sentry/src/main/java/io/sentry/NoOpTransaction.java +++ b/sentry/src/main/java/io/sentry/NoOpTransaction.java @@ -166,9 +166,9 @@ public void setData(@NotNull String key, @NotNull Object value) {} } @Override - public void setMeasurement(@NotNull String name, float value) {} + public void setMeasurement(@NotNull String name, @NotNull Number value) {} @Override public void setMeasurement( - @NotNull String name, float value, @NotNull SentryMeasurementUnit unit) {} + @NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit) {} } diff --git a/sentry/src/main/java/io/sentry/SentryTracer.java b/sentry/src/main/java/io/sentry/SentryTracer.java index 7abc5e4b787..acf8e05816b 100644 --- a/sentry/src/main/java/io/sentry/SentryTracer.java +++ b/sentry/src/main/java/io/sentry/SentryTracer.java @@ -514,7 +514,7 @@ public void setData(@NotNull String key, @NotNull Object value) { } @Override - public void setMeasurement(final @NotNull String name, final float value) { + public void setMeasurement(final @NotNull String name, final @NotNull Number value) { if (root.isFinished()) { return; } @@ -524,7 +524,7 @@ public void setMeasurement(final @NotNull String name, final float value) { @Override public void setMeasurement( - final @NotNull String name, final float value, final @NotNull SentryMeasurementUnit unit) { + final @NotNull String name, final @NotNull Number value, final @NotNull SentryMeasurementUnit unit) { if (root.isFinished()) { return; } diff --git a/sentry/src/main/java/io/sentry/Span.java b/sentry/src/main/java/io/sentry/Span.java index f7dd49d6853..558baa62b75 100644 --- a/sentry/src/main/java/io/sentry/Span.java +++ b/sentry/src/main/java/io/sentry/Span.java @@ -314,13 +314,13 @@ public void setData(@NotNull String key, @NotNull Object value) { } @Override - public void setMeasurement(@NotNull String name, float value) { + public void setMeasurement(@NotNull String name, @NotNull Number value) { this.transaction.setMeasurement(name, value); } @Override public void setMeasurement( - @NotNull String name, float value, @NotNull SentryMeasurementUnit unit) { + @NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit) { this.transaction.setMeasurement(name, value, unit); } diff --git a/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java b/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java index 99fafe3125c..42cf60e0938 100644 --- a/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java +++ b/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java @@ -6,6 +6,7 @@ import io.sentry.JsonObjectWriter; import io.sentry.JsonSerializable; import io.sentry.JsonUnknown; +import io.sentry.SentryLevel; import io.sentry.vendor.gson.stream.JsonToken; import java.io.IOException; import java.util.Map; @@ -19,28 +20,28 @@ public final class MeasurementValue implements JsonUnknown, JsonSerializable { @SuppressWarnings("UnusedVariable") - private final float value; + private final @NotNull Number value; private final @Nullable String unit; /** the unknown fields of breadcrumbs, internal usage only */ private @Nullable Map unknown; - public MeasurementValue(final float value, final @Nullable String unit) { + public MeasurementValue(final @NotNull Number value, final @Nullable String unit) { this.value = value; this.unit = unit; } @TestOnly public MeasurementValue( - final float value, final @Nullable String unit, final @Nullable Map unknown) { + final @NotNull Number value, final @Nullable String unit, final @Nullable Map unknown) { this.value = value; this.unit = unit; this.unknown = unknown; } @TestOnly - public float getValue() { + public @NotNull Number getValue() { return value; } @@ -94,14 +95,14 @@ public static final class Deserializer implements JsonDeserializer unknown = null; while (reader.peek() == JsonToken.NAME) { final String nextName = reader.nextName(); switch (nextName) { case JsonKeys.VALUE: - value = reader.nextFloat(); + value = (Number) reader.nextObjectOrNull(); break; case JsonKeys.UNIT: unit = reader.nextStringOrNull(); @@ -116,6 +117,14 @@ public static final class Deserializer implements JsonDeserializer() // float cannot represent 0.3 correctly https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html - fun getSut(value: Float = 0.30000001192092896f, unit: String = "test") = MeasurementValue(value, unit, mapOf("new_type" to "newtype")) + fun getSut(value: Number = 0.30000001192092896, unit: String = "test") = MeasurementValue(value, unit, mapOf("new_type" to "newtype")) } private val fixture = Fixture() @Test - fun serialize() { - val expected = sanitizedFile("json/measurement_value.json") + fun `serialize double`() { + val expected = sanitizedFile("json/measurement_value_double.json") val actual = serialize(fixture.getSut()) assertEquals(expected, actual) } @Test - fun deserialize() { - val expectedJson = sanitizedFile("json/measurement_value.json") + fun `deserialize double`() { + val expectedJson = sanitizedFile("json/measurement_value_double.json") val actual = deserialize(expectedJson) val actualJson = serialize(actual) assertEquals(expectedJson, actualJson) } + @Test + fun `serialize int`() { + val expected = sanitizedFile("json/measurement_value_int.json") + val actual = serialize(fixture.getSut(4)) + assertEquals(expected, actual) + } + + @Test + fun `deserialize int`() { + val expectedJson = sanitizedFile("json/measurement_value_int.json") + val actual = deserialize(expectedJson) + val actualJson = serialize(actual) + assertEquals(expectedJson, actualJson) + } + + @Test(expected = IllegalStateException::class) + fun `deserialize missing value`() { + val expectedJson = sanitizedFile("json/measurement_value_missing.json") + deserialize(expectedJson) + } + // Helper private fun sanitizedFile(path: String): String { diff --git a/sentry/src/test/resources/json/measurement_value.json b/sentry/src/test/resources/json/measurement_value_double.json similarity index 100% rename from sentry/src/test/resources/json/measurement_value.json rename to sentry/src/test/resources/json/measurement_value_double.json diff --git a/sentry/src/test/resources/json/measurement_value_int.json b/sentry/src/test/resources/json/measurement_value_int.json new file mode 100644 index 00000000000..944cee02d37 --- /dev/null +++ b/sentry/src/test/resources/json/measurement_value_int.json @@ -0,0 +1,5 @@ +{ + "value": 4, + "unit": "test", + "new_type": "newtype" +} diff --git a/sentry/src/test/resources/json/measurement_value_missing.json b/sentry/src/test/resources/json/measurement_value_missing.json new file mode 100644 index 00000000000..7fefbe2fa99 --- /dev/null +++ b/sentry/src/test/resources/json/measurement_value_missing.json @@ -0,0 +1,4 @@ +{ + "unit": "test", + "new_type": "newtype" +} From 63b3d70954dc60ad2b30c4e83a5170896873db9d Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Fri, 30 Sep 2022 15:45:00 +0000 Subject: [PATCH 10/23] Format code --- .../main/java/io/sentry/samples/android/MainActivity.java | 3 ++- sentry/src/main/java/io/sentry/ISpan.java | 3 ++- sentry/src/main/java/io/sentry/SentryMeasurementUnit.java | 6 ++++-- sentry/src/main/java/io/sentry/SentryTracer.java | 4 +++- .../src/main/java/io/sentry/protocol/MeasurementValue.java | 4 +++- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java index fdb5c348d08..d5784ee8213 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java @@ -205,7 +205,8 @@ protected void onResume() { screenLoadCount++; final ISpan span = Sentry.getSpan(); if (span != null) { - span.setMeasurement("screen_load_count", screenLoadCount, new SentryMeasurementUnit.Custom("test")); + span.setMeasurement( + "screen_load_count", screenLoadCount, new SentryMeasurementUnit.Custom("test")); span.finish(SpanStatus.OK); } } diff --git a/sentry/src/main/java/io/sentry/ISpan.java b/sentry/src/main/java/io/sentry/ISpan.java index 49f34ee654d..d41b9d864a7 100644 --- a/sentry/src/main/java/io/sentry/ISpan.java +++ b/sentry/src/main/java/io/sentry/ISpan.java @@ -191,5 +191,6 @@ ISpan startChild( * @param value the value of the measurement * @param unit the unit the value is measured in */ - void setMeasurement(@NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit); + void setMeasurement( + @NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit); } diff --git a/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java b/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java index d9ac8dd605b..abc6663d9bf 100644 --- a/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java +++ b/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java @@ -95,12 +95,14 @@ public Custom(@NotNull String name) { this.name = name; } - @Override public @NotNull String name() { + @Override + public @NotNull String name() { return name; } } - @NotNull String name(); + @NotNull + String name(); @ApiStatus.Internal default @NotNull String apiName() { diff --git a/sentry/src/main/java/io/sentry/SentryTracer.java b/sentry/src/main/java/io/sentry/SentryTracer.java index acf8e05816b..2fdd4e355a8 100644 --- a/sentry/src/main/java/io/sentry/SentryTracer.java +++ b/sentry/src/main/java/io/sentry/SentryTracer.java @@ -524,7 +524,9 @@ public void setMeasurement(final @NotNull String name, final @NotNull Number val @Override public void setMeasurement( - final @NotNull String name, final @NotNull Number value, final @NotNull SentryMeasurementUnit unit) { + final @NotNull String name, + final @NotNull Number value, + final @NotNull SentryMeasurementUnit unit) { if (root.isFinished()) { return; } diff --git a/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java b/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java index 42cf60e0938..40c9b557abc 100644 --- a/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java +++ b/sentry/src/main/java/io/sentry/protocol/MeasurementValue.java @@ -34,7 +34,9 @@ public MeasurementValue(final @NotNull Number value, final @Nullable String unit @TestOnly public MeasurementValue( - final @NotNull Number value, final @Nullable String unit, final @Nullable Map unknown) { + final @NotNull Number value, + final @Nullable String unit, + final @Nullable Map unknown) { this.value = value; this.unit = unit; this.unknown = unknown; From 330c28a36a3235b89d35c3dc9ce872c32624d380 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Fri, 30 Sep 2022 17:57:03 +0200 Subject: [PATCH 11/23] api dump --- sentry/api/sentry.api | 84 ++++++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 25 deletions(-) diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index e6298d82840..1723e8d9c0f 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -485,8 +485,8 @@ public abstract interface class io/sentry/ISpan { public abstract fun isFinished ()Z public abstract fun setData (Ljava/lang/String;Ljava/lang/Object;)V public abstract fun setDescription (Ljava/lang/String;)V - public abstract fun setMeasurement (Ljava/lang/String;F)V - public abstract fun setMeasurement (Ljava/lang/String;FLio/sentry/SentryMeasurementUnit;)V + public abstract fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V + public abstract fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V public abstract fun setOperation (Ljava/lang/String;)V public abstract fun setStatus (Lio/sentry/SpanStatus;)V public abstract fun setTag (Ljava/lang/String;Ljava/lang/String;)V @@ -672,8 +672,8 @@ public final class io/sentry/NoOpSpan : io/sentry/ISpan { public fun isFinished ()Z public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V - public fun setMeasurement (Ljava/lang/String;F)V - public fun setMeasurement (Ljava/lang/String;FLio/sentry/SentryMeasurementUnit;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V public fun setOperation (Ljava/lang/String;)V public fun setStatus (Lio/sentry/SpanStatus;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V @@ -709,8 +709,8 @@ public final class io/sentry/NoOpTransaction : io/sentry/ITransaction { public fun scheduleFinish ()V public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V - public fun setMeasurement (Ljava/lang/String;F)V - public fun setMeasurement (Ljava/lang/String;FLio/sentry/SentryMeasurementUnit;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V public fun setName (Ljava/lang/String;)V public fun setName (Ljava/lang/String;Lio/sentry/protocol/TransactionNameSource;)V public fun setOperation (Ljava/lang/String;)V @@ -1276,19 +1276,53 @@ public final class io/sentry/SentryLevel : java/lang/Enum, io/sentry/JsonSeriali public static fun values ()[Lio/sentry/SentryLevel; } -public final class io/sentry/SentryMeasurementUnit : java/lang/Enum { - public static final field DAY Lio/sentry/SentryMeasurementUnit; - public static final field HOUR Lio/sentry/SentryMeasurementUnit; - public static final field MICROSECOND Lio/sentry/SentryMeasurementUnit; - public static final field MILLISECOND Lio/sentry/SentryMeasurementUnit; - public static final field MINUTE Lio/sentry/SentryMeasurementUnit; - public static final field NANOSECOND Lio/sentry/SentryMeasurementUnit; - public static final field NONE Lio/sentry/SentryMeasurementUnit; - public static final field SECOND Lio/sentry/SentryMeasurementUnit; - public static final field WEEK Lio/sentry/SentryMeasurementUnit; +public abstract interface class io/sentry/SentryMeasurementUnit { public fun apiName ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryMeasurementUnit; - public static fun values ()[Lio/sentry/SentryMeasurementUnit; + public abstract fun name ()Ljava/lang/String; +} + +public final class io/sentry/SentryMeasurementUnit$Custom : io/sentry/SentryMeasurementUnit { + public fun (Ljava/lang/String;)V + public fun name ()Ljava/lang/String; +} + +public final class io/sentry/SentryMeasurementUnit$Duration : java/lang/Enum, io/sentry/SentryMeasurementUnit { + public static final field DAY Lio/sentry/SentryMeasurementUnit$Duration; + public static final field HOUR Lio/sentry/SentryMeasurementUnit$Duration; + public static final field MICROSECOND Lio/sentry/SentryMeasurementUnit$Duration; + public static final field MILLISECOND Lio/sentry/SentryMeasurementUnit$Duration; + public static final field MINUTE Lio/sentry/SentryMeasurementUnit$Duration; + public static final field NANOSECOND Lio/sentry/SentryMeasurementUnit$Duration; + public static final field SECOND Lio/sentry/SentryMeasurementUnit$Duration; + public static final field WEEK Lio/sentry/SentryMeasurementUnit$Duration; + public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryMeasurementUnit$Duration; + public static fun values ()[Lio/sentry/SentryMeasurementUnit$Duration; +} + +public final class io/sentry/SentryMeasurementUnit$Fraction : java/lang/Enum, io/sentry/SentryMeasurementUnit { + public static final field PERCENT Lio/sentry/SentryMeasurementUnit$Fraction; + public static final field RATIO Lio/sentry/SentryMeasurementUnit$Fraction; + public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryMeasurementUnit$Fraction; + public static fun values ()[Lio/sentry/SentryMeasurementUnit$Fraction; +} + +public final class io/sentry/SentryMeasurementUnit$Information : java/lang/Enum, io/sentry/SentryMeasurementUnit { + public static final field BIT Lio/sentry/SentryMeasurementUnit$Information; + public static final field BYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field EXABYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field EXBIBYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field GIBIBYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field GIGABYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field KIBIBYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field KILOBYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field MEBIBYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field MEGABYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field PEBIBYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field PETABYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field TEBIBYTE Lio/sentry/SentryMeasurementUnit$Information; + public static final field TERABYTE Lio/sentry/SentryMeasurementUnit$Information; + public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryMeasurementUnit$Information; + public static fun values ()[Lio/sentry/SentryMeasurementUnit$Information; } public class io/sentry/SentryOptions { @@ -1518,8 +1552,8 @@ public final class io/sentry/SentryTracer : io/sentry/ITransaction { public fun scheduleFinish ()V public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V - public fun setMeasurement (Ljava/lang/String;F)V - public fun setMeasurement (Ljava/lang/String;FLio/sentry/SentryMeasurementUnit;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V public fun setName (Ljava/lang/String;)V public fun setName (Ljava/lang/String;Lio/sentry/protocol/TransactionNameSource;)V public fun setOperation (Ljava/lang/String;)V @@ -1626,8 +1660,8 @@ public final class io/sentry/Span : io/sentry/ISpan { public fun isSampled ()Ljava/lang/Boolean; public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V - public fun setMeasurement (Ljava/lang/String;F)V - public fun setMeasurement (Ljava/lang/String;FLio/sentry/SentryMeasurementUnit;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V public fun setOperation (Ljava/lang/String;)V public fun setStatus (Lio/sentry/SpanStatus;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V @@ -2474,11 +2508,11 @@ public final class io/sentry/protocol/Gpu$JsonKeys { } public final class io/sentry/protocol/MeasurementValue : io/sentry/JsonSerializable, io/sentry/JsonUnknown { - public fun (FLjava/lang/String;)V - public fun (FLjava/lang/String;Ljava/util/Map;)V + public fun (Ljava/lang/Number;Ljava/lang/String;)V + public fun (Ljava/lang/Number;Ljava/lang/String;Ljava/util/Map;)V public fun getUnit ()Ljava/lang/String; public fun getUnknown ()Ljava/util/Map; - public fun getValue ()F + public fun getValue ()Ljava/lang/Number; public fun serialize (Lio/sentry/JsonObjectWriter;Lio/sentry/ILogger;)V public fun setUnknown (Ljava/util/Map;)V } From 16b9489bb76dfa270ee49b0874ba739abb0b6eed Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Fri, 30 Sep 2022 21:04:10 +0200 Subject: [PATCH 12/23] Fix test --- .../io/sentry/protocol/SentryTransactionSerializationTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry/src/test/java/io/sentry/protocol/SentryTransactionSerializationTest.kt b/sentry/src/test/java/io/sentry/protocol/SentryTransactionSerializationTest.kt index 51cbd5ce710..ec068376a2a 100644 --- a/sentry/src/test/java/io/sentry/protocol/SentryTransactionSerializationTest.kt +++ b/sentry/src/test/java/io/sentry/protocol/SentryTransactionSerializationTest.kt @@ -26,7 +26,7 @@ class SentryTransactionSerializationTest { ), mapOf( "386384cb-1162-49e7-aea1-db913d4fca63" to MeasurementValueSerializationTest.Fixture().getSut(), - "186384cb-1162-49e7-aea1-db913d4fca63" to MeasurementValueSerializationTest.Fixture().getSut(0.4000000059604645f, "test2") + "186384cb-1162-49e7-aea1-db913d4fca63" to MeasurementValueSerializationTest.Fixture().getSut(0.4000000059604645, "test2") ), TransactionInfo(TransactionNameSource.CUSTOM.apiName()) ).apply { From 04f381100282784b0a99fbe710bbac10b2724435 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 3 Oct 2022 20:10:13 +0200 Subject: [PATCH 13/23] SentryMeasurementUnit -> MeasurementUnit --- .../PerformanceAndroidEventProcessor.java | 4 +- .../PerformanceAndroidEventProcessorTest.kt | 4 +- .../sentry/samples/android/MainActivity.java | 4 +- sentry/src/main/java/io/sentry/ISpan.java | 2 +- ...surementUnit.java => MeasurementUnit.java} | 10 ++-- sentry/src/main/java/io/sentry/NoOpSpan.java | 2 +- .../main/java/io/sentry/NoOpTransaction.java | 2 +- .../src/main/java/io/sentry/SentryTracer.java | 2 +- sentry/src/main/java/io/sentry/Span.java | 2 +- .../java/io/sentry/MeasurementUnitTest.kt | 48 +++++++++++++++++++ .../io/sentry/SentryMeasurementUnitTest.kt | 48 ------------------- .../test/java/io/sentry/SentryTracerTest.kt | 2 +- 12 files changed, 65 insertions(+), 65 deletions(-) rename sentry/src/main/java/io/sentry/{SentryMeasurementUnit.java => MeasurementUnit.java} (89%) create mode 100644 sentry/src/test/java/io/sentry/MeasurementUnitTest.kt delete mode 100644 sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java index d0170b4bf80..d46dcb7cecb 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java @@ -7,7 +7,7 @@ import io.sentry.EventProcessor; import io.sentry.Hint; import io.sentry.SentryEvent; -import io.sentry.SentryMeasurementUnit; +import io.sentry.MeasurementUnit; import io.sentry.SpanContext; import io.sentry.protocol.MeasurementValue; import io.sentry.protocol.SentryId; @@ -68,7 +68,7 @@ public SentryEvent process(@NotNull SentryEvent event, @NotNull Hint hint) { if (appStartUpInterval != null) { final MeasurementValue value = new MeasurementValue( - (float) appStartUpInterval, SentryMeasurementUnit.Duration.MILLISECOND.apiName()); + (float) appStartUpInterval, MeasurementUnit.Duration.MILLISECOND.apiName()); final String appStartKey = AppStartState.getInstance().isColdStart() ? "app_start_cold" : "app_start_warm"; diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt index 88eac8b682b..3cb65a46fd2 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt @@ -5,7 +5,7 @@ import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever import io.sentry.Hint import io.sentry.IHub -import io.sentry.SentryMeasurementUnit +import io.sentry.MeasurementUnit import io.sentry.SentryTracer import io.sentry.TracesSamplingDecision import io.sentry.TransactionContext @@ -156,7 +156,7 @@ class PerformanceAndroidEventProcessorTest { val tracer = SentryTracer(context, fixture.hub) var tr = SentryTransaction(tracer) - val metrics = mapOf("frames_total" to MeasurementValue(1f, SentryMeasurementUnit.Duration.MILLISECOND.apiName())) + val metrics = mapOf("frames_total" to MeasurementValue(1f, MeasurementUnit.Duration.MILLISECOND.apiName())) whenever(fixture.activityFramesTracker.takeMetrics(any())).thenReturn(metrics) tr = sut.process(tr, Hint()) diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java index d5784ee8213..470de23b249 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java @@ -6,7 +6,7 @@ import io.sentry.Attachment; import io.sentry.ISpan; import io.sentry.Sentry; -import io.sentry.SentryMeasurementUnit; +import io.sentry.MeasurementUnit; import io.sentry.SpanStatus; import io.sentry.UserFeedback; import io.sentry.protocol.SentryId; @@ -206,7 +206,7 @@ protected void onResume() { final ISpan span = Sentry.getSpan(); if (span != null) { span.setMeasurement( - "screen_load_count", screenLoadCount, new SentryMeasurementUnit.Custom("test")); + "screen_load_count", screenLoadCount, new MeasurementUnit.Custom("test")); span.finish(SpanStatus.OK); } } diff --git a/sentry/src/main/java/io/sentry/ISpan.java b/sentry/src/main/java/io/sentry/ISpan.java index d41b9d864a7..6420fafd140 100644 --- a/sentry/src/main/java/io/sentry/ISpan.java +++ b/sentry/src/main/java/io/sentry/ISpan.java @@ -192,5 +192,5 @@ ISpan startChild( * @param unit the unit the value is measured in */ void setMeasurement( - @NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit); + @NotNull String name, @NotNull Number value, @NotNull MeasurementUnit unit); } diff --git a/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java b/sentry/src/main/java/io/sentry/MeasurementUnit.java similarity index 89% rename from sentry/src/main/java/io/sentry/SentryMeasurementUnit.java rename to sentry/src/main/java/io/sentry/MeasurementUnit.java index abc6663d9bf..eee3e27efab 100644 --- a/sentry/src/main/java/io/sentry/SentryMeasurementUnit.java +++ b/sentry/src/main/java/io/sentry/MeasurementUnit.java @@ -7,9 +7,9 @@ /** * Develop Docs */ -public interface SentryMeasurementUnit { +public interface MeasurementUnit { - enum Duration implements SentryMeasurementUnit { + enum Duration implements MeasurementUnit { /** Nanosecond (`"nanosecond"`), 10^-9 seconds. */ NANOSECOND, @@ -35,7 +35,7 @@ enum Duration implements SentryMeasurementUnit { WEEK; } - enum Information implements SentryMeasurementUnit { + enum Information implements MeasurementUnit { /** Bit (`"bit"`), corresponding to 1/8 of a byte. */ BIT, @@ -79,7 +79,7 @@ enum Information implements SentryMeasurementUnit { EXBIBYTE; } - enum Fraction implements SentryMeasurementUnit { + enum Fraction implements MeasurementUnit { /** Floating point fraction of `1`. */ RATIO, @@ -87,7 +87,7 @@ enum Fraction implements SentryMeasurementUnit { PERCENT; } - final class Custom implements SentryMeasurementUnit { + final class Custom implements MeasurementUnit { private final @NotNull String name; diff --git a/sentry/src/main/java/io/sentry/NoOpSpan.java b/sentry/src/main/java/io/sentry/NoOpSpan.java index e4f5f548d64..08388f83681 100644 --- a/sentry/src/main/java/io/sentry/NoOpSpan.java +++ b/sentry/src/main/java/io/sentry/NoOpSpan.java @@ -117,5 +117,5 @@ public void setMeasurement(@NotNull String name, @NotNull Number value) {} @Override public void setMeasurement( - @NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit) {} + @NotNull String name, @NotNull Number value, @NotNull MeasurementUnit unit) {} } diff --git a/sentry/src/main/java/io/sentry/NoOpTransaction.java b/sentry/src/main/java/io/sentry/NoOpTransaction.java index 62aac440b94..a3ca631a3bd 100644 --- a/sentry/src/main/java/io/sentry/NoOpTransaction.java +++ b/sentry/src/main/java/io/sentry/NoOpTransaction.java @@ -170,5 +170,5 @@ public void setMeasurement(@NotNull String name, @NotNull Number value) {} @Override public void setMeasurement( - @NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit) {} + @NotNull String name, @NotNull Number value, @NotNull MeasurementUnit unit) {} } diff --git a/sentry/src/main/java/io/sentry/SentryTracer.java b/sentry/src/main/java/io/sentry/SentryTracer.java index 2fdd4e355a8..37eecd101cb 100644 --- a/sentry/src/main/java/io/sentry/SentryTracer.java +++ b/sentry/src/main/java/io/sentry/SentryTracer.java @@ -526,7 +526,7 @@ public void setMeasurement(final @NotNull String name, final @NotNull Number val public void setMeasurement( final @NotNull String name, final @NotNull Number value, - final @NotNull SentryMeasurementUnit unit) { + final @NotNull MeasurementUnit unit) { if (root.isFinished()) { return; } diff --git a/sentry/src/main/java/io/sentry/Span.java b/sentry/src/main/java/io/sentry/Span.java index 558baa62b75..b149fac3794 100644 --- a/sentry/src/main/java/io/sentry/Span.java +++ b/sentry/src/main/java/io/sentry/Span.java @@ -320,7 +320,7 @@ public void setMeasurement(@NotNull String name, @NotNull Number value) { @Override public void setMeasurement( - @NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit) { + @NotNull String name, @NotNull Number value, @NotNull MeasurementUnit unit) { this.transaction.setMeasurement(name, value, unit); } diff --git a/sentry/src/test/java/io/sentry/MeasurementUnitTest.kt b/sentry/src/test/java/io/sentry/MeasurementUnitTest.kt new file mode 100644 index 00000000000..cec9c9484ee --- /dev/null +++ b/sentry/src/test/java/io/sentry/MeasurementUnitTest.kt @@ -0,0 +1,48 @@ +package io.sentry + +import kotlin.test.Test +import kotlin.test.assertEquals + +class MeasurementUnitTest { + + @Test + fun `apiName converts Duration enum to lowercase`() { + assertEquals("nanosecond", MeasurementUnit.Duration.NANOSECOND.apiName()) + assertEquals("microsecond", MeasurementUnit.Duration.MICROSECOND.apiName()) + assertEquals("millisecond", MeasurementUnit.Duration.MILLISECOND.apiName()) + assertEquals("second", MeasurementUnit.Duration.SECOND.apiName()) + assertEquals("minute", MeasurementUnit.Duration.MINUTE.apiName()) + assertEquals("hour", MeasurementUnit.Duration.HOUR.apiName()) + assertEquals("day", MeasurementUnit.Duration.DAY.apiName()) + assertEquals("week", MeasurementUnit.Duration.WEEK.apiName()) + } + + @Test + fun `apiName converts Information enum to lowercase`() { + assertEquals("bit", MeasurementUnit.Information.BIT.apiName()) + assertEquals("byte", MeasurementUnit.Information.BYTE.apiName()) + assertEquals("kilobyte", MeasurementUnit.Information.KILOBYTE.apiName()) + assertEquals("kibibyte", MeasurementUnit.Information.KIBIBYTE.apiName()) + assertEquals("megabyte", MeasurementUnit.Information.MEGABYTE.apiName()) + assertEquals("mebibyte", MeasurementUnit.Information.MEBIBYTE.apiName()) + assertEquals("gigabyte", MeasurementUnit.Information.GIGABYTE.apiName()) + assertEquals("gibibyte", MeasurementUnit.Information.GIBIBYTE.apiName()) + assertEquals("terabyte", MeasurementUnit.Information.TERABYTE.apiName()) + assertEquals("tebibyte", MeasurementUnit.Information.TEBIBYTE.apiName()) + assertEquals("petabyte", MeasurementUnit.Information.PETABYTE.apiName()) + assertEquals("pebibyte", MeasurementUnit.Information.PEBIBYTE.apiName()) + assertEquals("exabyte", MeasurementUnit.Information.EXABYTE.apiName()) + assertEquals("exbibyte", MeasurementUnit.Information.EXBIBYTE.apiName()) + } + + @Test + fun `apiName converts Fraction enum to lowercase`() { + assertEquals("ratio", MeasurementUnit.Fraction.RATIO.apiName()) + assertEquals("percent", MeasurementUnit.Fraction.PERCENT.apiName()) + } + + @Test + fun `apiName converts Custom to lowercase`() { + assertEquals("test", MeasurementUnit.Custom("Test").apiName()) + } +} diff --git a/sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt b/sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt deleted file mode 100644 index 610ebc1eb19..00000000000 --- a/sentry/src/test/java/io/sentry/SentryMeasurementUnitTest.kt +++ /dev/null @@ -1,48 +0,0 @@ -package io.sentry - -import kotlin.test.Test -import kotlin.test.assertEquals - -class SentryMeasurementUnitTest { - - @Test - fun `apiName converts Duration enum to lowercase`() { - assertEquals("nanosecond", SentryMeasurementUnit.Duration.NANOSECOND.apiName()) - assertEquals("microsecond", SentryMeasurementUnit.Duration.MICROSECOND.apiName()) - assertEquals("millisecond", SentryMeasurementUnit.Duration.MILLISECOND.apiName()) - assertEquals("second", SentryMeasurementUnit.Duration.SECOND.apiName()) - assertEquals("minute", SentryMeasurementUnit.Duration.MINUTE.apiName()) - assertEquals("hour", SentryMeasurementUnit.Duration.HOUR.apiName()) - assertEquals("day", SentryMeasurementUnit.Duration.DAY.apiName()) - assertEquals("week", SentryMeasurementUnit.Duration.WEEK.apiName()) - } - - @Test - fun `apiName converts Information enum to lowercase`() { - assertEquals("bit", SentryMeasurementUnit.Information.BIT.apiName()) - assertEquals("byte", SentryMeasurementUnit.Information.BYTE.apiName()) - assertEquals("kilobyte", SentryMeasurementUnit.Information.KILOBYTE.apiName()) - assertEquals("kibibyte", SentryMeasurementUnit.Information.KIBIBYTE.apiName()) - assertEquals("megabyte", SentryMeasurementUnit.Information.MEGABYTE.apiName()) - assertEquals("mebibyte", SentryMeasurementUnit.Information.MEBIBYTE.apiName()) - assertEquals("gigabyte", SentryMeasurementUnit.Information.GIGABYTE.apiName()) - assertEquals("gibibyte", SentryMeasurementUnit.Information.GIBIBYTE.apiName()) - assertEquals("terabyte", SentryMeasurementUnit.Information.TERABYTE.apiName()) - assertEquals("tebibyte", SentryMeasurementUnit.Information.TEBIBYTE.apiName()) - assertEquals("petabyte", SentryMeasurementUnit.Information.PETABYTE.apiName()) - assertEquals("pebibyte", SentryMeasurementUnit.Information.PEBIBYTE.apiName()) - assertEquals("exabyte", SentryMeasurementUnit.Information.EXABYTE.apiName()) - assertEquals("exbibyte", SentryMeasurementUnit.Information.EXBIBYTE.apiName()) - } - - @Test - fun `apiName converts Fraction enum to lowercase`() { - assertEquals("ratio", SentryMeasurementUnit.Fraction.RATIO.apiName()) - assertEquals("percent", SentryMeasurementUnit.Fraction.PERCENT.apiName()) - } - - @Test - fun `apiName converts Custom to lowercase`() { - assertEquals("test", SentryMeasurementUnit.Custom("Test").apiName()) - } -} diff --git a/sentry/src/test/java/io/sentry/SentryTracerTest.kt b/sentry/src/test/java/io/sentry/SentryTracerTest.kt index 67d6b966599..826534cdbe2 100644 --- a/sentry/src/test/java/io/sentry/SentryTracerTest.kt +++ b/sentry/src/test/java/io/sentry/SentryTracerTest.kt @@ -812,7 +812,7 @@ class SentryTracerTest { fun `when tracer is finished, puts custom measurements into underlying transaction`() { val transaction = fixture.getSut() transaction.setMeasurement("metric1", 1.0f) - transaction.setMeasurement("days", 2, SentryMeasurementUnit.Duration.DAY) + transaction.setMeasurement("days", 2, MeasurementUnit.Duration.DAY) transaction.finish() verify(fixture.hub).captureTransaction( From 45265a584f202b230a8eb6f62b1d166b45570687 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 3 Oct 2022 20:18:58 +0200 Subject: [PATCH 14/23] Add missing test --- .../test/java/io/sentry/SentryTracerTest.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/sentry/src/test/java/io/sentry/SentryTracerTest.kt b/sentry/src/test/java/io/sentry/SentryTracerTest.kt index 826534cdbe2..6bf9b7f10d9 100644 --- a/sentry/src/test/java/io/sentry/SentryTracerTest.kt +++ b/sentry/src/test/java/io/sentry/SentryTracerTest.kt @@ -828,4 +828,22 @@ class SentryTracerTest { anyOrNull(), ) } + + @Test + fun `setting the same measurement multiple times only keeps latest value`() { + val transaction = fixture.getSut() + transaction.setMeasurement("metric1", 1.0f) + transaction.setMeasurement("metric1", 2, MeasurementUnit.Duration.DAY) + transaction.finish() + + verify(fixture.hub).captureTransaction( + check { + assertEquals(2, it.measurements["metric1"]!!.value) + assertEquals("day", it.measurements["metric1"]!!.unit) + }, + anyOrNull(), + anyOrNull(), + anyOrNull(), + ) + } } From 03f4f928b2b3c471485bf913f3d409d7a3fb3100 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 3 Oct 2022 22:37:35 +0200 Subject: [PATCH 15/23] Add comments --- sentry/src/main/java/io/sentry/ISpan.java | 4 ++- .../main/java/io/sentry/MeasurementUnit.java | 27 ++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/sentry/src/main/java/io/sentry/ISpan.java b/sentry/src/main/java/io/sentry/ISpan.java index 6420fafd140..fe750c48762 100644 --- a/sentry/src/main/java/io/sentry/ISpan.java +++ b/sentry/src/main/java/io/sentry/ISpan.java @@ -171,7 +171,9 @@ ISpan startChild( Object getData(@NotNull String key); /** - * Set a measurement without unit. + * Set a measurement without unit. When setting the measurement without the unit, no formatting + * will be applied to the measurement value in the Sentry product, and the value will be shown + * as is. * *

NOTE: Setting a measurement with the same name on the same transaction multiple times only * keeps the last value. diff --git a/sentry/src/main/java/io/sentry/MeasurementUnit.java b/sentry/src/main/java/io/sentry/MeasurementUnit.java index eee3e27efab..d37afd685bf 100644 --- a/sentry/src/main/java/io/sentry/MeasurementUnit.java +++ b/sentry/src/main/java/io/sentry/MeasurementUnit.java @@ -5,10 +5,22 @@ import org.jetbrains.annotations.NotNull; /** - * Develop Docs + * The unit of measurement of a metric value. + * + * Units augment metric values by giving them a magnitude and semantics. There are certain types of + * units that are subdivided in their precision, such as the {@link MeasurementUnit.Duration} for + * time measurements. + * + * When using the units to custom measurements, Sentry will apply formatting to display measurement + * values in the UI. + * + * @see Develop Docs */ public interface MeasurementUnit { + /** + * A time duration. + */ enum Duration implements MeasurementUnit { /** Nanosecond (`"nanosecond"`), 10^-9 seconds. */ NANOSECOND, @@ -35,6 +47,9 @@ enum Duration implements MeasurementUnit { WEEK; } + /** + * Size of information derived from bytes. + */ enum Information implements MeasurementUnit { /** Bit (`"bit"`), corresponding to 1/8 of a byte. */ BIT, @@ -79,6 +94,9 @@ enum Information implements MeasurementUnit { EXBIBYTE; } + /** + * Fractions such as percentages. + */ enum Fraction implements MeasurementUnit { /** Floating point fraction of `1`. */ RATIO, @@ -87,6 +105,10 @@ enum Fraction implements MeasurementUnit { PERCENT; } + /** + * Custom units without builtin conversion. No formatting will be applied to the measurement value + * in the Sentry product, and the value with the unit will be shown as is. + */ final class Custom implements MeasurementUnit { private final @NotNull String name; @@ -104,6 +126,9 @@ public Custom(@NotNull String name) { @NotNull String name(); + /** + * Unit adhering to the API spec. + */ @ApiStatus.Internal default @NotNull String apiName() { return name().toLowerCase(Locale.ROOT); From ea1ef576a5aaa1185a7070a8c7bababcad5ae6bb Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 3 Oct 2022 22:41:38 +0200 Subject: [PATCH 16/23] Add NONE unit back --- .../java/io/sentry/android/core/ActivityFramesTracker.java | 7 ++++--- sentry/src/main/java/io/sentry/MeasurementUnit.java | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java index b6b7dc44bf3..c69369132e7 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java @@ -4,6 +4,7 @@ import android.util.SparseIntArray; import androidx.core.app.FrameMetricsAggregator; import io.sentry.ILogger; +import io.sentry.MeasurementUnit; import io.sentry.protocol.MeasurementValue; import io.sentry.protocol.SentryId; import java.util.HashMap; @@ -102,9 +103,9 @@ public synchronized void setMetrics( return; } - final MeasurementValue tfValues = new MeasurementValue(totalFrames, null); - final MeasurementValue sfValues = new MeasurementValue(slowFrames, null); - final MeasurementValue ffValues = new MeasurementValue(frozenFrames, null); + final MeasurementValue tfValues = new MeasurementValue(totalFrames, MeasurementUnit.NONE); + final MeasurementValue sfValues = new MeasurementValue(slowFrames, MeasurementUnit.NONE); + final MeasurementValue ffValues = new MeasurementValue(frozenFrames, MeasurementUnit.NONE); final Map measurements = new HashMap<>(); measurements.put("frames_total", tfValues); measurements.put("frames_slow", sfValues); diff --git a/sentry/src/main/java/io/sentry/MeasurementUnit.java b/sentry/src/main/java/io/sentry/MeasurementUnit.java index d37afd685bf..82fa8ce31c4 100644 --- a/sentry/src/main/java/io/sentry/MeasurementUnit.java +++ b/sentry/src/main/java/io/sentry/MeasurementUnit.java @@ -18,6 +18,11 @@ */ public interface MeasurementUnit { + /** + * Untyped value. + */ + String NONE = "none"; + /** * A time duration. */ From 62809fbc1120c6fbd01f0977f98eb2847f5b3078 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 3 Oct 2022 22:45:04 +0200 Subject: [PATCH 17/23] api dump --- sentry/api/sentry.api | 109 +++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 1723e8d9c0f..70d4d0c11f6 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -486,7 +486,7 @@ public abstract interface class io/sentry/ISpan { public abstract fun setData (Ljava/lang/String;Ljava/lang/Object;)V public abstract fun setDescription (Ljava/lang/String;)V public abstract fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V - public abstract fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V + public abstract fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/MeasurementUnit;)V public abstract fun setOperation (Ljava/lang/String;)V public abstract fun setStatus (Lio/sentry/SpanStatus;)V public abstract fun setTag (Ljava/lang/String;Ljava/lang/String;)V @@ -601,6 +601,56 @@ public final class io/sentry/MainEventProcessor : io/sentry/EventProcessor, java public fun process (Lio/sentry/protocol/SentryTransaction;Lio/sentry/Hint;)Lio/sentry/protocol/SentryTransaction; } +public abstract interface class io/sentry/MeasurementUnit { + public static final field NONE Ljava/lang/String; + public fun apiName ()Ljava/lang/String; + public abstract fun name ()Ljava/lang/String; +} + +public final class io/sentry/MeasurementUnit$Custom : io/sentry/MeasurementUnit { + public fun (Ljava/lang/String;)V + public fun name ()Ljava/lang/String; +} + +public final class io/sentry/MeasurementUnit$Duration : java/lang/Enum, io/sentry/MeasurementUnit { + public static final field DAY Lio/sentry/MeasurementUnit$Duration; + public static final field HOUR Lio/sentry/MeasurementUnit$Duration; + public static final field MICROSECOND Lio/sentry/MeasurementUnit$Duration; + public static final field MILLISECOND Lio/sentry/MeasurementUnit$Duration; + public static final field MINUTE Lio/sentry/MeasurementUnit$Duration; + public static final field NANOSECOND Lio/sentry/MeasurementUnit$Duration; + public static final field SECOND Lio/sentry/MeasurementUnit$Duration; + public static final field WEEK Lio/sentry/MeasurementUnit$Duration; + public static fun valueOf (Ljava/lang/String;)Lio/sentry/MeasurementUnit$Duration; + public static fun values ()[Lio/sentry/MeasurementUnit$Duration; +} + +public final class io/sentry/MeasurementUnit$Fraction : java/lang/Enum, io/sentry/MeasurementUnit { + public static final field PERCENT Lio/sentry/MeasurementUnit$Fraction; + public static final field RATIO Lio/sentry/MeasurementUnit$Fraction; + public static fun valueOf (Ljava/lang/String;)Lio/sentry/MeasurementUnit$Fraction; + public static fun values ()[Lio/sentry/MeasurementUnit$Fraction; +} + +public final class io/sentry/MeasurementUnit$Information : java/lang/Enum, io/sentry/MeasurementUnit { + public static final field BIT Lio/sentry/MeasurementUnit$Information; + public static final field BYTE Lio/sentry/MeasurementUnit$Information; + public static final field EXABYTE Lio/sentry/MeasurementUnit$Information; + public static final field EXBIBYTE Lio/sentry/MeasurementUnit$Information; + public static final field GIBIBYTE Lio/sentry/MeasurementUnit$Information; + public static final field GIGABYTE Lio/sentry/MeasurementUnit$Information; + public static final field KIBIBYTE Lio/sentry/MeasurementUnit$Information; + public static final field KILOBYTE Lio/sentry/MeasurementUnit$Information; + public static final field MEBIBYTE Lio/sentry/MeasurementUnit$Information; + public static final field MEGABYTE Lio/sentry/MeasurementUnit$Information; + public static final field PEBIBYTE Lio/sentry/MeasurementUnit$Information; + public static final field PETABYTE Lio/sentry/MeasurementUnit$Information; + public static final field TEBIBYTE Lio/sentry/MeasurementUnit$Information; + public static final field TERABYTE Lio/sentry/MeasurementUnit$Information; + public static fun valueOf (Ljava/lang/String;)Lio/sentry/MeasurementUnit$Information; + public static fun values ()[Lio/sentry/MeasurementUnit$Information; +} + public final class io/sentry/NoOpEnvelopeReader : io/sentry/IEnvelopeReader { public static fun getInstance ()Lio/sentry/NoOpEnvelopeReader; public fun read (Ljava/io/InputStream;)Lio/sentry/SentryEnvelope; @@ -673,7 +723,7 @@ public final class io/sentry/NoOpSpan : io/sentry/ISpan { public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V - public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/MeasurementUnit;)V public fun setOperation (Ljava/lang/String;)V public fun setStatus (Lio/sentry/SpanStatus;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V @@ -710,7 +760,7 @@ public final class io/sentry/NoOpTransaction : io/sentry/ITransaction { public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V - public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/MeasurementUnit;)V public fun setName (Ljava/lang/String;)V public fun setName (Ljava/lang/String;Lio/sentry/protocol/TransactionNameSource;)V public fun setOperation (Ljava/lang/String;)V @@ -1276,55 +1326,6 @@ public final class io/sentry/SentryLevel : java/lang/Enum, io/sentry/JsonSeriali public static fun values ()[Lio/sentry/SentryLevel; } -public abstract interface class io/sentry/SentryMeasurementUnit { - public fun apiName ()Ljava/lang/String; - public abstract fun name ()Ljava/lang/String; -} - -public final class io/sentry/SentryMeasurementUnit$Custom : io/sentry/SentryMeasurementUnit { - public fun (Ljava/lang/String;)V - public fun name ()Ljava/lang/String; -} - -public final class io/sentry/SentryMeasurementUnit$Duration : java/lang/Enum, io/sentry/SentryMeasurementUnit { - public static final field DAY Lio/sentry/SentryMeasurementUnit$Duration; - public static final field HOUR Lio/sentry/SentryMeasurementUnit$Duration; - public static final field MICROSECOND Lio/sentry/SentryMeasurementUnit$Duration; - public static final field MILLISECOND Lio/sentry/SentryMeasurementUnit$Duration; - public static final field MINUTE Lio/sentry/SentryMeasurementUnit$Duration; - public static final field NANOSECOND Lio/sentry/SentryMeasurementUnit$Duration; - public static final field SECOND Lio/sentry/SentryMeasurementUnit$Duration; - public static final field WEEK Lio/sentry/SentryMeasurementUnit$Duration; - public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryMeasurementUnit$Duration; - public static fun values ()[Lio/sentry/SentryMeasurementUnit$Duration; -} - -public final class io/sentry/SentryMeasurementUnit$Fraction : java/lang/Enum, io/sentry/SentryMeasurementUnit { - public static final field PERCENT Lio/sentry/SentryMeasurementUnit$Fraction; - public static final field RATIO Lio/sentry/SentryMeasurementUnit$Fraction; - public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryMeasurementUnit$Fraction; - public static fun values ()[Lio/sentry/SentryMeasurementUnit$Fraction; -} - -public final class io/sentry/SentryMeasurementUnit$Information : java/lang/Enum, io/sentry/SentryMeasurementUnit { - public static final field BIT Lio/sentry/SentryMeasurementUnit$Information; - public static final field BYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field EXABYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field EXBIBYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field GIBIBYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field GIGABYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field KIBIBYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field KILOBYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field MEBIBYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field MEGABYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field PEBIBYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field PETABYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field TEBIBYTE Lio/sentry/SentryMeasurementUnit$Information; - public static final field TERABYTE Lio/sentry/SentryMeasurementUnit$Information; - public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryMeasurementUnit$Information; - public static fun values ()[Lio/sentry/SentryMeasurementUnit$Information; -} - public class io/sentry/SentryOptions { public fun ()V public fun addContextTag (Ljava/lang/String;)V @@ -1553,7 +1554,7 @@ public final class io/sentry/SentryTracer : io/sentry/ITransaction { public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V - public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/MeasurementUnit;)V public fun setName (Ljava/lang/String;)V public fun setName (Ljava/lang/String;Lio/sentry/protocol/TransactionNameSource;)V public fun setOperation (Ljava/lang/String;)V @@ -1661,7 +1662,7 @@ public final class io/sentry/Span : io/sentry/ISpan { public fun setData (Ljava/lang/String;Ljava/lang/Object;)V public fun setDescription (Ljava/lang/String;)V public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V - public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V + public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/MeasurementUnit;)V public fun setOperation (Ljava/lang/String;)V public fun setStatus (Lio/sentry/SpanStatus;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V From 290a86f7550f04b8e0c1a49cee7d5bc721d195aa Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Mon, 3 Oct 2022 20:48:16 +0000 Subject: [PATCH 18/23] Format code --- .../PerformanceAndroidEventProcessor.java | 2 +- .../sentry/samples/android/MainActivity.java | 5 ++- sentry/src/main/java/io/sentry/ISpan.java | 7 ++--- .../main/java/io/sentry/MeasurementUnit.java | 31 +++++++------------ 4 files changed, 17 insertions(+), 28 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java index d46dcb7cecb..669f34c80e9 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java @@ -6,8 +6,8 @@ import io.sentry.EventProcessor; import io.sentry.Hint; -import io.sentry.SentryEvent; import io.sentry.MeasurementUnit; +import io.sentry.SentryEvent; import io.sentry.SpanContext; import io.sentry.protocol.MeasurementValue; import io.sentry.protocol.SentryId; diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java index 470de23b249..6f3c4016339 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java @@ -5,8 +5,8 @@ import androidx.appcompat.app.AppCompatActivity; import io.sentry.Attachment; import io.sentry.ISpan; -import io.sentry.Sentry; import io.sentry.MeasurementUnit; +import io.sentry.Sentry; import io.sentry.SpanStatus; import io.sentry.UserFeedback; import io.sentry.protocol.SentryId; @@ -205,8 +205,7 @@ protected void onResume() { screenLoadCount++; final ISpan span = Sentry.getSpan(); if (span != null) { - span.setMeasurement( - "screen_load_count", screenLoadCount, new MeasurementUnit.Custom("test")); + span.setMeasurement("screen_load_count", screenLoadCount, new MeasurementUnit.Custom("test")); span.finish(SpanStatus.OK); } } diff --git a/sentry/src/main/java/io/sentry/ISpan.java b/sentry/src/main/java/io/sentry/ISpan.java index fe750c48762..ab4bfdffe5b 100644 --- a/sentry/src/main/java/io/sentry/ISpan.java +++ b/sentry/src/main/java/io/sentry/ISpan.java @@ -172,8 +172,8 @@ ISpan startChild( /** * Set a measurement without unit. When setting the measurement without the unit, no formatting - * will be applied to the measurement value in the Sentry product, and the value will be shown - * as is. + * will be applied to the measurement value in the Sentry product, and the value will be shown as + * is. * *

NOTE: Setting a measurement with the same name on the same transaction multiple times only * keeps the last value. @@ -193,6 +193,5 @@ ISpan startChild( * @param value the value of the measurement * @param unit the unit the value is measured in */ - void setMeasurement( - @NotNull String name, @NotNull Number value, @NotNull MeasurementUnit unit); + void setMeasurement(@NotNull String name, @NotNull Number value, @NotNull MeasurementUnit unit); } diff --git a/sentry/src/main/java/io/sentry/MeasurementUnit.java b/sentry/src/main/java/io/sentry/MeasurementUnit.java index 82fa8ce31c4..e5e2a43bbc5 100644 --- a/sentry/src/main/java/io/sentry/MeasurementUnit.java +++ b/sentry/src/main/java/io/sentry/MeasurementUnit.java @@ -7,25 +7,22 @@ /** * The unit of measurement of a metric value. * - * Units augment metric values by giving them a magnitude and semantics. There are certain types of - * units that are subdivided in their precision, such as the {@link MeasurementUnit.Duration} for + *

Units augment metric values by giving them a magnitude and semantics. There are certain types + * of units that are subdivided in their precision, such as the {@link MeasurementUnit.Duration} for * time measurements. * - * When using the units to custom measurements, Sentry will apply formatting to display measurement - * values in the UI. + *

When using the units to custom measurements, Sentry will apply formatting to display + * measurement values in the UI. * - * @see Develop Docs + * @see Develop + * Docs */ public interface MeasurementUnit { - /** - * Untyped value. - */ + /** Untyped value. */ String NONE = "none"; - /** - * A time duration. - */ + /** A time duration. */ enum Duration implements MeasurementUnit { /** Nanosecond (`"nanosecond"`), 10^-9 seconds. */ NANOSECOND, @@ -52,9 +49,7 @@ enum Duration implements MeasurementUnit { WEEK; } - /** - * Size of information derived from bytes. - */ + /** Size of information derived from bytes. */ enum Information implements MeasurementUnit { /** Bit (`"bit"`), corresponding to 1/8 of a byte. */ BIT, @@ -99,9 +94,7 @@ enum Information implements MeasurementUnit { EXBIBYTE; } - /** - * Fractions such as percentages. - */ + /** Fractions such as percentages. */ enum Fraction implements MeasurementUnit { /** Floating point fraction of `1`. */ RATIO, @@ -131,9 +124,7 @@ public Custom(@NotNull String name) { @NotNull String name(); - /** - * Unit adhering to the API spec. - */ + /** Unit adhering to the API spec. */ @ApiStatus.Internal default @NotNull String apiName() { return name().toLowerCase(Locale.ROOT); From 0d2e6b1a5dc84b3701ce9cddd9f4a0e8a8be2f67 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 4 Oct 2022 16:18:58 +0200 Subject: [PATCH 19/23] Add @Internal annotation to NONE unit --- sentry/src/main/java/io/sentry/MeasurementUnit.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry/src/main/java/io/sentry/MeasurementUnit.java b/sentry/src/main/java/io/sentry/MeasurementUnit.java index e5e2a43bbc5..c26422736cf 100644 --- a/sentry/src/main/java/io/sentry/MeasurementUnit.java +++ b/sentry/src/main/java/io/sentry/MeasurementUnit.java @@ -20,6 +20,7 @@ public interface MeasurementUnit { /** Untyped value. */ + @ApiStatus.Internal String NONE = "none"; /** A time duration. */ From 4e4598f2475065cc4fb2ba63234fa045e61d3ab4 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Tue, 4 Oct 2022 14:22:55 +0000 Subject: [PATCH 20/23] Format code --- sentry/src/main/java/io/sentry/MeasurementUnit.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sentry/src/main/java/io/sentry/MeasurementUnit.java b/sentry/src/main/java/io/sentry/MeasurementUnit.java index c26422736cf..5dc00261d1e 100644 --- a/sentry/src/main/java/io/sentry/MeasurementUnit.java +++ b/sentry/src/main/java/io/sentry/MeasurementUnit.java @@ -20,8 +20,7 @@ public interface MeasurementUnit { /** Untyped value. */ - @ApiStatus.Internal - String NONE = "none"; + @ApiStatus.Internal String NONE = "none"; /** A time duration. */ enum Duration implements MeasurementUnit { From 68519fdcb8aa7a8f55d54f0fd77cb3103df2691c Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 4 Oct 2022 17:08:42 +0200 Subject: [PATCH 21/23] Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44df2feb2d1..c2949e12962 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Features + - Provide API for attaching custom measurements to transactions ([#2260](https://github.com/getsentry/sentry-java/pull/2260)) ## 6.5.0-beta.2 From 457b04a2edb43aab7ca038833c1b488f5e660646 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 4 Oct 2022 17:08:53 +0200 Subject: [PATCH 22/23] Changelog --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2949e12962..44df2feb2d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,6 @@ ### Features - - Provide API for attaching custom measurements to transactions ([#2260](https://github.com/getsentry/sentry-java/pull/2260)) ## 6.5.0-beta.2 From f1747c853d55290e24361fda3b35d7df97e187f5 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Tue, 4 Oct 2022 17:38:46 +0200 Subject: [PATCH 23/23] Fix test --- .../io/sentry/android/core/ActivityFramesTrackerTest.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt index 45bc38443ec..d48185d7449 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt @@ -42,7 +42,7 @@ class ActivityFramesTrackerTest { val totalFrames = metrics!!["frames_total"] assertEquals(totalFrames!!.value, 1) - assertEquals(totalFrames.unit, null) + assertEquals(totalFrames.unit, "none") } @Test @@ -58,7 +58,7 @@ class ActivityFramesTrackerTest { val frozenFrames = metrics!!["frames_frozen"] assertEquals(frozenFrames!!.value, 5) - assertEquals(frozenFrames.unit, null) + assertEquals(frozenFrames.unit, "none") } @Test @@ -74,7 +74,7 @@ class ActivityFramesTrackerTest { val slowFrames = metrics!!["frames_slow"] assertEquals(slowFrames!!.value, 5) - assertEquals(slowFrames.unit, null) + assertEquals(slowFrames.unit, "none") } @Test