Skip to content

Commit

Permalink
Add missing tests
Browse files Browse the repository at this point in the history
Signed-off-by: Yuri Shkuro <ys@uber.com>
  • Loading branch information
Yuri Shkuro committed May 18, 2018
1 parent 1babc1f commit beb4a57
Show file tree
Hide file tree
Showing 11 changed files with 144 additions and 74 deletions.
14 changes: 7 additions & 7 deletions model/converter/json/fixtures/domain_es_01.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,20 @@
"spanID": "2",
"operationName": "test-general-conversion",
"references": [
{
"refType": "child-of",
"traceID": "ff",
"spanID": "ff"
},
{
"refType": "child-of",
"traceID": "1",
"spanID": "2"
"spanID": "3"
},
{
"refType": "follows-from",
"traceID": "1",
"spanID": "2"
"spanID": "4"
},
{
"refType": "child-of",
"traceID": "ff",
"spanID": "ff"
}
],
"flags": 1,
Expand Down
14 changes: 7 additions & 7 deletions model/converter/json/fixtures/es_01.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@
"flags": 1,
"operationName": "test-general-conversion",
"references": [
{
"refType": "CHILD_OF",
"traceID": "ff",
"spanID": "ff"
},
{
"refType": "CHILD_OF",
"traceID": "1",
"spanID": "2"
"spanID": "3"
},
{
"refType": "FOLLOWS_FROM",
"traceID": "1",
"spanID": "2"
"spanID": "4"
},
{
"refType": "CHILD_OF",
"traceID": "ff",
"spanID": "ff"
}
],
"startTime": 1485467191639875,
Expand Down
51 changes: 33 additions & 18 deletions model/converter/json/to_domain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,20 @@ import (
jModel "github.com/jaegertracing/jaeger/model/json"
)

