diff --git a/pkg/imageverifier/bindir/bindir.go b/pkg/imageverifier/bindir/bindir.go index 198f7643a452a..cc053c7f0557e 100644 --- a/pkg/imageverifier/bindir/bindir.go +++ b/pkg/imageverifier/bindir/bindir.go @@ -31,6 +31,7 @@ import ( "github.com/containerd/containerd/v2/internal/tomlext" "github.com/containerd/containerd/v2/pkg/imageverifier" + "github.com/containerd/containerd/v2/pkg/tracing" "github.com/containerd/log" ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) @@ -123,6 +124,14 @@ func (v *ImageVerifier) runVerifier(ctx context.Context, bin string, imageName s cmd := exec.CommandContext(ctx, binPath, args...) + // Attach OTEL propagators trace context env var to the child process + if traceContext, err := tracing.GetPropagatorsTraceContext(ctx); err != nil { + log.G(ctx).Warn("could not marshall propagators trace context", err) + } else { + traceContextEnv := fmt.Sprintf("OTEL_PROPAGATORS_TRACE_CONTEXT=%s", traceContext) + cmd.Env = append(os.Environ(), traceContextEnv) + } + // We construct our own pipes instead of using the default StdinPipe, // StoutPipe, and StderrPipe in order to set timeouts on reads and writes. stdinRead, stdinWrite, err := os.Pipe() diff --git a/pkg/tracing/tracing.go b/pkg/tracing/tracing.go index 48d760feb8f75..310272e43ad16 100644 --- a/pkg/tracing/tracing.go +++ b/pkg/tracing/tracing.go @@ -18,6 +18,7 @@ package tracing import ( "context" + "encoding/json" "net/http" "strings" @@ -25,6 +26,7 @@ import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/propagation" semconv "go.opentelemetry.io/otel/semconv/v1.21.0" "go.opentelemetry.io/otel/trace" ) @@ -130,3 +132,11 @@ func Attribute(k string, v any) attribute.KeyValue { func HTTPStatusCodeAttributes(code int) []attribute.KeyValue { return []attribute.KeyValue{semconv.HTTPStatusCodeKey.Int(code)} } + +// GetPropagatorsTraceContext returns the current propagators trace context as a JSON string +func GetPropagatorsTraceContext(ctx context.Context) ([]byte, error) { + propagator := propagation.TraceContext{} + carrier := propagation.MapCarrier{} + propagator.Inject(ctx, carrier) + return json.Marshal(carrier) +}