Skip to content

Commit 1554df9

Browse files
authored
Merge 330c28a into 7300956
2 parents 7300956 + 330c28a commit 1554df9

File tree

21 files changed

+418
-38
lines changed

21 files changed

+418
-38
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
### Features
6+
7+
- Provide API for attaching custom measurements to transactions ([#2260](https://github.com/getsentry/sentry-java/pull/2260))
8+
39
## 6.5.0-beta.2
410

511
### Features

sentry-android-core/src/main/java/io/sentry/android/core/ActivityFramesTracker.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package io.sentry.android.core;
22

3-
import static io.sentry.protocol.MeasurementValue.NONE_UNIT;
4-
53
import android.app.Activity;
64
import android.util.SparseIntArray;
75
import androidx.core.app.FrameMetricsAggregator;
@@ -104,9 +102,9 @@ public synchronized void setMetrics(
104102
return;
105103
}
106104

107-
final MeasurementValue tfValues = new MeasurementValue(totalFrames, NONE_UNIT);
108-
final MeasurementValue sfValues = new MeasurementValue(slowFrames, NONE_UNIT);
109-
final MeasurementValue ffValues = new MeasurementValue(frozenFrames, NONE_UNIT);
105+
final MeasurementValue tfValues = new MeasurementValue(totalFrames, null);
106+
final MeasurementValue sfValues = new MeasurementValue(slowFrames, null);
107+
final MeasurementValue ffValues = new MeasurementValue(frozenFrames, null);
110108
final Map<String, @NotNull MeasurementValue> measurements = new HashMap<>();
111109
measurements.put("frames_total", tfValues);
112110
measurements.put("frames_slow", sfValues);

sentry-android-core/src/main/java/io/sentry/android/core/PerformanceAndroidEventProcessor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
import static io.sentry.android.core.ActivityLifecycleIntegration.APP_START_COLD;
44
import static io.sentry.android.core.ActivityLifecycleIntegration.APP_START_WARM;
55
import static io.sentry.android.core.ActivityLifecycleIntegration.UI_LOAD_OP;
6-
import static io.sentry.protocol.MeasurementValue.MILLISECOND_UNIT;
76

87
import io.sentry.EventProcessor;
98
import io.sentry.Hint;
109
import io.sentry.SentryEvent;
10+
import io.sentry.SentryMeasurementUnit;
1111
import io.sentry.SpanContext;
1212
import io.sentry.protocol.MeasurementValue;
1313
import io.sentry.protocol.SentryId;
@@ -67,7 +67,8 @@ public SentryEvent process(@NotNull SentryEvent event, @NotNull Hint hint) {
6767
// if appStartUpInterval is null, metrics are not ready to be sent
6868
if (appStartUpInterval != null) {
6969
final MeasurementValue value =
70-
new MeasurementValue((float) appStartUpInterval, MILLISECOND_UNIT);
70+
new MeasurementValue(
71+
(float) appStartUpInterval, SentryMeasurementUnit.Duration.MILLISECOND.apiName());
7172

7273
final String appStartKey =
7374
AppStartState.getInstance().isColdStart() ? "app_start_cold" : "app_start_warm";

sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ class ActivityFramesTrackerTest {
4141
val metrics = sut.takeMetrics(fixture.sentryId)
4242
val totalFrames = metrics!!["frames_total"]
4343

44-
assertEquals(totalFrames!!.value, 1f)
45-
assertEquals(totalFrames.unit, "none")
44+
assertEquals(totalFrames!!.value, 1)
45+
assertEquals(totalFrames.unit, null)
4646
}
4747

4848
@Test
@@ -57,8 +57,8 @@ class ActivityFramesTrackerTest {
5757
val metrics = sut.takeMetrics(fixture.sentryId)
5858
val frozenFrames = metrics!!["frames_frozen"]
5959

60-
assertEquals(frozenFrames!!.value, 5f)
61-
assertEquals(frozenFrames.unit, "none")
60+
assertEquals(frozenFrames!!.value, 5)
61+
assertEquals(frozenFrames.unit, null)
6262
}
6363

6464
@Test
@@ -73,8 +73,8 @@ class ActivityFramesTrackerTest {
7373
val metrics = sut.takeMetrics(fixture.sentryId)
7474
val slowFrames = metrics!!["frames_slow"]
7575

76-
assertEquals(slowFrames!!.value, 5f)
77-
assertEquals(slowFrames.unit, "none")
76+
assertEquals(slowFrames!!.value, 5)
77+
assertEquals(slowFrames.unit, null)
7878
}
7979

8080
@Test
@@ -93,13 +93,13 @@ class ActivityFramesTrackerTest {
9393
val metrics = sut.takeMetrics(fixture.sentryId)
9494

9595
val totalFrames = metrics!!["frames_total"]
96-
assertEquals(totalFrames!!.value, 111f)
96+
assertEquals(totalFrames!!.value, 111)
9797

9898
val frozenFrames = metrics["frames_frozen"]
99-
assertEquals(frozenFrames!!.value, 6f)
99+
assertEquals(frozenFrames!!.value, 6)
100100

101101
val slowFrames = metrics["frames_slow"]
102-
assertEquals(slowFrames!!.value, 5f)
102+
assertEquals(slowFrames!!.value, 5)
103103
}
104104

105105
@Test

sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ import com.nhaarman.mockitokotlin2.mock
55
import com.nhaarman.mockitokotlin2.whenever
66
import io.sentry.Hint
77
import io.sentry.IHub
8+
import io.sentry.SentryMeasurementUnit
89
import io.sentry.SentryTracer
910
import io.sentry.TracesSamplingDecision
1011
import io.sentry.TransactionContext
1112
import io.sentry.android.core.ActivityLifecycleIntegration.UI_LOAD_OP
1213
import io.sentry.protocol.MeasurementValue
13-
import io.sentry.protocol.MeasurementValue.MILLISECOND_UNIT
1414
import io.sentry.protocol.SentryTransaction
1515
import java.util.Date
1616
import kotlin.test.BeforeTest
@@ -156,7 +156,7 @@ class PerformanceAndroidEventProcessorTest {
156156
val tracer = SentryTracer(context, fixture.hub)
157157
var tr = SentryTransaction(tracer)
158158

159-
val metrics = mapOf("frames_total" to MeasurementValue(1f, MILLISECOND_UNIT))
159+
val metrics = mapOf("frames_total" to MeasurementValue(1f, SentryMeasurementUnit.Duration.MILLISECOND.apiName()))
160160
whenever(fixture.activityFramesTracker.takeMetrics(any())).thenReturn(metrics)
161161

162162
tr = sut.process(tr, Hint())

sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.sentry.Attachment;
77
import io.sentry.ISpan;
88
import io.sentry.Sentry;
9+
import io.sentry.SentryMeasurementUnit;
910
import io.sentry.SpanStatus;
1011
import io.sentry.UserFeedback;
1112
import io.sentry.protocol.SentryId;
@@ -27,6 +28,7 @@
2728
public class MainActivity extends AppCompatActivity {
2829

2930
private int crashCount = 0;
31+
private int screenLoadCount = 0;
3032

3133
@Override
3234
protected void onCreate(Bundle savedInstanceState) {
@@ -200,8 +202,11 @@ protected void onCreate(Bundle savedInstanceState) {
200202
@Override
201203
protected void onResume() {
202204
super.onResume();
205+
screenLoadCount++;
203206
final ISpan span = Sentry.getSpan();
204207
if (span != null) {
208+
span.setMeasurement(
209+
"screen_load_count", screenLoadCount, new SentryMeasurementUnit.Custom("test"));
205210
span.finish(SpanStatus.OK);
206211
}
207212
}

sentry-samples/sentry-samples-spring-boot/src/main/java/io/sentry/samples/spring/boot/PersonService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.sentry.samples.spring.boot;
22

3+
import io.sentry.ISpan;
4+
import io.sentry.Sentry;
35
import io.sentry.spring.tracing.SentrySpan;
46
import org.slf4j.Logger;
57
import org.slf4j.LoggerFactory;
@@ -16,12 +18,19 @@ public class PersonService {
1618
private static final Logger LOGGER = LoggerFactory.getLogger(PersonService.class);
1719

1820
private final JdbcTemplate jdbcTemplate;
21+
private int createCount = 0;
1922

2023
public PersonService(JdbcTemplate jdbcTemplate) {
2124
this.jdbcTemplate = jdbcTemplate;
2225
}
2326

2427
Person create(Person person) {
28+
createCount++;
29+
final ISpan span = Sentry.getSpan();
30+
if (span != null) {
31+
span.setMeasurement("create_count", createCount);
32+
}
33+
2534
jdbcTemplate.update(
2635
"insert into person (firstName, lastName) values (?, ?)",
2736
person.getFirstName(),

sentry/api/sentry.api

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,8 @@ public abstract interface class io/sentry/ISpan {
485485
public abstract fun isFinished ()Z
486486
public abstract fun setData (Ljava/lang/String;Ljava/lang/Object;)V
487487
public abstract fun setDescription (Ljava/lang/String;)V
488+
public abstract fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V
489+
public abstract fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V
488490
public abstract fun setOperation (Ljava/lang/String;)V
489491
public abstract fun setStatus (Lio/sentry/SpanStatus;)V
490492
public abstract fun setTag (Ljava/lang/String;Ljava/lang/String;)V
@@ -670,6 +672,8 @@ public final class io/sentry/NoOpSpan : io/sentry/ISpan {
670672
public fun isFinished ()Z
671673
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
672674
public fun setDescription (Ljava/lang/String;)V
675+
public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V
676+
public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V
673677
public fun setOperation (Ljava/lang/String;)V
674678
public fun setStatus (Lio/sentry/SpanStatus;)V
675679
public fun setTag (Ljava/lang/String;Ljava/lang/String;)V
@@ -705,6 +709,8 @@ public final class io/sentry/NoOpTransaction : io/sentry/ITransaction {
705709
public fun scheduleFinish ()V
706710
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
707711
public fun setDescription (Ljava/lang/String;)V
712+
public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V
713+
public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V
708714
public fun setName (Ljava/lang/String;)V
709715
public fun setName (Ljava/lang/String;Lio/sentry/protocol/TransactionNameSource;)V
710716
public fun setOperation (Ljava/lang/String;)V
@@ -1270,6 +1276,55 @@ public final class io/sentry/SentryLevel : java/lang/Enum, io/sentry/JsonSeriali
12701276
public static fun values ()[Lio/sentry/SentryLevel;
12711277
}
12721278

1279+
public abstract interface class io/sentry/SentryMeasurementUnit {
1280+
public fun apiName ()Ljava/lang/String;
1281+
public abstract fun name ()Ljava/lang/String;
1282+
}
1283+
1284+
public final class io/sentry/SentryMeasurementUnit$Custom : io/sentry/SentryMeasurementUnit {
1285+
public fun <init> (Ljava/lang/String;)V
1286+
public fun name ()Ljava/lang/String;
1287+
}
1288+
1289+
public final class io/sentry/SentryMeasurementUnit$Duration : java/lang/Enum, io/sentry/SentryMeasurementUnit {
1290+
public static final field DAY Lio/sentry/SentryMeasurementUnit$Duration;
1291+
public static final field HOUR Lio/sentry/SentryMeasurementUnit$Duration;
1292+
public static final field MICROSECOND Lio/sentry/SentryMeasurementUnit$Duration;
1293+
public static final field MILLISECOND Lio/sentry/SentryMeasurementUnit$Duration;
1294+
public static final field MINUTE Lio/sentry/SentryMeasurementUnit$Duration;
1295+
public static final field NANOSECOND Lio/sentry/SentryMeasurementUnit$Duration;
1296+
public static final field SECOND Lio/sentry/SentryMeasurementUnit$Duration;
1297+
public static final field WEEK Lio/sentry/SentryMeasurementUnit$Duration;
1298+
public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryMeasurementUnit$Duration;
1299+
public static fun values ()[Lio/sentry/SentryMeasurementUnit$Duration;
1300+
}
1301+
1302+
public final class io/sentry/SentryMeasurementUnit$Fraction : java/lang/Enum, io/sentry/SentryMeasurementUnit {
1303+
public static final field PERCENT Lio/sentry/SentryMeasurementUnit$Fraction;
1304+
public static final field RATIO Lio/sentry/SentryMeasurementUnit$Fraction;
1305+
public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryMeasurementUnit$Fraction;
1306+
public static fun values ()[Lio/sentry/SentryMeasurementUnit$Fraction;
1307+
}
1308+
1309+
public final class io/sentry/SentryMeasurementUnit$Information : java/lang/Enum, io/sentry/SentryMeasurementUnit {
1310+
public static final field BIT Lio/sentry/SentryMeasurementUnit$Information;
1311+
public static final field BYTE Lio/sentry/SentryMeasurementUnit$Information;
1312+
public static final field EXABYTE Lio/sentry/SentryMeasurementUnit$Information;
1313+
public static final field EXBIBYTE Lio/sentry/SentryMeasurementUnit$Information;
1314+
public static final field GIBIBYTE Lio/sentry/SentryMeasurementUnit$Information;
1315+
public static final field GIGABYTE Lio/sentry/SentryMeasurementUnit$Information;
1316+
public static final field KIBIBYTE Lio/sentry/SentryMeasurementUnit$Information;
1317+
public static final field KILOBYTE Lio/sentry/SentryMeasurementUnit$Information;
1318+
public static final field MEBIBYTE Lio/sentry/SentryMeasurementUnit$Information;
1319+
public static final field MEGABYTE Lio/sentry/SentryMeasurementUnit$Information;
1320+
public static final field PEBIBYTE Lio/sentry/SentryMeasurementUnit$Information;
1321+
public static final field PETABYTE Lio/sentry/SentryMeasurementUnit$Information;
1322+
public static final field TEBIBYTE Lio/sentry/SentryMeasurementUnit$Information;
1323+
public static final field TERABYTE Lio/sentry/SentryMeasurementUnit$Information;
1324+
public static fun valueOf (Ljava/lang/String;)Lio/sentry/SentryMeasurementUnit$Information;
1325+
public static fun values ()[Lio/sentry/SentryMeasurementUnit$Information;
1326+
}
1327+
12731328
public class io/sentry/SentryOptions {
12741329
public fun <init> ()V
12751330
public fun addContextTag (Ljava/lang/String;)V
@@ -1497,6 +1552,8 @@ public final class io/sentry/SentryTracer : io/sentry/ITransaction {
14971552
public fun scheduleFinish ()V
14981553
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
14991554
public fun setDescription (Ljava/lang/String;)V
1555+
public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V
1556+
public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V
15001557
public fun setName (Ljava/lang/String;)V
15011558
public fun setName (Ljava/lang/String;Lio/sentry/protocol/TransactionNameSource;)V
15021559
public fun setOperation (Ljava/lang/String;)V
@@ -1603,6 +1660,8 @@ public final class io/sentry/Span : io/sentry/ISpan {
16031660
public fun isSampled ()Ljava/lang/Boolean;
16041661
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
16051662
public fun setDescription (Ljava/lang/String;)V
1663+
public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V
1664+
public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;Lio/sentry/SentryMeasurementUnit;)V
16061665
public fun setOperation (Ljava/lang/String;)V
16071666
public fun setStatus (Lio/sentry/SpanStatus;)V
16081667
public fun setTag (Ljava/lang/String;Ljava/lang/String;)V
@@ -2449,13 +2508,11 @@ public final class io/sentry/protocol/Gpu$JsonKeys {
24492508
}
24502509

24512510
public final class io/sentry/protocol/MeasurementValue : io/sentry/JsonSerializable, io/sentry/JsonUnknown {
2452-
public static final field MILLISECOND_UNIT Ljava/lang/String;
2453-
public static final field NONE_UNIT Ljava/lang/String;
2454-
public fun <init> (FLjava/lang/String;)V
2455-
public fun <init> (FLjava/lang/String;Ljava/util/Map;)V
2511+
public fun <init> (Ljava/lang/Number;Ljava/lang/String;)V
2512+
public fun <init> (Ljava/lang/Number;Ljava/lang/String;Ljava/util/Map;)V
24562513
public fun getUnit ()Ljava/lang/String;
24572514
public fun getUnknown ()Ljava/util/Map;
2458-
public fun getValue ()F
2515+
public fun getValue ()Ljava/lang/Number;
24592516
public fun serialize (Lio/sentry/JsonObjectWriter;Lio/sentry/ILogger;)V
24602517
public fun setUnknown (Ljava/util/Map;)V
24612518
}

sentry/src/main/java/io/sentry/ISpan.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,28 @@ ISpan startChild(
169169
*/
170170
@Nullable
171171
Object getData(@NotNull String key);
172+
173+
/**
174+
* Set a measurement without unit.
175+
*
176+
* <p>NOTE: Setting a measurement with the same name on the same transaction multiple times only
177+
* keeps the last value.
178+
*
179+
* @param name the name of the measurement
180+
* @param value the value of the measurement
181+
*/
182+
void setMeasurement(@NotNull String name, @NotNull Number value);
183+
184+
/**
185+
* Set a measurement with specific unit.
186+
*
187+
* <p>NOTE: Setting a measurement with the same name on the same transaction multiple times only
188+
* keeps the last value.
189+
*
190+
* @param name the name of the measurement
191+
* @param value the value of the measurement
192+
* @param unit the unit the value is measured in
193+
*/
194+
void setMeasurement(
195+
@NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit);
172196
}

sentry/src/main/java/io/sentry/NoOpSpan.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,11 @@ public void setData(@NotNull String key, @NotNull Object value) {}
111111
public @Nullable Object getData(@NotNull String key) {
112112
return null;
113113
}
114+
115+
@Override
116+
public void setMeasurement(@NotNull String name, @NotNull Number value) {}
117+
118+
@Override
119+
public void setMeasurement(
120+
@NotNull String name, @NotNull Number value, @NotNull SentryMeasurementUnit unit) {}
114121
}

0 commit comments

Comments
 (0)