func TestToDomainEmbeddedProcess(t *testing.T) {
func TestToDomain(t *testing.T) {
testToDomain(t, false)
testToDomain(t, true)
// this is just to confirm the uint64 representation of float64(72.5) used as a "temperature" tag
assert.Equal(t, int64(4634802150889750528), int64(math.Float64bits(72.5)))
}

func testToDomain(t *testing.T, testParentSpanID bool) {
for i := 1; i <= NumberOfFixtures; i++ {
span, err := createGoodSpan(i)
span, err := loadESSpanFixture(i)
require.NoError(t, err)
if testParentSpanID {
span.ParentSpanID = "3"
}

actualSpan, err := SpanToDomain(&span)
require.NoError(t, err)
Expand All @@ -44,11 +54,9 @@ func TestToDomainEmbeddedProcess(t *testing.T) {

CompareModelSpans(t, &expectedSpan, actualSpan)
}
// this is just to confirm the uint64 representation of float64(72.5) used as a "temperature" tag
assert.Equal(t, int64(4634802150889750528), int64(math.Float64bits(72.5)))
}

func createGoodSpan(i int) (jModel.Span, error) {
func loadESSpanFixture(i int) (jModel.Span, error) {
in := fmt.Sprintf("fixtures/es_%02d.json", i)
inStr, err := ioutil.ReadFile(in)
if err != nil {
Expand All @@ -72,7 +80,7 @@ func failingSpanTransformAnyMsg(t *testing.T, embeddedSpan *jModel.Span) {
}

func TestFailureBadTypeTags(t *testing.T) {
badTagESSpan, err := createGoodSpan(1)
badTagESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)

badTagESSpan.Tags = []jModel.KeyValue{
Expand All @@ -85,7 +93,7 @@ func TestFailureBadTypeTags(t *testing.T) {
}

func TestFailureBadBoolTags(t *testing.T) {
badTagESSpan, err := createGoodSpan(1)
badTagESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)

badTagESSpan.Tags = []jModel.KeyValue{
Expand All @@ -99,7 +107,7 @@ func TestFailureBadBoolTags(t *testing.T) {
}

func TestFailureBadIntTags(t *testing.T) {
badTagESSpan, err := createGoodSpan(1)
badTagESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)

badTagESSpan.Tags = []jModel.KeyValue{
Expand All @@ -113,7 +121,7 @@ func TestFailureBadIntTags(t *testing.T) {
}

func TestFailureBadFloatTags(t *testing.T) {
badTagESSpan, err := createGoodSpan(1)
badTagESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)

badTagESSpan.Tags = []jModel.KeyValue{
Expand All @@ -127,7 +135,7 @@ func TestFailureBadFloatTags(t *testing.T) {
}

func TestFailureBadBinaryTags(t *testing.T) {
badTagESSpan, err := createGoodSpan(1)
badTagESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)

badTagESSpan.Tags = []jModel.KeyValue{
Expand All @@ -141,7 +149,7 @@ func TestFailureBadBinaryTags(t *testing.T) {
}

func TestFailureBadLogs(t *testing.T) {
badLogsESSpan, err := createGoodSpan(1)
badLogsESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)
badLogsESSpan.Logs = []jModel.Log{
{
Expand Down Expand Up @@ -169,7 +177,7 @@ func TestRevertKeyValueOfType(t *testing.T) {
}

func TestFailureBadRefs(t *testing.T) {
badRefsESSpan, err := createGoodSpan(1)
badRefsESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)
badRefsESSpan.References = []jModel.Reference{
{
Expand All @@ -181,7 +189,7 @@ func TestFailureBadRefs(t *testing.T) {
}

func TestFailureBadTraceIDRefs(t *testing.T) {
badRefsESSpan, err := createGoodSpan(1)
badRefsESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)
badRefsESSpan.References = []jModel.Reference{
{
Expand All @@ -194,7 +202,7 @@ func TestFailureBadTraceIDRefs(t *testing.T) {
}

func TestFailureBadSpanIDRefs(t *testing.T) {
badRefsESSpan, err := createGoodSpan(1)
badRefsESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)
badRefsESSpan.References = []jModel.Reference{
{
Expand All @@ -207,7 +215,7 @@ func TestFailureBadSpanIDRefs(t *testing.T) {
}

func TestFailureBadProcess(t *testing.T) {
badProcessESSpan, err := createGoodSpan(1)
badProcessESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)

badTags := []jModel.KeyValue{
Expand All @@ -224,23 +232,30 @@ func TestFailureBadProcess(t *testing.T) {
}

func TestProcessPointer(t *testing.T) {
badProcessESSpan, err := createGoodSpan(1)
badProcessESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)

badProcessESSpan.Process = nil
failingSpanTransform(t, &badProcessESSpan, "Process is nil")
}

func TestFailureBadTraceID(t *testing.T) {
badTraceIDESSpan, err := createGoodSpan(1)
badTraceIDESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)
badTraceIDESSpan.TraceID = "zz"
failingSpanTransformAnyMsg(t, &badTraceIDESSpan)
}

func TestFailureBadSpanID(t *testing.T) {
badSpanIDESSpan, err := createGoodSpan(1)
badSpanIDESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)
badSpanIDESSpan.SpanID = "zz"
failingSpanTransformAnyMsg(t, &badSpanIDESSpan)
}

func TestFailureBadParentSpanID(t *testing.T) {
badParentSpanIDESSpan, err := loadESSpanFixture(1)
require.NoError(t, err)
badParentSpanIDESSpan.ParentSpanID = "zz"
failingSpanTransformAnyMsg(t, &badParentSpanIDESSpan)
}
3 changes: 1 addition & 2 deletions model/converter/thrift/jaeger/to_domain.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ func (td toDomain) transformSpan(jSpan *jaeger.Span, mProcess *model.Process) *m
High: uint64(jSpan.TraceIdHigh),
Low: uint64(jSpan.TraceIdLow),
}
spanID := model.SpanID(jSpan.SpanId)
tags := td.getTags(jSpan.Tags)
refs := td.getReferences(jSpan.References)
// We no longer store ParentSpanID in the domain model, but the data in Thrift model
Expand All @@ -69,7 +68,7 @@ func (td toDomain) transformSpan(jSpan *jaeger.Span, mProcess *model.Process) *m
}
return &model.Span{
TraceID: traceID,
SpanID: spanID,
SpanID: model.SpanID(jSpan.SpanId),
OperationName: jSpan.OperationName,
References: refs,
Flags: model.Flags(jSpan.Flags),
Expand Down
26 changes: 14 additions & 12 deletions model/span.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,17 +66,6 @@ func (s *Span) Hash(w io.Writer) (err error) {
return enc.Encode(s)
}

// ParentSpanID returns the ID of a parent span if it exists.
// It searches the references for a reference pointing to the same trace ID.
func (s *Span) ParentSpanID() SpanID {
for i := range s.References {
if s.References[i].TraceID == s.TraceID {
return s.References[i].SpanID
}
}
return SpanID(0)
}

// HasSpanKind returns true if the span has a `span.kind` tag set to `kind`.
func (s *Span) HasSpanKind(kind ext.SpanKindEnum) bool {
if tag, ok := KeyValues(s.Tags).FindByKey(string(ext.SpanKind)); ok {
Expand Down Expand Up @@ -105,7 +94,20 @@ func (s *Span) NormalizeTimestamps() {
}
}

// ReplaceParentID replaces span ID in the span reference that is considered a parent span.
// ParentSpanID returns ID of a parent span if it exists.
// It searches for the first child-of reference pointing to the same trace ID.
func (s *Span) ParentSpanID() SpanID {
for i := range s.References {
ref := &s.References[i]
if ref.TraceID == s.TraceID && ref.RefType == ChildOf {
return ref.SpanID
}
}
return SpanID(0)
}

// ReplaceParentID replaces span ID in the parent span reference.
// See also ParentSpanID.
func (s *Span) ReplaceParentID(newParentID SpanID) {
oldParentID := s.ParentSpanID()
for i := range s.References {
Expand Down
47 changes: 36 additions & 11 deletions model/span_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,21 +191,46 @@ func TestSpanHash(t *testing.T) {
assert.NotEqual(t, codes[0], codes[2])
}

func TestParentSpanID(t *testing.T) {
span := makeSpan(model.String("k", "v"))
assert.Equal(t, model.SpanID(123), span.ParentSpanID())

span.References = []model.SpanRef{
model.NewFollowsFromRef(span.TraceID, 777),
model.NewChildOfRef(span.TraceID, 888),
}
assert.Equal(t, model.SpanID(888), span.ParentSpanID())

span.References = []model.SpanRef{
model.NewChildOfRef(model.TraceID{High: 321}, 999),
}
assert.Equal(t, model.SpanID(0), span.ParentSpanID())
}

func TestReplaceParentSpanID(t *testing.T) {
span := makeSpan(model.String("k", "v"))
assert.Equal(t, model.SpanID(123), span.ParentSpanID())

span.ReplaceParentID(789)
assert.Equal(t, model.SpanID(789), span.ParentSpanID())

span.References = []model.SpanRef{
model.NewChildOfRef(model.TraceID{High: 321}, 999),
}
span.ReplaceParentID(789)
assert.Equal(t, model.SpanID(789), span.ParentSpanID())
}

func makeSpan(someKV model.KeyValue) *model.Span {
traceID := model.TraceID{Low: 123}
return &model.Span{
TraceID: model.TraceID{Low: 123},
TraceID: traceID,
SpanID: model.SpanID(567),
OperationName: "hi",
References: []model.SpanRef{
{
RefType: model.ChildOf,
TraceID: model.TraceID{Low: 123},
SpanID: model.SpanID(123),
},
},
StartTime: time.Unix(0, 1000),
Duration: 5000,
Tags: model.KeyValues{someKV},
References: []model.SpanRef{model.NewChildOfRef(traceID, 123)},
StartTime: time.Unix(0, 1000),
Duration: 5000,
Tags: model.KeyValues{someKV},
Logs: []model.Log{
{
Timestamp: time.Unix(0, 1000),
Expand Down
16 changes: 13 additions & 3 deletions model/spanref.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,9 @@ func MaybeAddParentSpanID(traceID TraceID, parentSpanID SpanID, refs []SpanRef)
if parentSpanID == 0 {
return refs
}
for _, r := range refs {
if r.SpanID == parentSpanID && r.TraceID == traceID {
for i := range refs {
r := &refs[i]
if r.SpanID == parentSpanID && r.TraceID == traceID && r.RefType == ChildOf {
return refs
}
}
Expand All @@ -96,7 +97,7 @@ func MaybeAddParentSpanID(traceID TraceID, parentSpanID SpanID, refs []SpanRef)
RefType: ChildOf,
}
if len(refs) == 0 {
return []SpanRef{newRef}
return append(refs, newRef)
}
newRefs := make([]SpanRef, len(refs)+1)
newRefs[0] = newRef
Expand All @@ -112,3 +113,12 @@ func NewChildOfRef(traceID TraceID, spanID SpanID) SpanRef {
SpanID: spanID,
}
}

// NewFollowsFromRef creates a new follows-from span reference.
func NewFollowsFromRef(traceID TraceID, spanID SpanID) SpanRef {
return SpanRef{
RefType: FollowsFrom,
TraceID: traceID,
SpanID: spanID,
}
}
18 changes: 18 additions & 0 deletions model/spanref_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,21 @@ func TestSpanRefTypeToFromJSON(t *testing.T) {
err = json.Unmarshal([]byte(`{"refType":"BAD"}`), &sr3)
assert.EqualError(t, err, "not a valid SpanRefType string BAD")
}

func TestMaybeAddParentSpanID(t *testing.T) {
span := makeSpan(model.String("k", "v"))
assert.Equal(t, model.SpanID(123), span.ParentSpanID())

span.References = model.MaybeAddParentSpanID(span.TraceID, 0, span.References)
assert.Equal(t, model.SpanID(123), span.ParentSpanID())

span.References = model.MaybeAddParentSpanID(span.TraceID, 123, span.References)
assert.Equal(t, model.SpanID(123), span.ParentSpanID())

span.References = model.MaybeAddParentSpanID(span.TraceID, 123, []model.SpanRef{})
assert.Equal(t, model.SpanID(123), span.ParentSpanID())

span.References = []model.SpanRef{model.NewChildOfRef(model.TraceID{High: 42}, 789)}
span.References = model.MaybeAddParentSpanID(span.TraceID, 123, span.References)
assert.Equal(t, model.SpanID(123), span.References[0].SpanID, "parent added as first reference")
}
2 changes: 1 addition & 1 deletion plugin/storage/cassandra/savetracetest/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ func getSomeSpan() *model.Span {
TraceID: traceID,
SpanID: model.SpanID(3),
OperationName: "opName",
References: append([]model.SpanRef{model.NewChildOfRef(traceID, 4)}, getReferences()...),
References: model.MaybeAddParentSpanID(traceID, 4, getReferences()),
Flags: model.Flags(uint32(5)),
StartTime: time.Now(),
Duration: 50000 * time.Microsecond,
Expand Down
Loading

0 comments on commit beb4a57

Please sign in to comment.