Repository navigation
Commit 1870a9c
committed
feat(time): Anchor span timestamps on one wall-clock reading (JAVA-572)
Demonstrates what AnchoredClock and Timestamp look like once Span and
SentryTracer actually use them. Not for merge before the major: it changes a
serialized value.
SentryTracer takes one epoch reading when it is constructed, pins it to one
monotonic tick, and every span below it projects from that anchor rather than
reading the wall clock again. Because the projection is affine with slope 1,
subtracting any two instants in a transaction is subtracting two ticks, so
serialization no longer derives anything:
- this.timestamp = DateUtils.nanosToSeconds(
- span.getStartDate().laterDateNanosTimestampByDiff(span.getFinishDate()));
+ this.timestamp = DateUtils.nanosToSeconds(span.endTimestamp().epochNanos());
That is the whole point. laterDateNanosTimestampByDiff exists to rescue a
monotonic end out of two dates whose classes happen to cooperate; with one
anchor there is nothing to rescue. The two sites that reverse-engineered the
hidden System.nanoTime() tick out of SentryNanotimeDate ask the anchor instead,
and both sentinels -- SentryNanotimeDate(0, 0) -- are gone.
DriverSpans.computeNanoStartTimestampForChild collapses to anchor().now(), and
no longer silently drops to millisecond precision when the parent's date is not
the class it hoped for.
ISpan gains startTimestamp(), endTimestamp() and anchor(). getStartDate() and
getFinishDate() stay, as epoch-only views, so the public API still works; at the
major they go and the SentryDate overloads of finish() and updateEndDate() go
with them.
Spans whose instants come from outside the process -- OTel, an app-start
projection, a caller-supplied startTimestamp -- report a null anchor and keep
wall-clock semantics. That case cannot be improved, because the input carries
nothing but an epoch; what changes is that it is now a named branch rather than
an instanceof that falls through.
Why this waits for the major: a child span's start_timestamp moves by
sub-millisecond amounts, because it is projected rather than read. Root spans do
not move, the anchor being read at root start.
Two things this turned up, both left open on purpose:
- The frame timebase. Choreographer reports frames on CLOCK_MONOTONIC while
the anchor's tick is CLOCK_BOOTTIME on Android, so SpanFrameMetricsCollector
needs an offset it cannot read from statics without becoming untestable, and
a decision about spans that spanned deep sleep. Marked TODO [MAJOR] rather
than half-solved.
- SentryDate has no value equality, so getStartDate() returning a fresh view
breaks identity comparisons. The tests here move to Timestamp, which does.
Also fixes a test that stubbed dateProvider.now() as a fixed call sequence and
so depended on how often unrelated code read the provider.1 parent b50dc01 commit 1870a9c
23 files changed
Lines changed: 508 additions & 257 deletions
File tree
- sentry-android-core/src
- main/java/io/sentry/android/core
- test/java/io/sentry/android/core
- sentry-android-sqlite/src
- main/java/io/sentry/sqlite
- test/java/io/sentry/sqlite
- sentry-opentelemetry
- sentry-opentelemetry-bootstrap
- api
- src/main/java/io/sentry/opentelemetry
- sentry-opentelemetry-core
- api
- src/main/java/io/sentry/opentelemetry
- sentry
- api
- src
- main/java/io/sentry
- protocol
- time
- test/java/io/sentry
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
11 | | - | |
12 | 10 | | |
13 | 11 | | |
14 | 12 | | |
| 13 | + | |
| 14 | + | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | | - | |
36 | 35 | | |
37 | 36 | | |
38 | 37 | | |
| |||
47 | 46 | | |
48 | 47 | | |
49 | 48 | | |
50 | | - | |
| 49 | + | |
| 50 | + | |
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
| |||
126 | 126 | | |
127 | 127 | | |
128 | 128 | | |
129 | | - | |
| 129 | + | |
130 | 130 | | |
131 | 131 | | |
132 | 132 | | |
| |||
139 | 139 | | |
140 | 140 | | |
141 | 141 | | |
142 | | - | |
143 | | - | |
| 142 | + | |
| 143 | + | |
144 | 144 | | |
145 | 145 | | |
146 | 146 | | |
147 | | - | |
148 | | - | |
| 147 | + | |
| 148 | + | |
149 | 149 | | |
150 | 150 | | |
151 | 151 | | |
| |||
306 | 306 | | |
307 | 307 | | |
308 | 308 | | |
309 | | - | |
310 | | - | |
| 309 | + | |
| 310 | + | |
311 | 311 | | |
312 | | - | |
313 | | - | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
314 | 321 | | |
315 | | - | |
316 | | - | |
317 | | - | |
318 | | - | |
319 | | - | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
320 | 335 | | |
321 | 336 | | |
322 | | - | |
323 | | - | |
324 | | - | |
325 | | - | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
326 | 341 | | |
327 | 342 | | |
328 | 343 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1489 | 1489 | | |
1490 | 1490 | | |
1491 | 1491 | | |
1492 | | - | |
| 1492 | + | |
1493 | 1493 | | |
1494 | 1494 | | |
1495 | 1495 | | |
| |||
2077 | 2077 | | |
2078 | 2078 | | |
2079 | 2079 | | |
2080 | | - | |
| 2080 | + | |
2081 | 2081 | | |
2082 | 2082 | | |
2083 | 2083 | | |
| |||
2131 | 2131 | | |
2132 | 2132 | | |
2133 | 2133 | | |
2134 | | - | |
2135 | | - | |
| 2134 | + | |
| 2135 | + | |
2136 | 2136 | | |
2137 | 2137 | | |
2138 | 2138 | | |
| |||
2168 | 2168 | | |
2169 | 2169 | | |
2170 | 2170 | | |
2171 | | - | |
| 2171 | + | |
2172 | 2172 | | |
2173 | 2173 | | |
2174 | 2174 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
| |||
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
11 | 16 | | |
12 | 17 | | |
13 | 18 | | |
| |||
49 | 54 | | |
50 | 55 | | |
51 | 56 | | |
52 | | - | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | | - | |
57 | | - | |
58 | | - | |
59 | | - | |
60 | | - | |
61 | | - | |
| 57 | + | |
62 | 58 | | |
63 | 59 | | |
64 | 60 | | |
| |||
69 | 65 | | |
70 | 66 | | |
71 | 67 | | |
72 | | - | |
73 | | - | |
74 | | - | |
75 | | - | |
76 | | - | |
77 | | - | |
78 | | - | |
79 | | - | |
80 | | - | |
81 | | - | |
| 68 | + | |
82 | 69 | | |
83 | 70 | | |
84 | 71 | | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
85 | 101 | | |
86 | 102 | | |
87 | 103 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
8 | 7 | | |
9 | | - | |
10 | 8 | | |
11 | 9 | | |
12 | 10 | | |
13 | 11 | | |
14 | 12 | | |
15 | 13 | | |
16 | | - | |
17 | | - | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | 14 | | |
23 | 15 | | |
24 | 16 | | |
25 | 17 | | |
26 | 18 | | |
27 | 19 | | |
28 | 20 | | |
29 | | - | |
| 21 | + | |
30 | 22 | | |
31 | 23 | | |
32 | 24 | | |
| |||
104 | 96 | | |
105 | 97 | | |
106 | 98 | | |
107 | | - | |
108 | | - | |
109 | | - | |
110 | | - | |
111 | | - | |
112 | | - | |
113 | | - | |
114 | | - | |
115 | | - | |
116 | | - | |
117 | | - | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
0 commit comments