1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2025-08-10 22:31:50 +02:00

Do not inline noopSpan.tracerProvider (#6456)

Currently, the `noopSpan.tracerProvider` is inlined into
`noopSpan.TracerProvider` for binaries built with standard tooling. This
function is needed in the ELF file for auto-instrumentation. Ensure
this, and the other required methods are always kept isolated.

cc @open-telemetry/go-instrumentation-approvers

---------

Co-authored-by: Robert Pająk <pellared@hotmail.com>
This commit is contained in:
Tyler Yahn
2025-03-19 14:50:43 -07:00
committed by GitHub
parent 650b5a7975
commit 90a9d1d936
3 changed files with 9 additions and 0 deletions

View File

@@ -22,6 +22,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
### Fixes ### Fixes
- Stop percent encoding header environment variables in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc` and `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#6392) - Stop percent encoding header environment variables in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc` and `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#6392)
- Ensure the `noopSpan.tracerProvider` method is not inlined in `go.opentelemetry.io/otel/trace` so the `go.opentelemetry.io/auto` instrumentation can instrument non-recording spans. (#6456)
<!-- Released section --> <!-- Released section -->
<!-- Don't change this section unless doing release --> <!-- Don't change this section unless doing release -->

View File

@@ -158,6 +158,12 @@ func (t *tracer) Start(ctx context.Context, name string, opts ...trace.SpanStart
// a nonRecordingSpan by default. // a nonRecordingSpan by default.
var autoInstEnabled = new(bool) var autoInstEnabled = new(bool)
// newSpan is called by tracer.Start so auto-instrumentation can attach an eBPF
// uprobe to this code.
//
// "noinline" pragma prevents the method from ever being inlined.
//
//go:noinline
func (t *tracer) newSpan(ctx context.Context, autoSpan *bool, name string, opts []trace.SpanStartOption) (context.Context, trace.Span) { func (t *tracer) newSpan(ctx context.Context, autoSpan *bool, name string, opts []trace.SpanStartOption) (context.Context, trace.Span) {
// autoInstEnabled is passed to newSpan via the autoSpan parameter. This is // autoInstEnabled is passed to newSpan via the autoSpan parameter. This is
// so the auto-instrumentation can define a uprobe for (*t).newSpan and be // so the auto-instrumentation can define a uprobe for (*t).newSpan and be

View File

@@ -95,6 +95,8 @@ var autoInstEnabled = new(bool)
// tracerProvider return a noopTracerProvider if autoEnabled is false, // tracerProvider return a noopTracerProvider if autoEnabled is false,
// otherwise it will return a TracerProvider from the sdk package used in // otherwise it will return a TracerProvider from the sdk package used in
// auto-instrumentation. // auto-instrumentation.
//
//go:noinline
func (noopSpan) tracerProvider(autoEnabled *bool) TracerProvider { func (noopSpan) tracerProvider(autoEnabled *bool) TracerProvider {
if *autoEnabled { if *autoEnabled {
return newAutoTracerProvider() return newAutoTracerProvider()