From 57b2ec79c37cbada3e41839d3cb274ff3ac01a1b Mon Sep 17 00:00:00 2001 From: Milas Bowman Date: Thu, 7 Dec 2023 09:25:57 -0500 Subject: [PATCH] tracing: allow the `Resource` to be set externally This is a workaround for the brittleness when constructing OTel `Resource` objects. Internally, the OTel libraries do their own detection which can be merged with one created in code. However, the `semconv` spec versions must match. (NOT module version! the `semconv` package has multiple subpackages for each spec version, e.g. `semconv/v1.17`, `semconv/v1.21`, etc.) This creates a problem when BuildKit is used as a library - the importing app might be using a different, otherwise compatible version of the OTel libraries, so when it creates a resource, it will be merged with one of a different version. By allowing the `Resource` to be set (like the `Recorder`), the calling code can construct a resource using known consistent library versions that work, and then allow BuildKit to take over the rest of the initialization process for OTel. Signed-off-by: Milas Bowman (cherry picked from commit 7b3fe032dd2335333382bb6ebbc65651d7a43012) Signed-off-by: Sebastiaan van Stijn --- util/tracing/detect/detect.go | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/util/tracing/detect/detect.go b/util/tracing/detect/detect.go index 449b111aeb613..1be55b9f78dfd 100644 --- a/util/tracing/detect/detect.go +++ b/util/tracing/detect/detect.go @@ -29,6 +29,8 @@ type detector struct { var ServiceName string var Recorder *TraceRecorder +var Resource *resource.Resource + var detectors map[string]detector var once sync.Once var tp trace.TracerProvider @@ -112,13 +114,16 @@ func detect() error { return err } - res, err := resource.Detect(context.Background(), serviceNameDetector{}) - if err != nil { - return err - } - res, err = resource.Merge(resource.Default(), res) - if err != nil { - return err + if Resource == nil { + res, err := resource.Detect(context.Background(), serviceNameDetector{}) + if err != nil { + return err + } + res, err = resource.Merge(resource.Default(), res) + if err != nil { + return err + } + Resource = res } // enable log with traceID when valid exporter @@ -131,7 +136,10 @@ func detect() error { Recorder.flush = sp.ForceFlush } - sdktp := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(sp), sdktrace.WithResource(res)) + sdktp := sdktrace.NewTracerProvider( + sdktrace.WithSpanProcessor(sp), + sdktrace.WithResource(Resource), + ) closers = append(closers, sdktp.Shutdown) exporter.SpanExporter = texp