Skip to content

Commit

Permalink
ddtrace/tracer: add noDebugStack to config in when setting error tags
Browse files Browse the repository at this point in the history
  • Loading branch information
nicoledanuwidjaja committed Apr 13, 2021
1 parent 8ee7a3c commit 14d8eb8
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 7 deletions.
9 changes: 6 additions & 3 deletions ddtrace/tracer/span.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,9 @@ func (s *span) SetTag(key string, value interface{}) {
}
switch key {
case ext.Error:
s.setTagError(value, &errorConfig{})
s.setTagError(value, errorConfig{
noDebugStack: s.noDebugStack,
})
return
}
if v, ok := value.(bool); ok {
Expand All @@ -127,7 +129,7 @@ func (s *span) SetTag(key string, value interface{}) {

// setTagError sets the error tag. It accounts for various valid scenarios.
// This method is not safe for concurrent use.
func (s *span) setTagError(value interface{}, cfg *errorConfig) {
func (s *span) setTagError(value interface{}, cfg errorConfig) {
if s.finished {
return
}
Expand All @@ -145,6 +147,7 @@ func (s *span) setTagError(value interface{}, cfg *errorConfig) {
s.Error = 1
s.setMeta(ext.ErrorMsg, v.Error())
s.setMeta(ext.ErrorType, reflect.TypeOf(v).String())

if !cfg.noDebugStack {
s.setMeta(ext.ErrorStack, takeStacktrace(cfg.stackFrames, cfg.stackSkip))
}
Expand Down Expand Up @@ -280,7 +283,7 @@ func (s *span) Finish(opts ...ddtrace.FinishOption) {
}
if cfg.Error != nil {
s.Lock()
s.setTagError(cfg.Error, &errorConfig{
s.setTagError(cfg.Error, errorConfig{
noDebugStack: cfg.NoDebugStack,
stackFrames: cfg.StackFrames,
stackSkip: cfg.SkipStackFrames,
Expand Down
16 changes: 16 additions & 0 deletions ddtrace/tracer/span_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,22 @@ func TestSpanSetTag(t *testing.T) {
assert.Equal("false", span.Meta["some.other.bool"])
}

func TestSpanSetTagErrorNoTrace(t *testing.T) {
assert := assert.New(t)
span := newBasicSpan("web.request")

span.setTagError(errors.New("error value with no trace"), errorConfig{noDebugStack: true})
assert.Empty(span.Meta[ext.ErrorStack])
}

func TestSpanSetTagErrorWithTrace(t *testing.T) {
assert := assert.New(t)
span := newBasicSpan("web.request")

span.setTagError(errors.New("error value with trace"), errorConfig{noDebugStack: false})
assert.NotEmpty(span.Meta[ext.ErrorStack])
}

func TestSpanSetDatadogTags(t *testing.T) {
assert := assert.New(t)

Expand Down
13 changes: 9 additions & 4 deletions ddtrace/tracer/tracer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -451,16 +451,21 @@ func TestTracerSpanGlobalTags(t *testing.T) {
assert.Equal("value", child.Meta["key"])
}

func TestTracerNoDebugStack(t *testing.T) {
func TestTracerNoDebugStackFinish(t *testing.T) {
assert := assert.New(t)
tracer := newTracer(WithDebugStack(false))
s := tracer.StartSpan("web.request").(*span)
err := errors.New("test error")
s.Finish(WithError(err))
assert.Empty(s.Meta[ext.ErrorStack])
}

assert.Equal(int32(1), s.Error)
assert.Equal("test error", s.Meta[ext.ErrorMsg])
assert.Equal("*errors.errorString", s.Meta[ext.ErrorType])
func TestTracerNoDebugStackFinishSetTag(t *testing.T) {
assert := assert.New(t)
tracer := newTracer(WithDebugStack(false))
s := tracer.StartSpan("web.request").(*span)
err := errors.New("error value with no trace")
s.SetTag(ext.Error, err)
assert.Empty(s.Meta[ext.ErrorStack])
}

Expand Down

0 comments on commit 14d8eb8

Please sign in to comment.