Skip to content

Commit

Permalink
Add adjuster that removes bad span references (#614)
Browse files Browse the repository at this point in the history
  • Loading branch information
yurishkuro authored Dec 23, 2017
1 parent 8d6d07a commit ecbe0dd
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 0 deletions.
1 change: 1 addition & 0 deletions cmd/query/app/adjusters.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ var StandardAdjusters = []adjuster.Adjuster{
adjuster.ClockSkew(),
adjuster.IPTagAdjuster(),
adjuster.SortLogFields(),
adjuster.SpanReferences(),
}
61 changes: 61 additions & 0 deletions model/adjuster/bad_span_references.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// Copyright (c) 2017 Uber Technologies, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package adjuster

import (
"fmt"

"github.com/jaegertracing/jaeger/model"
)

// SpanReferences creates am adjuster that removes invalid span references, e.g. with traceID==0
func SpanReferences() Adjuster {
return Func(func(trace *model.Trace) (*model.Trace, error) {
adjuster := &spanReferenceAdjuster{}
for _, span := range trace.Spans {
adjuster.adjust(span)
}
return trace, nil
})
}

type spanReferenceAdjuster struct{}

func (s *spanReferenceAdjuster) adjust(span *model.Span) *model.Span {
foundInvalid := false
for i := range span.References {
if !s.valid(&span.References[i]) {
foundInvalid = true
break
}
}
if !foundInvalid {
return span
}
references := make([]model.SpanRef, 0, len(span.References)-1)
for i := range span.References {
if !s.valid(&span.References[i]) {
span.Warnings = append(span.Warnings, fmt.Sprintf("Invalid span reference removed %+v", span.References[i]))
continue
}
references = append(references, span.References[i])
}
span.References = references
return span
}

func (s *spanReferenceAdjuster) valid(ref *model.SpanRef) bool {
return ref.TraceID.High != 0 || ref.TraceID.Low != 0
}
47 changes: 47 additions & 0 deletions model/adjuster/bad_span_references_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright (c) 2017 Uber Technologies, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package adjuster

import (
"testing"

"github.com/stretchr/testify/assert"

"github.com/jaegertracing/jaeger/model"
)

func TestSpanReferencesAdjuster(t *testing.T) {
trace := &model.Trace{
Spans: []*model.Span{
{},
{
References: []model.SpanRef{},
},
{
References: []model.SpanRef{
{TraceID: model.TraceID{High: 0, Low: 1}},
{TraceID: model.TraceID{High: 1, Low: 0}},
{TraceID: model.TraceID{High: 0, Low: 0}},
},
},
},
}
trace, err := SpanReferences().Adjust(trace)
assert.NoError(t, err)
assert.Len(t, trace.Spans[0].References, 0)
assert.Len(t, trace.Spans[1].References, 0)
assert.Len(t, trace.Spans[2].References, 2)
assert.Equal(t, []string{"Invalid span reference removed {RefType:child-of TraceID:0 SpanID:0}"}, trace.Spans[2].Warnings)
}

0 comments on commit ecbe0dd

Please sign in to comment.