Skip to content

Commit 9068c03

Browse files
authored
Merge pull request #2512 from DataDog/xgouchet/RUM-8729/span_logs
RUM-8729 ensure span logs use 128 bits trace id as hex string
2 parents 947ff60 + ab8b849 commit 9068c03

File tree

4 files changed

+31
-16
lines changed

4 files changed

+31
-16
lines changed

features/dd-sdk-android-trace/src/main/kotlin/com/datadog/android/trace/internal/handlers/AndroidSpanLogsHandler.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.datadog.android.api.feature.FeatureSdkCore
1212
import com.datadog.android.core.internal.utils.loggableStackTrace
1313
import com.datadog.android.internal.utils.loggableStackTrace
1414
import com.datadog.android.log.LogAttributes
15+
import com.datadog.android.trace.internal.utils.traceIdAsHexString
1516
import com.datadog.legacy.trace.api.DDTags
1617
import com.datadog.opentracing.DDSpan
1718
import com.datadog.opentracing.LogHandler
@@ -68,8 +69,8 @@ internal class AndroidSpanLogsHandler(
6869
val logsFeature = sdkCore.getFeature(Feature.LOGS_FEATURE_NAME)
6970
if (logsFeature != null && fields.isNotEmpty()) {
7071
val message = fields.remove(Fields.MESSAGE)?.toString() ?: DEFAULT_EVENT_MESSAGE
71-
fields[LogAttributes.DD_TRACE_ID] = span.traceId.toString()
72-
fields[LogAttributes.DD_SPAN_ID] = span.spanId.toString()
72+
fields[LogAttributes.DD_TRACE_ID] = span.context().traceIdAsHexString()
73+
fields[LogAttributes.DD_SPAN_ID] = span.context().toSpanId()
7374
val timestamp = toMilliseconds(timestampMicroseconds) ?: System.currentTimeMillis()
7475
logsFeature.sendEvent(
7576
mapOf(

features/dd-sdk-android-trace/src/test/kotlin/com/datadog/android/trace/internal/handlers/AndroidSpanLogsHandlerTest.kt

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ import com.datadog.android.api.feature.Feature
1111
import com.datadog.android.api.feature.FeatureScope
1212
import com.datadog.android.api.feature.FeatureSdkCore
1313
import com.datadog.android.core.internal.utils.loggableStackTrace
14+
import com.datadog.android.core.internal.utils.toHexString
1415
import com.datadog.android.internal.utils.loggableStackTrace
1516
import com.datadog.android.log.LogAttributes
1617
import com.datadog.android.trace.utils.verifyLog
1718
import com.datadog.android.utils.forge.Configurator
1819
import com.datadog.legacy.trace.api.DDTags
1920
import com.datadog.opentracing.DDSpan
21+
import com.datadog.opentracing.DDSpanContext
2022
import fr.xgouchet.elmyr.Forge
2123
import fr.xgouchet.elmyr.annotation.Forgery
2224
import fr.xgouchet.elmyr.annotation.LongForgery
@@ -62,16 +64,22 @@ internal class AndroidSpanLogsHandlerTest {
6264
@Mock
6365
lateinit var mockSpan: DDSpan
6466

65-
@LongForgery
67+
@Mock
68+
lateinit var mockSpanContext: DDSpanContext
69+
70+
@LongForgery(min = 1)
6671
var fakeTraceId: Long = 0L
6772

6873
@LongForgery
6974
var fakeSpanId: Long = 0L
7075

7176
@BeforeEach
7277
fun `set up`() {
78+
whenever(mockSpan.context()) doReturn mockSpanContext
7379
whenever(mockSpan.traceId) doReturn BigInteger.valueOf(fakeTraceId)
7480
whenever(mockSpan.spanId) doReturn BigInteger.valueOf(fakeSpanId)
81+
whenever(mockSpanContext.traceId) doReturn BigInteger.valueOf(fakeTraceId)
82+
whenever(mockSpanContext.toSpanId()) doReturn fakeSpanId.toString()
7583

7684
whenever(
7785
mockSdkCore.getFeature(Feature.LOGS_FEATURE_NAME)
@@ -103,7 +111,7 @@ internal class AndroidSpanLogsHandlerTest {
103111
"message" to AndroidSpanLogsHandler.DEFAULT_EVENT_MESSAGE,
104112
"attributes" to mapOf(
105113
Fields.EVENT to event,
106-
LogAttributes.DD_TRACE_ID to fakeTraceId.toString(),
114+
LogAttributes.DD_TRACE_ID to fakeTraceId.toHexString().padStart(32, '0'),
107115
LogAttributes.DD_SPAN_ID to fakeSpanId.toString()
108116
)
109117
)
@@ -131,7 +139,7 @@ internal class AndroidSpanLogsHandlerTest {
131139
"message" to AndroidSpanLogsHandler.DEFAULT_EVENT_MESSAGE,
132140
"attributes" to mapOf(
133141
Fields.EVENT to event,
134-
LogAttributes.DD_TRACE_ID to fakeTraceId.toString(),
142+
LogAttributes.DD_TRACE_ID to fakeTraceId.toHexString().padStart(32, '0'),
135143
LogAttributes.DD_SPAN_ID to fakeSpanId.toString()
136144
),
137145
"timestamp" to TimeUnit.MICROSECONDS.toMillis(timestampMicros)
@@ -147,7 +155,7 @@ internal class AndroidSpanLogsHandlerTest {
147155
val fields = forge.aMap { anAlphabeticalString() to anAsciiString() }
148156
val logAttributes = fields.toMutableMap()
149157
.apply {
150-
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
158+
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
151159
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
152160
}
153161

@@ -184,7 +192,7 @@ internal class AndroidSpanLogsHandlerTest {
184192
val fields = forge.aMap { anAlphabeticalString() to anAsciiString() }
185193
val logAttributes = fields.toMutableMap()
186194
.apply {
187-
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
195+
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
188196
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
189197
}
190198

@@ -216,7 +224,7 @@ internal class AndroidSpanLogsHandlerTest {
216224

217225
val logAttributes = fields.toMutableMap()
218226
.apply {
219-
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
227+
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
220228
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
221229
}
222230

@@ -262,7 +270,7 @@ internal class AndroidSpanLogsHandlerTest {
262270

263271
val logAttributes = fields.toMutableMap()
264272
.apply {
265-
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
273+
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
266274
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
267275
}
268276

@@ -304,7 +312,7 @@ internal class AndroidSpanLogsHandlerTest {
304312

305313
val logAttributes = fields.toMutableMap()
306314
.apply {
307-
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
315+
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
308316
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
309317
}
310318

@@ -353,7 +361,7 @@ internal class AndroidSpanLogsHandlerTest {
353361

354362
val logAttributes = fields.toMutableMap()
355363
.apply {
356-
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
364+
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
357365
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
358366
}
359367

@@ -404,7 +412,7 @@ internal class AndroidSpanLogsHandlerTest {
404412

405413
val logAttributes = fields.toMutableMap()
406414
.apply {
407-
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
415+
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
408416
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
409417
}
410418

reliability/single-fit/trace/src/test/kotlin/com/datadog/android/trace/integration/opentracing/UtilitiesTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class UtilitiesTest {
131131
val span = testedTracer.buildSpan(fakeOperation).start()
132132
leastSignificantTraceId = span.leastSignificant64BitsTraceId()
133133
mostSignificantTraceId = span.mostSignificant64BitsTraceId()
134-
traceId = (span as? DDSpan)?.traceId?.toString() ?: ""
134+
traceId = (span as? DDSpan)?.traceId?.toString(16) ?: ""
135135
spanId = span.spanIdAsLong()
136136
Thread.sleep(OP_DURATION_MS)
137137
span.setError(fakeErrorMessage)
@@ -232,7 +232,7 @@ class UtilitiesTest {
232232
val span = testedTracer.buildSpan(fakeOperation).start()
233233
leastSignificantTraceId = span.leastSignificant64BitsTraceId()
234234
mostSignificantTraceId = span.mostSignificant64BitsTraceId()
235-
traceId = (span as? DDSpan)?.traceId?.toString() ?: ""
235+
traceId = (span as? DDSpan)?.traceId?.toString(16) ?: ""
236236
spanId = span.spanIdAsLong()
237237
Thread.sleep(OP_DURATION_MS)
238238
AndroidTracer.Companion.logErrorMessage(span, fakeErrorMessage)

sample/kotlin/src/main/kotlin/com/datadog/android/sample/traces/TracesViewModel.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,14 +368,20 @@ internal class TracesViewModel(
368368
withinSpan("AsyncOperation", activeSpanInMainThread) {
369369
logger.v("Starting Async Operation...")
370370

371-
for (i in 0..100) {
371+
val count = (Random().nextInt() % 50) + 50
372+
log("Async op loops $count times")
373+
var actualCount = 0
374+
375+
for (i in 0 until count) {
372376
if (isCancelled) {
377+
log("Async operation cancelled")
373378
break
374379
}
375380
onProgress(i)
376381
Thread.sleep(((i * i).toDouble() / 100.0).toLong())
382+
actualCount++
377383
}
378-
384+
log(mapOf("wanted_count" to count, "actual_count" to actualCount))
379385
logger.v("Finishing Async Operation...")
380386
}
381387
}

0 commit comments

Comments
 (0)