Skip to content

Commit a92bc5e

Browse files
committed
PF-9591-traceset added end-to-end W3C tracestate propagation to the agent
1 parent 0e059a8 commit a92bc5e

5 files changed

Lines changed: 30 additions & 2 deletions

File tree

agent/job_runner.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ BUILDKITE_TRACE_CONTEXT_ENCODING
480480
BUILDKITE_TRACING_BACKEND
481481
BUILDKITE_TRACING_SERVICE_NAME
482482
BUILDKITE_TRACING_TRACEPARENT
483+
BUILDKITE_TRACING_TRACESTATE
483484
BUILDKITE_TRACING_PROPAGATE_TRACEPARENT
484485
BUILDKITE_AGENT_AWS_KMS_KEY
485486
BUILDKITE_AGENT_GCP_KMS_KEY
@@ -695,6 +696,13 @@ BUILDKITE_AGENT_JWKS_KEY_ID`
695696
if r.conf.Job.TraceParent != "" {
696697
setEnv("BUILDKITE_TRACING_TRACEPARENT", r.conf.Job.TraceParent)
697698
}
699+
// Buildkite backend may also provide a tracestate property on the job,
700+
// which carries vendor-specific trace context alongside the traceparent.
701+
//
702+
// https://www.w3.org/TR/trace-context/#tracestate-header
703+
if r.conf.Job.TraceState != "" {
704+
setEnv("BUILDKITE_TRACING_TRACESTATE", r.conf.Job.TraceState)
705+
}
698706
if r.conf.AgentConfiguration.TracingPropagateTraceparent {
699707
setEnv("BUILDKITE_TRACING_PROPAGATE_TRACEPARENT", "true")
700708
}

api/jobs.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type Job struct {
2727
RunnableAt string `json:"runnable_at"`
2828
ChunksFailedCount int `json:"chunks_failed_count"`
2929
TraceParent string `json:"traceparent"`
30+
TraceState string `json:"tracestate"`
3031
Priority int `json:"priority"`
3132
}
3233

clicommand/bootstrap.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ type BootstrapConfig struct {
109109
TracingBackend string `cli:"tracing-backend"`
110110
TracingServiceName string `cli:"tracing-service-name"`
111111
TracingTraceParent string `cli:"tracing-traceparent"`
112+
TracingTraceState string `cli:"tracing-tracestate"`
112113
TracingPropagateTraceparent bool `cli:"tracing-propagate-traceparent"`
113114
TraceContextEncoding string `cli:"trace-context-encoding"`
114115
NoJobAPI bool `cli:"no-job-api"`
@@ -339,6 +340,12 @@ var BootstrapCommand = cli.Command{
339340
EnvVar: "BUILDKITE_TRACING_TRACEPARENT",
340341
Value: "",
341342
},
343+
cli.StringFlag{
344+
Name: "tracing-tracestate",
345+
Usage: "W3C Trace State for tracing",
346+
EnvVar: "BUILDKITE_TRACING_TRACESTATE",
347+
Value: "",
348+
},
342349
cli.BoolFlag{
343350
Name: "tracing-propagate-traceparent",
344351
Usage: "Accept traceparent from Buildkite control plane (default: false)",
@@ -478,6 +485,7 @@ var BootstrapCommand = cli.Command{
478485
TracingServiceName: cfg.TracingServiceName,
479486
TraceContextCodec: traceContextCodec,
480487
TracingTraceParent: cfg.TracingTraceParent,
488+
TracingTraceState: cfg.TracingTraceState,
481489
TracingPropagateTraceparent: cfg.TracingPropagateTraceparent,
482490
JobAPI: !cfg.NoJobAPI,
483491
DisabledWarnings: cfg.DisableWarningsFor,

internal/job/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ type ExecutorConfig struct {
192192
// Traceing context information
193193
TracingTraceParent string
194194

195+
// W3C tracestate accompanying TracingTraceParent. Only propagated when
196+
// TracingPropagateTraceparent is enabled.
197+
TracingTraceState string
198+
195199
// Accept traceparent context from Buildkite control plane
196200
TracingPropagateTraceparent bool
197201

internal/job/tracing.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,16 @@ func (e *Executor) contextWithTraceparentIfEnabled(ctx context.Context) context.
211211
return ctx
212212
}
213213

214-
return otel.GetTextMapPropagator().Extract(ctx, propagation.MapCarrier{
214+
carrier := propagation.MapCarrier{
215215
"traceparent": e.TracingTraceParent,
216-
})
216+
}
217+
// W3C tracestate is optional; include it only when the server provides one
218+
// so the propagator doesn't try to parse an empty header.
219+
if e.TracingTraceState != "" {
220+
carrier["tracestate"] = e.TracingTraceState
221+
}
222+
223+
return otel.GetTextMapPropagator().Extract(ctx, carrier)
217224
}
218225

219226
func GenericTracingExtras(e *Executor, env *env.Environment) map[string]any {

0 commit comments

Comments
 (0)