Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit12e5718

Browse files
corybspikecurtis
andauthored
feat(provisioner): propagate trace info (#17166)
If tracing is enabled, propagate the trace information to the terraformprovisioner via environment variables. This sets the `TRACEPARENT`environment variable using the default W3C trace propagators. Users canchoose to continue the trace by adding new spans in the provisioner byreading from the environment like:ctx := env.ContextWithRemoteSpanContext(context.Background(),os.Environ())---------Co-authored-by: Spike Curtis <spike@spikecurtis.com>
1 parent9eeb506 commit12e5718

File tree

3 files changed

+175
-0
lines changed

3 files changed

+175
-0
lines changed

‎provisioner/terraform/otelenv.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package terraform
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"slices"
7+
"strings"
8+
"unicode"
9+
10+
"go.opentelemetry.io/otel"
11+
"go.opentelemetry.io/otel/propagation"
12+
)
13+
14+
// TODO: replace this with the upstream OTEL env propagation when it is
15+
// released.
16+
17+
// envCarrier is a propagation.TextMapCarrier that is used to extract or
18+
// inject tracing environment variables. This is used with a
19+
// propagation.TextMapPropagator
20+
typeenvCarrierstruct {
21+
Env []string
22+
}
23+
24+
var_ propagation.TextMapCarrier= (*envCarrier)(nil)
25+
26+
functoKey(keystring)string {
27+
key=strings.ToUpper(key)
28+
key=strings.ReplaceAll(key,"-","_")
29+
returnstrings.Map(func(rrune)rune {
30+
ifunicode.IsLetter(r)||unicode.IsNumber(r)||r=='_' {
31+
returnr
32+
}
33+
return-1
34+
},key)
35+
}
36+
37+
func (c*envCarrier)Set(key,valuestring) {
38+
ifc==nil {
39+
return
40+
}
41+
key=toKey(key)
42+
fori,e:=rangec.Env {
43+
ifstrings.HasPrefix(e,key+"=") {
44+
// don't directly update the slice so we don't modify the slice
45+
// passed in
46+
c.Env=slices.Clone(c.Env)
47+
c.Env[i]=fmt.Sprintf("%s=%s",key,value)
48+
return
49+
}
50+
}
51+
c.Env=append(c.Env,fmt.Sprintf("%s=%s",key,value))
52+
}
53+
54+
func (c*envCarrier)Get(keystring)string {
55+
ifc==nil {
56+
return""
57+
}
58+
key=toKey(key)
59+
for_,e:=rangec.Env {
60+
ifstrings.HasPrefix(e,key+"=") {
61+
returnstrings.TrimPrefix(e,key+"=")
62+
}
63+
}
64+
return""
65+
}
66+
67+
func (c*envCarrier)Keys() []string {
68+
ifc==nil {
69+
returnnil
70+
}
71+
keys:=make([]string,len(c.Env))
72+
fori,e:=rangec.Env {
73+
k,_,_:=strings.Cut(e,"=")
74+
keys[i]=k
75+
}
76+
returnkeys
77+
}
78+
79+
// otelEnvInject will add add any necessary environment variables for the span
80+
// found in the Context. If environment variables are already present
81+
// in `environ` then they will be updated. If no variables are found the
82+
// new ones will be appended. The new environment will be returned, `environ`
83+
// will never be modified.
84+
funcotelEnvInject(ctx context.Context,environ []string) []string {
85+
c:=&envCarrier{Env:environ}
86+
otel.GetTextMapPropagator().Inject(ctx,c)
87+
returnc.Env
88+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package terraform
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
"go.opentelemetry.io/otel"
9+
"go.opentelemetry.io/otel/propagation"
10+
sdktrace"go.opentelemetry.io/otel/sdk/trace"
11+
"go.opentelemetry.io/otel/trace"
12+
)
13+
14+
typetestIDGeneratorstruct{}
15+
16+
var_ sdktrace.IDGenerator= (*testIDGenerator)(nil)
17+
18+
func (testIDGenerator)NewIDs(_ context.Context) (trace.TraceID, trace.SpanID) {
19+
traceID,_:=trace.TraceIDFromHex("60d19e9e9abf2197c1d6d8f93e28ee2a")
20+
spanID,_:=trace.SpanIDFromHex("a028bd951229a46f")
21+
returntraceID,spanID
22+
}
23+
24+
func (testIDGenerator)NewSpanID(_ context.Context,_ trace.TraceID) trace.SpanID {
25+
spanID,_:=trace.SpanIDFromHex("a028bd951229a46f")
26+
returnspanID
27+
}
28+
29+
funcTestOtelEnvInject(t*testing.T) {
30+
t.Parallel()
31+
testTraceProvider:=sdktrace.NewTracerProvider(
32+
sdktrace.WithSampler(sdktrace.AlwaysSample()),
33+
sdktrace.WithIDGenerator(testIDGenerator{}),
34+
)
35+
36+
tracer:=testTraceProvider.Tracer("example")
37+
ctx,span:=tracer.Start(context.Background(),"testing")
38+
deferspan.End()
39+
40+
input:= []string{"PATH=/usr/bin:/bin"}
41+
42+
otel.SetTextMapPropagator(propagation.TraceContext{})
43+
got:=otelEnvInject(ctx,input)
44+
require.Equal(t, []string{
45+
"PATH=/usr/bin:/bin",
46+
"TRACEPARENT=00-60d19e9e9abf2197c1d6d8f93e28ee2a-a028bd951229a46f-01",
47+
},got)
48+
49+
// verify we update rather than append
50+
input= []string{
51+
"PATH=/usr/bin:/bin",
52+
"TRACEPARENT=origTraceParent",
53+
"TERM=xterm",
54+
}
55+
56+
otel.SetTextMapPropagator(propagation.TraceContext{})
57+
got=otelEnvInject(ctx,input)
58+
require.Equal(t, []string{
59+
"PATH=/usr/bin:/bin",
60+
"TRACEPARENT=00-60d19e9e9abf2197c1d6d8f93e28ee2a-a028bd951229a46f-01",
61+
"TERM=xterm",
62+
},got)
63+
}
64+
65+
funcTestEnvCarrierSet(t*testing.T) {
66+
t.Parallel()
67+
c:=&envCarrier{
68+
Env: []string{"PATH=/usr/bin:/bin","TERM=xterm"},
69+
}
70+
c.Set("PATH","/usr/local/bin")
71+
c.Set("NEWVAR","newval")
72+
require.Equal(t, []string{
73+
"PATH=/usr/local/bin",
74+
"TERM=xterm",
75+
"NEWVAR=newval",
76+
},c.Env)
77+
}
78+
79+
funcTestEnvCarrierKeys(t*testing.T) {
80+
t.Parallel()
81+
c:=&envCarrier{
82+
Env: []string{"PATH=/usr/bin:/bin","TERM=xterm"},
83+
}
84+
require.Equal(t, []string{"PATH","TERM"},c.Keys())
85+
}

‎provisioner/terraform/provision.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ func (s *server) Plan(
156156
iferr!=nil {
157157
returnprovisionersdk.PlanErrorf("setup env: %s",err)
158158
}
159+
env=otelEnvInject(ctx,env)
159160

160161
vars,err:=planVars(request)
161162
iferr!=nil {
@@ -208,6 +209,7 @@ func (s *server) Apply(
208209
iferr!=nil {
209210
returnprovisionersdk.ApplyErrorf("provision env: %s",err)
210211
}
212+
env=otelEnvInject(ctx,env)
211213
resp,err:=e.apply(
212214
ctx,killCtx,env,sess,
213215
)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp