Skip to content

Commit 0f8eedd

Browse files
authored
Merge pull request #5328 from getsentry/fix/queue-instrumentation-kafka-enqueued-time-format
fix(kafka): [Queue Instrumentation 31] Write enqueued-time header as plain decimal
2 parents 9d95566 + 39f67f3 commit 0f8eedd

3 files changed

Lines changed: 20 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
- Android: Attachments on the scope will now be synced to native ([#5211](https://github.com/getsentry/sentry-java/pull/5211))
1515
- Add THIRD_PARTY_NOTICES.md for vendored third-party code, bundled as SENTRY_THIRD_PARTY_NOTICES.md in the sentry JAR under META-INF ([#5186](https://github.com/getsentry/sentry-java/pull/5186))
1616

17+
### Fixes
18+
19+
- Write the `sentry-task-enqueued-time` Kafka header as a plain decimal so cross-SDK consumers (e.g. sentry-python) can parse it ([#5328](https://github.com/getsentry/sentry-java/pull/5328))
20+
1721
## 8.37.1
1822

1923
### Fixes

sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaProducerInterceptor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ private void injectHeaders(final @NotNull Headers headers, final @NotNull ISpan
128128
headers.remove(SENTRY_ENQUEUED_TIME_HEADER);
129129
headers.add(
130130
SENTRY_ENQUEUED_TIME_HEADER,
131-
String.valueOf(DateUtils.millisToSeconds(System.currentTimeMillis()))
131+
DateUtils.doubleToBigDecimal(DateUtils.millisToSeconds(System.currentTimeMillis()))
132+
.toString()
132133
.getBytes(StandardCharsets.UTF_8));
133134
}
134135

sentry-kafka/src/test/kotlin/io/sentry/kafka/SentryKafkaProducerInterceptorTest.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import kotlin.test.AfterTest
1717
import kotlin.test.BeforeTest
1818
import kotlin.test.Test
1919
import kotlin.test.assertEquals
20+
import kotlin.test.assertFalse
2021
import kotlin.test.assertNotNull
2122
import kotlin.test.assertSame
2223
import kotlin.test.assertTrue
@@ -84,7 +85,19 @@ class SentryKafkaProducerInterceptorTest {
8485
val enqueuedTimeHeader =
8586
record.headers().lastHeader(SentryKafkaProducerInterceptor.SENTRY_ENQUEUED_TIME_HEADER)
8687
assertNotNull(enqueuedTimeHeader)
87-
val enqueuedTime = String(enqueuedTimeHeader.value(), StandardCharsets.UTF_8).toDouble()
88+
val enqueuedTimeRaw = String(enqueuedTimeHeader.value(), StandardCharsets.UTF_8)
89+
// Must be written as a plain decimal so cross-SDK consumers (e.g. sentry-python) can
90+
// parse it. String.valueOf(double) would emit scientific notation (e.g. 1.77E9) for
91+
// epoch seconds.
92+
assertFalse(
93+
enqueuedTimeRaw.contains('E') || enqueuedTimeRaw.contains('e'),
94+
"enqueued-time header must not use scientific notation, got: $enqueuedTimeRaw",
95+
)
96+
assertTrue(
97+
enqueuedTimeRaw.matches(Regex("""^\d+\.\d{6}$""")),
98+
"enqueued-time header must be plain epoch seconds with 6 decimals, got: $enqueuedTimeRaw",
99+
)
100+
val enqueuedTime = enqueuedTimeRaw.toDouble()
88101
assertTrue(enqueuedTime > 0)
89102
}
90103

0 commit comments

Comments
 (0)