Skip to content

Commit

Permalink
Merge pull request #2512 from DataDog/xgouchet/RUM-8729/span_logs
Browse files Browse the repository at this point in the history
RUM-8729 ensure span logs use 128 bits trace id as hex string
  • Loading branch information
xgouchet authored Feb 25, 2025
2 parents 947ff60 + ab8b849 commit 9068c03
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.datadog.android.api.feature.FeatureSdkCore
import com.datadog.android.core.internal.utils.loggableStackTrace
import com.datadog.android.internal.utils.loggableStackTrace
import com.datadog.android.log.LogAttributes
import com.datadog.android.trace.internal.utils.traceIdAsHexString
import com.datadog.legacy.trace.api.DDTags
import com.datadog.opentracing.DDSpan
import com.datadog.opentracing.LogHandler
Expand Down Expand Up @@ -68,8 +69,8 @@ internal class AndroidSpanLogsHandler(
val logsFeature = sdkCore.getFeature(Feature.LOGS_FEATURE_NAME)
if (logsFeature != null && fields.isNotEmpty()) {
val message = fields.remove(Fields.MESSAGE)?.toString() ?: DEFAULT_EVENT_MESSAGE
fields[LogAttributes.DD_TRACE_ID] = span.traceId.toString()
fields[LogAttributes.DD_SPAN_ID] = span.spanId.toString()
fields[LogAttributes.DD_TRACE_ID] = span.context().traceIdAsHexString()
fields[LogAttributes.DD_SPAN_ID] = span.context().toSpanId()
val timestamp = toMilliseconds(timestampMicroseconds) ?: System.currentTimeMillis()
logsFeature.sendEvent(
mapOf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ import com.datadog.android.api.feature.Feature
import com.datadog.android.api.feature.FeatureScope
import com.datadog.android.api.feature.FeatureSdkCore
import com.datadog.android.core.internal.utils.loggableStackTrace
import com.datadog.android.core.internal.utils.toHexString
import com.datadog.android.internal.utils.loggableStackTrace
import com.datadog.android.log.LogAttributes
import com.datadog.android.trace.utils.verifyLog
import com.datadog.android.utils.forge.Configurator
import com.datadog.legacy.trace.api.DDTags
import com.datadog.opentracing.DDSpan
import com.datadog.opentracing.DDSpanContext
import fr.xgouchet.elmyr.Forge
import fr.xgouchet.elmyr.annotation.Forgery
import fr.xgouchet.elmyr.annotation.LongForgery
Expand Down Expand Up @@ -62,16 +64,22 @@ internal class AndroidSpanLogsHandlerTest {
@Mock
lateinit var mockSpan: DDSpan

@LongForgery
@Mock
lateinit var mockSpanContext: DDSpanContext

@LongForgery(min = 1)
var fakeTraceId: Long = 0L

@LongForgery
var fakeSpanId: Long = 0L

@BeforeEach
fun `set up`() {
whenever(mockSpan.context()) doReturn mockSpanContext
whenever(mockSpan.traceId) doReturn BigInteger.valueOf(fakeTraceId)
whenever(mockSpan.spanId) doReturn BigInteger.valueOf(fakeSpanId)
whenever(mockSpanContext.traceId) doReturn BigInteger.valueOf(fakeTraceId)
whenever(mockSpanContext.toSpanId()) doReturn fakeSpanId.toString()

whenever(
mockSdkCore.getFeature(Feature.LOGS_FEATURE_NAME)
Expand Down Expand Up @@ -103,7 +111,7 @@ internal class AndroidSpanLogsHandlerTest {
"message" to AndroidSpanLogsHandler.DEFAULT_EVENT_MESSAGE,
"attributes" to mapOf(
Fields.EVENT to event,
LogAttributes.DD_TRACE_ID to fakeTraceId.toString(),
LogAttributes.DD_TRACE_ID to fakeTraceId.toHexString().padStart(32, '0'),
LogAttributes.DD_SPAN_ID to fakeSpanId.toString()
)
)
Expand Down Expand Up @@ -131,7 +139,7 @@ internal class AndroidSpanLogsHandlerTest {
"message" to AndroidSpanLogsHandler.DEFAULT_EVENT_MESSAGE,
"attributes" to mapOf(
Fields.EVENT to event,
LogAttributes.DD_TRACE_ID to fakeTraceId.toString(),
LogAttributes.DD_TRACE_ID to fakeTraceId.toHexString().padStart(32, '0'),
LogAttributes.DD_SPAN_ID to fakeSpanId.toString()
),
"timestamp" to TimeUnit.MICROSECONDS.toMillis(timestampMicros)
Expand All @@ -147,7 +155,7 @@ internal class AndroidSpanLogsHandlerTest {
val fields = forge.aMap { anAlphabeticalString() to anAsciiString() }
val logAttributes = fields.toMutableMap()
.apply {
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
}

Expand Down Expand Up @@ -184,7 +192,7 @@ internal class AndroidSpanLogsHandlerTest {
val fields = forge.aMap { anAlphabeticalString() to anAsciiString() }
val logAttributes = fields.toMutableMap()
.apply {
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
}

Expand Down Expand Up @@ -216,7 +224,7 @@ internal class AndroidSpanLogsHandlerTest {

val logAttributes = fields.toMutableMap()
.apply {
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
}

Expand Down Expand Up @@ -262,7 +270,7 @@ internal class AndroidSpanLogsHandlerTest {

val logAttributes = fields.toMutableMap()
.apply {
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
}

Expand Down Expand Up @@ -304,7 +312,7 @@ internal class AndroidSpanLogsHandlerTest {

val logAttributes = fields.toMutableMap()
.apply {
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
}

Expand Down Expand Up @@ -353,7 +361,7 @@ internal class AndroidSpanLogsHandlerTest {

val logAttributes = fields.toMutableMap()
.apply {
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
}

Expand Down Expand Up @@ -404,7 +412,7 @@ internal class AndroidSpanLogsHandlerTest {

val logAttributes = fields.toMutableMap()
.apply {
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toString())
put(LogAttributes.DD_TRACE_ID, fakeTraceId.toHexString().padStart(32, '0'))
put(LogAttributes.DD_SPAN_ID, fakeSpanId.toString())
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ class UtilitiesTest {
val span = testedTracer.buildSpan(fakeOperation).start()
leastSignificantTraceId = span.leastSignificant64BitsTraceId()
mostSignificantTraceId = span.mostSignificant64BitsTraceId()
traceId = (span as? DDSpan)?.traceId?.toString() ?: ""
traceId = (span as? DDSpan)?.traceId?.toString(16) ?: ""
spanId = span.spanIdAsLong()
Thread.sleep(OP_DURATION_MS)
span.setError(fakeErrorMessage)
Expand Down Expand Up @@ -232,7 +232,7 @@ class UtilitiesTest {
val span = testedTracer.buildSpan(fakeOperation).start()
leastSignificantTraceId = span.leastSignificant64BitsTraceId()
mostSignificantTraceId = span.mostSignificant64BitsTraceId()
traceId = (span as? DDSpan)?.traceId?.toString() ?: ""
traceId = (span as? DDSpan)?.traceId?.toString(16) ?: ""
spanId = span.spanIdAsLong()
Thread.sleep(OP_DURATION_MS)
AndroidTracer.Companion.logErrorMessage(span, fakeErrorMessage)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -368,14 +368,20 @@ internal class TracesViewModel(
withinSpan("AsyncOperation", activeSpanInMainThread) {
logger.v("Starting Async Operation...")

for (i in 0..100) {
val count = (Random().nextInt() % 50) + 50
log("Async op loops $count times")
var actualCount = 0

for (i in 0 until count) {
if (isCancelled) {
log("Async operation cancelled")
break
}
onProgress(i)
Thread.sleep(((i * i).toDouble() / 100.0).toLong())
actualCount++
}

log(mapOf("wanted_count" to count, "actual_count" to actualCount))
logger.v("Finishing Async Operation...")
}
}
Expand Down

0 comments on commit 9068c03

Please sign in to comment.