Skip to content

Commit 7702761

Browse files
Updating instrumentations to core module v1.61.0 (#688)
* added support for opt-in exit spans without entry spans
1 parent 1a99d8c commit 7702761

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+450
-269
lines changed

instrumentation/cloud.google.com/go/go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ require (
66
cloud.google.com/go/iam v1.1.6
77
cloud.google.com/go/pubsub v1.37.0
88
cloud.google.com/go/storage v1.39.1
9-
github.com/instana/go-sensor v1.60.0
9+
github.com/instana/go-sensor v1.61.0
1010
github.com/opentracing/opentracing-go v1.2.0
1111
github.com/stretchr/testify v1.8.4
1212
google.golang.org/api v0.167.0

instrumentation/cloud.google.com/go/go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF
6969
github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
7070
github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA=
7171
github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc=
72-
github.com/instana/go-sensor v1.60.0 h1:lsAiwmK5AtNQ9gLHPLvZt0aLddZxM4R0oakkO7rXO2U=
73-
github.com/instana/go-sensor v1.60.0/go.mod h1:Ks06EG9Da5O3hbdJiHIePG/vNmToovkaJjMlUBd70Yc=
72+
github.com/instana/go-sensor v1.61.0 h1:rHkRt2MRHzuoxJYFTnU5LMX74+8e0j6FfWGOWBifr1M=
73+
github.com/instana/go-sensor v1.61.0/go.mod h1:Ks06EG9Da5O3hbdJiHIePG/vNmToovkaJjMlUBd70Yc=
7474
github.com/looplab/fsm v1.0.1 h1:OEW0ORrIx095N/6lgoGkFkotqH6s7vaFPsgjLAaF5QU=
7575
github.com/looplab/fsm v1.0.1/go.mod h1:PmD3fFvQEIsjMEfvZdrCDZ6y8VwKTwWNjlpEr6IKPO4=
7676
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=

instrumentation/cloud.google.com/go/internal/trace.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,19 @@ import (
1717
// StartExitSpan starts a new span and injects in into returned context. If provided context already
1818
// contains an active span, it will be used as a parent.
1919
func StartExitSpan(ctx context.Context, op string, opts ...ot.StartSpanOption) context.Context {
20+
// if user opts in to forward exit span without an entry span,
21+
// we need to create the exit span even there is no entry span
22+
sensor := instana.NewSensor("google-cloud")
23+
tracer := sensor.Tracer()
24+
2025
sp, ok := instana.SpanFromContext(ctx)
21-
if !ok {
22-
return ctx
26+
if ok {
27+
tracer = sp.Tracer()
28+
opts = append(opts, ot.ChildOf(sp.Context()))
2329
}
30+
span := tracer.StartSpan(op, opts...)
2431

25-
opts = append(opts, ot.ChildOf(sp.Context()))
26-
27-
return instana.ContextWithSpan(ctx, sp.Tracer().StartSpan(op, opts...))
32+
return instana.ContextWithSpan(ctx, span)
2833
}
2934

3035
// FinishSpan finishes an active span found in context, optionally logging an error if it's not nil.

instrumentation/cloud.google.com/go/pubsub/pubsub_test.go

+35-20
Original file line numberDiff line numberDiff line change
@@ -29,47 +29,51 @@ func TestClient_Topic(t *testing.T) {
2929
require.NoError(t, err)
3030
defer teardown()
3131

32-
sensor := instana.NewSensorWithTracer(
33-
instana.NewTracerWithEverything(
34-
instana.DefaultOptions(),
35-
instana.NewTestRecorder(),
36-
),
37-
)
32+
recorder := instana.NewTestRecorder()
33+
tracer := instana.NewTracerWithEverything(&instana.Options{AgentClient: alwaysReadyClient{}}, recorder)
34+
35+
sensor := instana.NewSensorWithTracer(tracer)
3836
defer instana.ShutdownSensor()
3937

40-
_, err = srv.GServer.CreateTopic(context.Background(), &pb.Topic{
38+
pSpan := tracer.StartSpan("parent-span")
39+
ctx := context.Background()
40+
if pSpan != nil {
41+
ctx = instana.ContextWithSpan(ctx, pSpan)
42+
}
43+
44+
_, err = srv.GServer.CreateTopic(ctx, &pb.Topic{
4145
Name: "projects/test-project/topics/test-topic",
4246
})
4347
require.NoError(t, err)
4448

4549
examples := map[string]func(*testing.T, *pubsub.Message) *pubsub.PublishResult{
4650
"ClientProject": func(t *testing.T, msg *pubsub.Message) *pubsub.PublishResult {
47-
client, err := pubsub.NewClient(context.Background(), "test-project", sensor, option.WithGRPCConn(conn))
51+
client, err := pubsub.NewClient(ctx, "test-project", sensor, option.WithGRPCConn(conn))
4852
require.NoError(t, err)
4953

5054
top := client.Topic("test-topic")
5155

52-
return top.Publish(context.Background(), msg)
56+
return top.Publish(ctx, msg)
5357
},
5458
"OtherProject": func(t *testing.T, msg *pubsub.Message) *pubsub.PublishResult {
55-
client, err := pubsub.NewClient(context.Background(), "other-project", sensor, option.WithGRPCConn(conn))
59+
client, err := pubsub.NewClient(ctx, "other-project", sensor, option.WithGRPCConn(conn))
5660
require.NoError(t, err)
5761

5862
top := client.TopicInProject("test-topic", "test-project")
5963

60-
return top.Publish(context.Background(), msg)
64+
return top.Publish(ctx, msg)
6165
},
6266
"CreateTopic": func(t *testing.T, msg *pubsub.Message) *pubsub.PublishResult {
63-
client, err := pubsub.NewClient(context.Background(), "test-project", sensor, option.WithGRPCConn(conn))
67+
client, err := pubsub.NewClient(ctx, "test-project", sensor, option.WithGRPCConn(conn))
6468
require.NoError(t, err)
6569

66-
top, err := client.CreateTopic(context.Background(), "new-test-topic")
70+
top, err := client.CreateTopic(ctx, "new-test-topic")
6771
require.NoError(t, err)
6872

69-
return top.Publish(context.Background(), msg)
73+
return top.Publish(ctx, msg)
7074
},
7175
"CreateTopicWithConfig": func(t *testing.T, msg *pubsub.Message) *pubsub.PublishResult {
72-
client, err := pubsub.NewClient(context.Background(), "test-project", sensor, option.WithGRPCConn(conn))
76+
client, err := pubsub.NewClient(ctx, "test-project", sensor, option.WithGRPCConn(conn))
7377
require.NoError(t, err)
7478

7579
conf := &gpubsub.TopicConfig{
@@ -78,10 +82,10 @@ func TestClient_Topic(t *testing.T) {
7882
},
7983
}
8084

81-
top, err := client.CreateTopicWithConfig(context.Background(), "new-test-topic-with-config", conf)
85+
top, err := client.CreateTopicWithConfig(ctx, "new-test-topic-with-config", conf)
8286
require.NoError(t, err)
8387

84-
createdConf, err := top.Config(context.Background())
88+
createdConf, err := top.Config(ctx)
8589
require.NoError(t, err)
8690
assert.Equal(t, conf.Labels, createdConf.Labels)
8791
assert.Equal(t, conf.MessageStoragePolicy, createdConf.MessageStoragePolicy)
@@ -91,7 +95,7 @@ func TestClient_Topic(t *testing.T) {
9195
// name cannot be tested because in new versions of pubsub this new name attribute is not replicated to the original conf. only top.Config() has it
9296
// assert.Equal(t, conf.name, createdConf.name)
9397

94-
return top.Publish(context.Background(), msg)
98+
return top.Publish(ctx, msg)
9599
},
96100
}
97101

@@ -106,7 +110,15 @@ func TestClient_Topic(t *testing.T) {
106110
},
107111
})
108112

109-
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
113+
require.Eventually(t, func() bool {
114+
return recorder.QueuedSpansCount() == 1
115+
}, 250*time.Millisecond, 25*time.Millisecond)
116+
117+
spans := recorder.GetQueuedSpans()
118+
require.Len(t, spans, 1)
119+
span := spans[0]
120+
121+
ctx, cancel := context.WithTimeout(ctx, time.Second)
110122
defer cancel()
111123

112124
msgID, err := res.Get(ctx)
@@ -117,7 +129,10 @@ func TestClient_Topic(t *testing.T) {
117129

118130
assert.Equal(t, []byte("message data"), msg.Data)
119131
assert.Equal(t, map[string]string{
120-
"key1": "value1",
132+
"x-instana-t": instana.FormatID(span.TraceID),
133+
"x-instana-s": instana.FormatID(span.SpanID),
134+
"x-instana-l": "1",
135+
"key1": "value1",
121136
}, msg.Attributes)
122137
})
123138
}

instrumentation/cloud.google.com/go/pubsub/topic.go

+10-7
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,23 @@ type Topic struct {
3535
//
3636
// See https://pkg.go.dev/cloud.google.com/go/pubsub?tab=doc#Topic.Publish for further details on wrapped method.
3737
func (top *Topic) Publish(ctx context.Context, msg *pubsub.Message) *pubsub.PublishResult {
38-
parent, ok := instana.SpanFromContext(ctx)
39-
if !ok {
40-
return top.Topic.Publish(ctx, msg)
41-
}
4238

43-
sp := parent.Tracer().StartSpan("gcps",
39+
tracer := top.sensor.Tracer()
40+
opts := []opentracing.StartSpanOption{
4441
ext.SpanKindProducer,
45-
opentracing.ChildOf(parent.Context()),
4642
opentracing.Tags{
4743
tags.GcpsOp: "PUBLISH",
4844
tags.GcpsProjid: top.projectID,
4945
tags.GcpsTop: top.ID(),
5046
},
51-
)
47+
}
48+
49+
parent, ok := instana.SpanFromContext(ctx)
50+
if ok {
51+
tracer = parent.Tracer()
52+
opts = append(opts, opentracing.ChildOf(parent.Context()))
53+
}
54+
sp := tracer.StartSpan("gcps", opts...)
5255

5356
if msg.Attributes == nil {
5457
msg.Attributes = make(map[string]string)

instrumentation/cloud.google.com/go/pubsub/topic_test.go

+23-6
Original file line numberDiff line numberDiff line change
@@ -107,33 +107,47 @@ func TestTopic_Publish(t *testing.T) {
107107

108108
func TestTopic_Publish_NoTrace(t *testing.T) {
109109
recorder := instana.NewTestRecorder()
110-
tracer := instana.NewTracerWithEverything(instana.DefaultOptions(), recorder)
110+
tracer := instana.NewTracerWithEverything(&instana.Options{AgentClient: alwaysReadyClient{}}, recorder)
111111
defer instana.ShutdownSensor()
112112

113+
pSpan := tracer.StartSpan("parent-span")
114+
ctx := context.Background()
115+
if pSpan != nil {
116+
ctx = instana.ContextWithSpan(ctx, pSpan)
117+
}
118+
113119
srv, conn, teardown, err := setupMockServer()
114120
require.NoError(t, err)
115121
defer teardown()
116122

117-
srv.GServer.CreateTopic(context.Background(), &pb.Topic{
123+
srv.GServer.CreateTopic(ctx, &pb.Topic{
118124
Name: "projects/test-project/topics/test-topic",
119125
})
120126

121127
client, err := pubsub.NewClient(
122-
context.Background(),
128+
ctx,
123129
"test-project",
124130
instana.NewSensorWithTracer(tracer),
125131
option.WithGRPCConn(conn),
126132
)
127133
require.NoError(t, err)
128134

129-
res := client.Topic("test-topic").Publish(context.Background(), &pubsub.Message{
135+
res := client.Topic("test-topic").Publish(ctx, &pubsub.Message{
130136
Data: []byte("message data"),
131137
Attributes: map[string]string{
132138
"key1": "value1",
133139
},
134140
})
135141

136-
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
142+
require.Eventually(t, func() bool {
143+
return recorder.QueuedSpansCount() == 1
144+
}, 250*time.Millisecond, 25*time.Millisecond)
145+
146+
spans := recorder.GetQueuedSpans()
147+
require.Len(t, spans, 1)
148+
gcpsSpan := spans[0]
149+
150+
ctx, cancel := context.WithTimeout(ctx, time.Second)
137151
defer cancel()
138152

139153
msgID, err := res.Get(ctx)
@@ -143,6 +157,9 @@ func TestTopic_Publish_NoTrace(t *testing.T) {
143157
require.NotNil(t, msg)
144158

145159
assert.Equal(t, map[string]string{
146-
"key1": "value1",
160+
"x-instana-t": instana.FormatID(gcpsSpan.TraceID),
161+
"x-instana-s": instana.FormatID(gcpsSpan.SpanID),
162+
"x-instana-l": "1",
163+
"key1": "value1",
147164
}, msg.Attributes)
148165
}

instrumentation/instaamqp091/go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/instana/go-sensor/instrumentation/instaamqp091
33
go 1.18
44

55
require (
6-
github.com/instana/go-sensor v1.60.0
6+
github.com/instana/go-sensor v1.61.0
77
github.com/opentracing/opentracing-go v1.2.0
88
github.com/rabbitmq/amqp091-go v1.9.0
99
github.com/stretchr/testify v1.8.1

instrumentation/instaamqp091/go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
22
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
33
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4-
github.com/instana/go-sensor v1.60.0 h1:lsAiwmK5AtNQ9gLHPLvZt0aLddZxM4R0oakkO7rXO2U=
5-
github.com/instana/go-sensor v1.60.0/go.mod h1:Ks06EG9Da5O3hbdJiHIePG/vNmToovkaJjMlUBd70Yc=
4+
github.com/instana/go-sensor v1.61.0 h1:rHkRt2MRHzuoxJYFTnU5LMX74+8e0j6FfWGOWBifr1M=
5+
github.com/instana/go-sensor v1.61.0/go.mod h1:Ks06EG9Da5O3hbdJiHIePG/vNmToovkaJjMlUBd70Yc=
66
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
77
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
88
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=

instrumentation/instaawssdk/dynamodb.go

+9-8
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,17 @@ func StartDynamoDBSpan(req *request.Request, sensor instana.TracerLogger) {
2323
sensor.Logger().Warn("failed to extract DynamoDB tags: ", err)
2424
}
2525

26-
parent, ok := instana.SpanFromContext(req.Context())
27-
if !ok {
28-
return
29-
}
30-
31-
sp := sensor.Tracer().StartSpan("dynamodb",
26+
// an exit span will be created without a parent span
27+
// and forwarded if user chose to opt in
28+
opts := []opentracing.StartSpanOption{
3229
ext.SpanKindRPCClient,
33-
opentracing.ChildOf(parent.Context()),
3430
tags,
35-
)
31+
}
32+
parent, ok := instana.SpanFromContext(req.Context())
33+
if ok {
34+
opts = append(opts, opentracing.ChildOf(parent.Context()))
35+
}
36+
sp := sensor.Tracer().StartSpan("dynamodb", opts...)
3637

3738
req.SetContext(instana.ContextWithSpan(req.Context(), sp))
3839
}

instrumentation/instaawssdk/dynamodb_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func TestStartDynamoDBSpan_NoActiveSpan(t *testing.T) {
9999
instaawssdk.StartDynamoDBSpan(req, sensor)
100100

101101
_, ok := instana.SpanFromContext(req.Context())
102-
require.False(t, ok)
102+
require.True(t, ok)
103103
}
104104

105105
func TestFinalizeDynamoDB_NoError(t *testing.T) {

instrumentation/instaawssdk/go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.19
44

55
require (
66
github.com/aws/aws-sdk-go v1.51.5
7-
github.com/instana/go-sensor v1.60.0
7+
github.com/instana/go-sensor v1.61.0
88
github.com/opentracing/opentracing-go v1.2.0
99
github.com/stretchr/testify v1.8.1
1010
)

instrumentation/instaawssdk/go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ github.com/aws/aws-sdk-go v1.51.5/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3Tju
33
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
44
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
55
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6-
github.com/instana/go-sensor v1.60.0 h1:lsAiwmK5AtNQ9gLHPLvZt0aLddZxM4R0oakkO7rXO2U=
7-
github.com/instana/go-sensor v1.60.0/go.mod h1:Ks06EG9Da5O3hbdJiHIePG/vNmToovkaJjMlUBd70Yc=
6+
github.com/instana/go-sensor v1.61.0 h1:rHkRt2MRHzuoxJYFTnU5LMX74+8e0j6FfWGOWBifr1M=
7+
github.com/instana/go-sensor v1.61.0/go.mod h1:Ks06EG9Da5O3hbdJiHIePG/vNmToovkaJjMlUBd70Yc=
88
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
99
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
1010
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=

instrumentation/instaawssdk/invoke_lambda.go

+10-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package instaawssdk
66
import (
77
"github.com/aws/aws-sdk-go/aws"
88
"github.com/aws/aws-sdk-go/service/lambda"
9+
"github.com/opentracing/opentracing-go/ext"
910
otlog "github.com/opentracing/opentracing-go/log"
1011

1112
"github.com/aws/aws-sdk-go/aws/request"
@@ -16,14 +17,17 @@ import (
1617
// StartInvokeLambdaSpan initiates a new span from an AWS Invoke request and injects it into the
1718
// request.Request context
1819
func StartInvokeLambdaSpan(req *request.Request, sensor instana.TracerLogger) {
20+
21+
// an exit span will be created without a parent span
22+
// and forwarded if user chose to opt in
23+
opts := []opentracing.StartSpanOption{
24+
ext.SpanKindRPCClient,
25+
}
1926
parent, ok := instana.SpanFromContext(req.Context())
20-
if !ok {
21-
return
27+
if ok {
28+
opts = append(opts, opentracing.ChildOf(parent.Context()))
2229
}
23-
24-
sp := sensor.Tracer().StartSpan("aws.lambda.invoke",
25-
opentracing.ChildOf(parent.Context()),
26-
)
30+
sp := sensor.Tracer().StartSpan("aws.lambda.invoke", opts...)
2731

2832
if ii, ok := req.Params.(*lambda.InvokeInput); ok {
2933
sp.SetTag(lambdaFunction, aws.StringValue(ii.FunctionName))

instrumentation/instaawssdk/invoke_lambda_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func TestStartInvokeLambdaSpan_NoActiveSpan(t *testing.T) {
9393
instaawssdk.StartInvokeLambdaSpan(req, sensor)
9494

9595
_, ok := instana.SpanFromContext(req.Context())
96-
require.False(t, ok)
96+
require.True(t, ok)
9797
}
9898

9999
func TestFinalizeInvoke_NoError(t *testing.T) {

0 commit comments

Comments
 (0)