diff --git a/contrib/log/slog/slog.go b/contrib/log/slog/slog.go index a29866f294..948cdfcee9 100644 --- a/contrib/log/slog/slog.go +++ b/contrib/log/slog/slog.go @@ -12,18 +12,32 @@ import ( "log/slog" "strconv" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" ) const componentName = "log/slog" +var cfg = newConfig() + func init() { telemetry.LoadIntegration(componentName) tracer.MarkIntegrationImported("log/slog") } +type config struct { + log128bits bool +} + +func newConfig() *config { + return &config{ + log128bits: internal.BoolEnv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", true), + } +} + var _ slog.Handler = (*handler)(nil) type group struct { @@ -62,7 +76,12 @@ func (h *handler) Handle(ctx context.Context, rec slog.Record) error { // set them at the root level. span, ok := tracer.SpanFromContext(ctx) if ok { - traceID := strconv.FormatUint(span.Context().TraceID(), 10) + var traceID string + if ctxW3c, ok := span.Context().(ddtrace.SpanContextW3C); ok && cfg.log128bits { + traceID = ctxW3c.TraceID128() + } else { + traceID = strconv.FormatUint(span.Context().TraceID(), 10) + } spanID := strconv.FormatUint(span.Context().SpanID(), 10) attrs := []slog.Attr{ diff --git a/contrib/log/slog/slog_test.go b/contrib/log/slog/slog_test.go index 7546009b0f..ff20dd01da 100644 --- a/contrib/log/slog/slog_test.go +++ b/contrib/log/slog/slog_test.go @@ -11,6 +11,7 @@ import ( "encoding/json" "io" "log/slog" + "os" "strconv" "strings" "testing" @@ -19,12 +20,13 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" internallog "gopkg.in/DataDog/dd-trace-go.v1/internal/log" ) -func assertLogEntry(t *testing.T, rawEntry, wantMsg, wantLevel string, span tracer.Span, assertExtra func(t *testing.T, entry map[string]interface{})) { +func assertLogEntry(t *testing.T, rawEntry, wantMsg, wantLevel string, traceID string, spanID string, assertExtra func(t *testing.T, entry map[string]interface{})) { t.Helper() t.Log(rawEntry) @@ -38,8 +40,6 @@ func assertLogEntry(t *testing.T, rawEntry, wantMsg, wantLevel string, span trac assert.Equal(t, wantLevel, entry["level"]) assert.NotEmpty(t, entry["time"]) - traceID := strconv.FormatUint(span.Context().TraceID(), 10) - spanID := strconv.FormatUint(span.Context().SpanID(), 10) assert.Equal(t, traceID, entry[ext.LogKeyTraceID], "trace id not found") assert.Equal(t, spanID, entry[ext.LogKeySpanID], "span id not found") @@ -60,6 +60,18 @@ func testLogger(t *testing.T, createLogger func(b io.Writer) *slog.Logger, asser span, ctx := tracer.StartSpanFromContext(context.Background(), "test") defer span.Finish() + var traceID string + spanID := strconv.FormatUint(span.Context().SpanID(), 10) + if log128bits, ok := os.LookupEnv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED"); ok && log128bits == "false" { + // Re-initialize to account for race condition between setting env var in the test and reading it in the contrib + cfg = newConfig() + traceID = strconv.FormatUint(span.Context().TraceID(), 10) + } else { + ctxW3c, ok := span.Context().(ddtrace.SpanContextW3C) + assert.True(t, ok) + traceID = ctxW3c.TraceID128() + } + // log a message using the context containing span information logger.Log(ctx, slog.LevelInfo, "this is an info log with tracing information") logger.Log(ctx, slog.LevelError, "this is an error log with tracing information") @@ -70,10 +82,44 @@ func testLogger(t *testing.T, createLogger func(b io.Writer) *slog.Logger, asser ) // assert log entries contain trace information require.Len(t, logs, 2) - assertLogEntry(t, logs[0], "this is an info log with tracing information", "INFO", span, assertExtra) - assertLogEntry(t, logs[1], "this is an error log with tracing information", "ERROR", span, assertExtra) + + assertLogEntry(t, logs[0], "this is an info log with tracing information", "INFO", traceID, spanID, assertExtra) + assertLogEntry(t, logs[1], "this is an error log with tracing information", "ERROR", traceID, spanID, assertExtra) } +// func testLogger128BitDisabled(t *testing.T, createLogger func(b io.Writer) *slog.Logger, assertExtra func(t *testing.T, entry map[string]interface{})) { +// tracer.Start(tracer.WithLogger(internallog.DiscardLogger{})) +// defer tracer.Stop() + +// // create the application logger +// var b bytes.Buffer +// logger := createLogger(&b) + +// // start a new span +// span, ctx := tracer.StartSpanFromContext(context.Background(), "test") +// defer span.Finish() + +// t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "false") +// // Re-initialize to account for race condition between setting env var in the test and reading it in the contrib +// cfg = newConfig() +// // log a message using the context containing span information +// logger.Log(ctx, slog.LevelInfo, "this is an info log with tracing information") +// logger.Log(ctx, slog.LevelError, "this is an error log with tracing information") + +// logs := strings.Split( +// strings.TrimRight(b.String(), "\n"), +// "\n", +// ) +// // assert log entries contain trace information +// require.Len(t, logs, 2) + +// // Assert that 64 bit IDs are logged when 128bit logging is disabled +// traceID := strconv.FormatUint(span.Context().TraceID(), 10) +// spanID := strconv.FormatUint(span.Context().SpanID(), 10) +// assertLogEntry(t, logs[0], "this is an info log with tracing information", "INFO", traceID, spanID, assertExtra) +// assertLogEntry(t, logs[1], "this is an error log with tracing information", "ERROR", traceID, spanID, assertExtra) +// } + func TestNewJSONHandler(t *testing.T) { testLogger( t, @@ -206,6 +252,20 @@ func TestRecordClone(t *testing.T) { assert.True(t, foundSentinel) } +func Test128BitLoggingDisabled(t *testing.T) { + os.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "false") + defer os.Unsetenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED") + t.Run("testLogger", func(t *testing.T) { + testLogger( + t, + func(w io.Writer) *slog.Logger { + return slog.New(WrapHandler(slog.NewJSONHandler(w, nil))) + }, + nil, + ) + }) +} + func BenchmarkHandler(b *testing.B) { span, ctx := tracer.StartSpanFromContext(context.Background(), "test") defer span.Finish() diff --git a/contrib/net/http/trace_test.go b/contrib/net/http/trace_test.go index f85a592861..0489f8c3ef 100644 --- a/contrib/net/http/trace_test.go +++ b/contrib/net/http/trace_test.go @@ -329,8 +329,8 @@ func TestTraceAndServe(t *testing.T) { t.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "500") cfg := &ServeConfig{ - Service: "service", - Resource: "resource", + Service: "service", + Resource: "resource", } handler := func(w http.ResponseWriter, r *http.Request) { diff --git a/contrib/sirupsen/logrus/logrus.go b/contrib/sirupsen/logrus/logrus.go index d0e379d796..91c3cd3835 100644 --- a/contrib/sirupsen/logrus/logrus.go +++ b/contrib/sirupsen/logrus/logrus.go @@ -7,8 +7,12 @@ package logrus import ( + "strconv" + + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" "github.com/sirupsen/logrus" @@ -24,6 +28,18 @@ func init() { // DDContextLogHook ensures that any span in the log context is correlated to log output. type DDContextLogHook struct{} +type config struct { + log128bits bool +} + +var cfg = newConfig() + +func newConfig() *config { + return &config{ + log128bits: internal.BoolEnv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", true), + } +} + // Levels implements logrus.Hook interface, this hook applies to all defined levels func (d *DDContextLogHook) Levels() []logrus.Level { return []logrus.Level{logrus.PanicLevel, logrus.FatalLevel, logrus.ErrorLevel, logrus.WarnLevel, logrus.InfoLevel, logrus.DebugLevel, logrus.TraceLevel} @@ -35,7 +51,11 @@ func (d *DDContextLogHook) Fire(e *logrus.Entry) error { if !found { return nil } - e.Data[ext.LogKeyTraceID] = span.Context().TraceID() - e.Data[ext.LogKeySpanID] = span.Context().SpanID() + if ctxW3c, ok := span.Context().(ddtrace.SpanContextW3C); ok && cfg.log128bits { + e.Data[ext.LogKeyTraceID] = ctxW3c.TraceID128() + } else { + e.Data[ext.LogKeyTraceID] = strconv.FormatUint(span.Context().TraceID(), 10) + } + e.Data[ext.LogKeySpanID] = strconv.FormatUint(span.Context().SpanID(), 10) return nil } diff --git a/contrib/sirupsen/logrus/logrus_test.go b/contrib/sirupsen/logrus/logrus_test.go index be23324b4d..e319d0f6ca 100644 --- a/contrib/sirupsen/logrus/logrus_test.go +++ b/contrib/sirupsen/logrus/logrus_test.go @@ -7,25 +7,54 @@ package logrus import ( "context" + "strconv" "testing" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" ) -func TestFire(t *testing.T) { +func TestFire128BitEnabled(t *testing.T) { + // By default, trace IDs are logged in 128bit format tracer.Start() defer tracer.Stop() - _, sctx := tracer.StartSpanFromContext(context.Background(), "testSpan", tracer.WithSpanID(1234)) + sp, sctx := tracer.StartSpanFromContext(context.Background(), "testSpan", tracer.WithSpanID(1234)) hook := &DDContextLogHook{} e := logrus.NewEntry(logrus.New()) e.Context = sctx err := hook.Fire(e) + assert.NoError(t, err) + + ctxW3c, ok := sp.Context().(ddtrace.SpanContextW3C) + assert.True(t, ok) + + assert.Equal(t, ctxW3c.TraceID128(), e.Data["dd.trace_id"]) + assert.Equal(t, strconv.FormatUint(sp.Context().SpanID(), 10), e.Data["dd.span_id"]) +} +func TestFire128BitDisabled(t *testing.T) { + // By default, trace IDs are logged in 128bit format + + t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "false") + + // Re-initialize to account for race condition between setting env var in the test and reading it in the contrib + cfg = newConfig() + + tracer.Start() + defer tracer.Stop() + id := 1234 + _, sctx := tracer.StartSpanFromContext(context.Background(), "testSpan", tracer.WithSpanID(1234)) + + hook := &DDContextLogHook{} + e := logrus.NewEntry(logrus.New()) + e.Context = sctx + err := hook.Fire(e) assert.NoError(t, err) - assert.Equal(t, uint64(1234), e.Data["dd.trace_id"]) - assert.Equal(t, uint64(1234), e.Data["dd.span_id"]) + + assert.Equal(t, strconv.Itoa(id), e.Data["dd.trace_id"]) + assert.Equal(t, strconv.Itoa(id), e.Data["dd.span_id"]) } diff --git a/ddtrace/tracer/log_test.go b/ddtrace/tracer/log_test.go index 268e0ad015..6319bbd6cb 100644 --- a/ddtrace/tracer/log_test.go +++ b/ddtrace/tracer/log_test.go @@ -187,9 +187,11 @@ func TestLogFormat(t *testing.T) { defer stop() tp.Reset() tp.Ignore("appsec: ", telemetry.LogPrefix) - tracer.StartSpan("test", ServiceName("test-service"), ResourceName("/"), WithSpanID(12345)) + sp := tracer.StartSpan("test", ServiceName("test-service"), ResourceName("/"), WithSpanID(12345)) + sCtx, ok := sp.Context().(*spanContext) + assert.True(ok) assert.Len(tp.Logs(), 1) - assert.Regexp(logPrefixRegexp+` DEBUG: Started Span: dd.trace_id="12345" dd.span_id="12345" dd.parent_id="0", Operation: test, Resource: /, Tags: map.*, map.*`, tp.Logs()[0]) + assert.Regexp(logPrefixRegexp+` DEBUG: Started Span: dd.trace_id="`+sCtx.TraceID128()+`" dd.span_id="12345" dd.parent_id="0", Operation: test, Resource: /, Tags: map.*, map.*`, tp.Logs()[0]) } func TestLogPropagators(t *testing.T) { diff --git a/ddtrace/tracer/span.go b/ddtrace/tracer/span.go index 6b7568ec48..c9d6bace83 100644 --- a/ddtrace/tracer/span.go +++ b/ddtrace/tracer/span.go @@ -709,7 +709,7 @@ func (s *span) Format(f fmt.State, c rune) { } } var traceID string - if sharedinternal.BoolEnv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", false) && s.context.traceID.HasUpper() { + if sharedinternal.BoolEnv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", true) && s.context.traceID.HasUpper() { traceID = s.context.TraceID128() } else { traceID = fmt.Sprintf("%d", s.TraceID) diff --git a/ddtrace/tracer/span_test.go b/ddtrace/tracer/span_test.go index 4c9b4d1c59..355ac35920 100644 --- a/ddtrace/tracer/span_test.go +++ b/ddtrace/tracer/span_test.go @@ -712,7 +712,8 @@ func TestSpanLog(t *testing.T) { tracer, _, _, stop := startTestTracer(t) defer stop() span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + sctx := span.Context().(*spanContext) + expect := fmt.Sprintf(`dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, sctx.TraceID128(), span.SpanID) assert.Equal(expect, fmt.Sprintf("%v", span)) } t.Run("noservice_first", noServiceTest) @@ -722,7 +723,8 @@ func TestSpanLog(t *testing.T) { tracer, _, _, stop := startTestTracer(t, WithService("tracer.test")) defer stop() span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + sctx := span.Context().(*spanContext) + expect := fmt.Sprintf(`dd.service=tracer.test dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, sctx.TraceID128(), span.SpanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) @@ -731,7 +733,8 @@ func TestSpanLog(t *testing.T) { tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) defer stop() span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + sctx := span.Context().(*spanContext) + expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, sctx.TraceID128(), span.SpanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) @@ -740,7 +743,8 @@ func TestSpanLog(t *testing.T) { tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3")) defer stop() span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + sctx := span.Context().(*spanContext) + expect := fmt.Sprintf(`dd.service=tracer.test dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, sctx.TraceID128(), span.SpanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) @@ -749,7 +753,8 @@ func TestSpanLog(t *testing.T) { tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3"), WithEnv("testenv")) defer stop() span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + sctx := span.Context().(*spanContext) + expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, sctx.TraceID128(), span.SpanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) @@ -761,7 +766,8 @@ func TestSpanLog(t *testing.T) { tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3"), WithEnv("testenv")) defer stop() span := tracer.StartSpan("test.request", ServiceName("subservice name")).(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + sctx := span.Context().(*spanContext) + expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, sctx.TraceID128(), span.SpanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) @@ -773,7 +779,8 @@ func TestSpanLog(t *testing.T) { tracer, _, _, stop := startTestTracer(t) defer stop() span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + sctx := span.Context().(*spanContext) + expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, sctx.TraceID128(), span.SpanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) @@ -782,7 +789,8 @@ func TestSpanLog(t *testing.T) { tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3")) defer stop() span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`%%!b(ddtrace.Span=dd.service=tracer.test dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0")`, span.TraceID, span.SpanID) + sctx := span.Context().(*spanContext) + expect := fmt.Sprintf(`%%!b(ddtrace.Span=dd.service=tracer.test dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0")`, sctx.TraceID128(), span.SpanID) assert.Equal(expect, fmt.Sprintf("%b", span)) }) @@ -790,9 +798,10 @@ func TestSpanLog(t *testing.T) { assert := assert.New(t) tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3"), WithEnv("testenv")) span := tracer.StartSpan("test.request").(*span) + sctx := span.Context().(*spanContext) stop() // no service, env, or version after the tracer is stopped - expect := fmt.Sprintf(`dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + expect := fmt.Sprintf(`dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, sctx.TraceID128(), span.SpanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) @@ -803,34 +812,32 @@ func TestSpanLog(t *testing.T) { assert := assert.New(t) tracer, _, _, stop := startTestTracer(t) span := tracer.StartSpan("test.request").(*span) + sctx := span.Context().(*spanContext) stop() // service is not included: it is cleared when we stop the tracer // env, version are included: it reads the environment variable when there is no tracer - expect := fmt.Sprintf(`dd.env=testenv dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + expect := fmt.Sprintf(`dd.env=testenv dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, sctx.TraceID128(), span.SpanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) - t.Run("128-bit-generation-only", func(t *testing.T) { - // Generate 128 bit trace ids, but don't log them. So only the lower - // 64 bits should be logged in decimal form. - // DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED is true by default - // DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED is false by default + t.Run("128-bit-logging-default", func(t *testing.T) { + // Generate and log 128 bit trace ids by default assert := assert.New(t) tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) defer stop() span := tracer.StartSpan("test.request").(*span) - span.TraceID = 12345678 span.SpanID = 87654321 span.Finish() - expect := `dd.service=tracer.test dd.env=testenv dd.trace_id="12345678" dd.span_id="87654321" dd.parent_id="0"` + expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.trace_id=%q dd.span_id="87654321" dd.parent_id="0"`, span.context.TraceID128()) assert.Equal(expect, fmt.Sprintf("%v", span)) + v, _ := getMeta(span, keyTraceID128) + assert.NotEmpty(v) }) t.Run("128-bit-logging-only", func(t *testing.T) { - // Logging 128-bit trace ids is enabled, but it's not present in + // Logging 128-bit trace ids is enabled, but format is not present in // the span. So only the lower 64 bits should be logged in decimal form. t.Setenv("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "false") - t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "true") assert := assert.New(t) tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) defer stop() @@ -842,27 +849,9 @@ func TestSpanLog(t *testing.T) { assert.Equal(expect, fmt.Sprintf("%v", span)) }) - t.Run("128-bit-logging-with-generation", func(t *testing.T) { - // Logging 128-bit trace ids is enabled, and a 128-bit trace id, so - // a quoted 32 byte hex string should be printed for the dd.trace_id. - t.Setenv("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "true") - t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "true") - assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) - defer stop() - span := tracer.StartSpan("test.request").(*span) - span.SpanID = 87654321 - span.Finish() - expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.trace_id=%q dd.span_id="87654321" dd.parent_id="0"`, span.context.TraceID128()) - assert.Equal(expect, fmt.Sprintf("%v", span)) - v, _ := getMeta(span, keyTraceID128) - assert.NotEmpty(v) - }) - t.Run("128-bit-logging-with-small-upper-bits", func(t *testing.T) { // Logging 128-bit trace ids is enabled, and a 128-bit trace id, so // a quoted 32 byte hex string should be printed for the dd.trace_id. - t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "true") t.Setenv("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "false") assert := assert.New(t) tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) @@ -878,7 +867,6 @@ func TestSpanLog(t *testing.T) { t.Run("128-bit-logging-with-empty-upper-bits", func(t *testing.T) { // Logging 128-bit trace ids is enabled, and but the upper 64 bits // are empty, so the dd.trace_id should be printed as raw digits (not hex). - t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "true") t.Setenv("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "false") assert := assert.New(t) tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) @@ -890,6 +878,20 @@ func TestSpanLog(t *testing.T) { v, _ := getMeta(span, keyTraceID128) assert.Equal("", v) }) + t.Run("128-bit-logging-disabled", func(t *testing.T) { + // Only the lower 64 bits should be logged in decimal form. + // DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED is true by default + t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "false") + assert := assert.New(t) + tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + defer stop() + span := tracer.StartSpan("test.request").(*span) + span.TraceID = 12345678 + span.SpanID = 87654321 + span.Finish() + expect := `dd.service=tracer.test dd.env=testenv dd.trace_id="12345678" dd.span_id="87654321" dd.parent_id="0"` + assert.Equal(expect, fmt.Sprintf("%v", span)) + }) } func TestRootSpanAccessor(t *testing.T) {