Skip to content

Commit d6e4401

Browse files
authored
Do not use global tracer provider (#1835)
Signed-off-by: Kemal Akkoyun <kakkoyun@gmail.com> - Use passed down trace provider rather than implicitly depending on the global one. - Make sure the analytics component has proper context propagation.
2 parents d969183 + 23d540a commit d6e4401

File tree

6 files changed

+46
-14
lines changed

6 files changed

+46
-14
lines changed

cmd/parca-agent/main.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ import (
4141
"github.com/prometheus/client_golang/prometheus"
4242
"github.com/prometheus/client_golang/prometheus/collectors"
4343
"github.com/prometheus/client_golang/prometheus/promhttp"
44+
promconfig "github.com/prometheus/common/config"
4445
"github.com/prometheus/procfs"
4546
"github.com/prometheus/prometheus/promql/parser"
4647
"github.com/zcalusic/sysinfo"
48+
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
4749
"go.opentelemetry.io/otel/trace"
4850
"go.uber.org/automaxprocs/maxprocs"
4951
"google.golang.org/grpc"
@@ -487,7 +489,14 @@ func run(logger log.Logger, reg *prometheus.Registry, flags flags) error {
487489
if !flags.AnalyticsOptOut {
488490
logger := log.With(logger, "group", "analytics")
489491
c := analytics.NewClient(
490-
http.DefaultClient,
492+
tp,
493+
&http.Client{
494+
Transport: otelhttp.NewTransport(
495+
promconfig.NewUserAgentRoundTripper(
496+
fmt.Sprintf("parca.dev/analytics-client/%s", version),
497+
http.DefaultTransport),
498+
),
499+
},
491500
"parca-agent",
492501
time.Second*5,
493502
)
@@ -672,7 +681,7 @@ func run(logger log.Logger, reg *prometheus.Registry, flags flags) error {
672681
if !flags.Debuginfo.UploadDisable {
673682
dbginfo = debuginfo.New(
674683
log.With(logger, "component", "debuginfo"),
675-
tp.Tracer("debuginfo"),
684+
tp,
676685
reg,
677686
ofp,
678687
debuginfoClient,

go.mod

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ require (
3939
go.buf.build/protocolbuffers/go/prometheus/prometheus v1.3.9
4040
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0
4141
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.42.0
42+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0
4243
go.opentelemetry.io/otel v1.16.0
4344
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0
4445
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0
@@ -94,6 +95,7 @@ require (
9495
github.com/docker/go-units v0.5.0 // indirect
9596
github.com/efficientgo/core v1.0.0-rc.0.0.20221201130417-ba593f67d2a4 // indirect
9697
github.com/emicklei/go-restful/v3 v3.10.1 // indirect
98+
github.com/felixge/httpsnoop v1.0.3 // indirect
9799
github.com/go-delve/delve v1.20.2 // indirect
98100
github.com/go-logfmt/logfmt v0.6.0 // indirect
99101
github.com/go-logr/logr v1.2.4 // indirect
@@ -119,6 +121,7 @@ require (
119121
github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab // indirect
120122
github.com/imdario/mergo v0.3.13 // indirect
121123
github.com/josharian/intern v1.0.0 // indirect
124+
github.com/jpillora/backoff v1.0.0 // indirect
122125
github.com/json-iterator/go v1.1.12 // indirect
123126
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
124127
github.com/kylelemons/godebug v1.1.0 // indirect
@@ -134,6 +137,7 @@ require (
134137
github.com/modern-go/reflect2 v1.0.2 // indirect
135138
github.com/mozillazg/go-httpheader v0.2.1 // indirect
136139
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
140+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
137141
github.com/nanmu42/limitio v1.0.0 // indirect
138142
github.com/ncw/swift v1.0.53 // indirect
139143
github.com/opencontainers/go-digest v1.0.0 // indirect

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.
180180
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
181181
github.com/envoyproxy/protoc-gen-validate v1.0.1 h1:kt9FtLiooDc0vbwTLhdg3dyNX1K9Qwa1EK9LcD4jVUQ=
182182
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
183+
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
184+
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
183185
github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0=
184186
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
185187
github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA=
@@ -366,6 +368,7 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22
366368
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
367369
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
368370
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
371+
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
369372
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
370373
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
371374
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
@@ -442,6 +445,7 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq
442445
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
443446
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
444447
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
448+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
445449
github.com/nanmu42/limitio v1.0.0 h1:dpopBYPwUyLOPv+vsGja0iax+dG0SP9paTEmz+Sy7KU=
446450
github.com/nanmu42/limitio v1.0.0/go.mod h1:8H40zQ7pqxzbwZ9jxsK2hDoE06TH5ziybtApt1io8So=
447451
github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks=
@@ -592,6 +596,8 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.4
592596
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ=
593597
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.42.0 h1:0vzgiFDsCh/jxRCR1xcRrtMoeCu2itXz/PsXst5P8rI=
594598
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.42.0/go.mod h1:y0vOY2OKFMOTvwxKfurStPayUUKGHlNeVqNneHmFXr0=
599+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM=
600+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8=
595601
go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s=
596602
go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4=
597603
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0=

pkg/analytics/remote_write.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ import (
2020
"fmt"
2121
"io"
2222
"net/http"
23+
"net/http/httptrace"
2324
"os"
2425
"time"
2526

2627
"github.com/gogo/protobuf/proto"
2728
"github.com/golang/snappy"
2829
"go.buf.build/protocolbuffers/go/prometheus/prometheus"
29-
"go.opentelemetry.io/otel"
30+
"go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace"
3031
"go.opentelemetry.io/otel/trace"
3132
)
3233

@@ -36,6 +37,9 @@ const (
3637
)
3738

3839
type Client struct {
40+
tp trace.TracerProvider
41+
tracer trace.Tracer
42+
3943
client *http.Client
4044
urlString string
4145
userAgent string
@@ -46,6 +50,7 @@ type Client struct {
4650
}
4751

4852
func NewClient(
53+
tp trace.TracerProvider,
4954
client *http.Client,
5055
userAgent string,
5156
timeout time.Duration,
@@ -57,6 +62,9 @@ func NewClient(
5762
}
5863

5964
return &Client{
65+
tp: tp,
66+
tracer: tp.Tracer("parca/analytics"),
67+
6068
client: client,
6169

6270
urlString: analyticsURL,
@@ -69,6 +77,9 @@ func NewClient(
6977
}
7078

7179
func (c *Client) Send(ctx context.Context, wreq *prometheus.WriteRequest) error {
80+
ctx, span := c.tracer.Start(ctx, "Send", trace.WithSpanKind(trace.SpanKindClient))
81+
defer span.End()
82+
7283
c.pBuf.Reset()
7384
err := c.pBuf.Marshal(wreq)
7485
if err != nil {
@@ -88,6 +99,9 @@ func (c *Client) Send(ctx context.Context, wreq *prometheus.WriteRequest) error
8899
// Store sends a batch of samples to the HTTP endpoint, the request is the proto marshaled
89100
// and encoded bytes from codec.go.
90101
func (c *Client) sendReq(ctx context.Context, req []byte) error {
102+
ctx, span := c.tracer.Start(ctx, "sendReq", trace.WithSpanKind(trace.SpanKindClient))
103+
defer span.End()
104+
91105
httpReq, err := http.NewRequest(http.MethodPost, c.urlString, bytes.NewReader(req))
92106
if err != nil {
93107
// Errors from NewRequest are from unparsable URLs, so are not
@@ -99,11 +113,10 @@ func (c *Client) sendReq(ctx context.Context, req []byte) error {
99113
httpReq.Header.Set("Content-Type", "application/x-protobuf")
100114
httpReq.Header.Set("User-Agent", c.userAgent)
101115
httpReq.Header.Set("X-Prometheus-Remote-Write-Version", "0.1.0")
116+
102117
ctx, cancel := context.WithTimeout(ctx, c.timeout)
103118
defer cancel()
104-
105-
ctx, span := otel.Tracer("").Start(ctx, "Remote Store", trace.WithSpanKind(trace.SpanKindClient))
106-
defer span.End()
119+
ctx = httptrace.WithClientTrace(ctx, otelhttptrace.NewClientTrace(ctx, otelhttptrace.WithTracerProvider(c.tp)))
107120

108121
httpResp, err := c.client.Do(httpReq.WithContext(ctx))
109122
if err != nil {

pkg/debuginfo/manager.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ type Cache[K comparable, V any] interface {
5656
// Manager is a mechanism for extracting or finding the relevant debug information for the discovered executables.
5757
type Manager struct {
5858
logger log.Logger
59+
tp trace.TracerProvider
5960
tracer trace.Tracer
6061
metrics *metrics
6162

@@ -86,7 +87,7 @@ type Manager struct {
8687
// New creates a new Manager.
8788
func New(
8889
logger log.Logger,
89-
tracer trace.Tracer,
90+
tp trace.TracerProvider,
9091
reg prometheus.Registerer,
9192
objFilePool *objectfile.Pool,
9293
debuginfoClient debuginfopb.DebuginfoServiceClient,
@@ -105,8 +106,10 @@ func New(
105106
5*time.Minute,
106107
)
107108
}
109+
tracer := tp.Tracer("debuginfo")
108110
return &Manager{
109111
logger: logger,
112+
tp: tp,
110113
tracer: tracer,
111114
metrics: newMetrics(reg),
112115
objFilePool: objFilePool,
@@ -522,14 +525,11 @@ func (di *Manager) uploadViaSignedURL(ctx context.Context, url string, r io.Read
522525
ctx, span := di.tracer.Start(ctx, "DebuginfoManager.uploadViaSignedURL")
523526
defer span.End()
524527

525-
// Uses the default tracer provider and propagator that's set in tracer package,
526-
// or from the span context passed in.
527-
ctx = httptrace.WithClientTrace(ctx, otelhttptrace.NewClientTrace(ctx))
528-
529528
// Client is closing the reader if the reader is also closer.
530529
// We need to wrap the reader to avoid this.
531530
// We want to have total control over the reader.
532531
r = bufio.NewReader(r)
532+
ctx = httptrace.WithClientTrace(ctx, otelhttptrace.NewClientTrace(ctx, otelhttptrace.WithTracerProvider(di.tp)))
533533
req, err := http.NewRequestWithContext(ctx, http.MethodPut, url, r)
534534
if err != nil {
535535
return fmt.Errorf("create request: %w", err)

pkg/debuginfo/manager_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func BenchmarkUploadInitiateUploadError(b *testing.B) {
6666
}
6767
debuginfoManager := New(
6868
log.NewNopLogger(),
69-
trace.NewNoopTracerProvider().Tracer("test"),
69+
trace.NewNoopTracerProvider(),
7070
prometheus.NewRegistry(),
7171
objFilePool,
7272
c,
@@ -149,7 +149,7 @@ func TestUpload(t *testing.T) {
149149
// Create a Manager instance.
150150
dim := New(
151151
log.NewNopLogger(),
152-
trace.NewNoopTracerProvider().Tracer("test"),
152+
trace.NewNoopTracerProvider(),
153153
prometheus.NewRegistry(),
154154
objFilePool,
155155
c,
@@ -270,7 +270,7 @@ func TestUploadSingleFlight(t *testing.T) {
270270
// Create a Manager instance.
271271
dim := New(
272272
log.NewNopLogger(),
273-
trace.NewNoopTracerProvider().Tracer("test"),
273+
trace.NewNoopTracerProvider(),
274274
prometheus.NewRegistry(),
275275
objFilePool,
276276
c,

0 commit comments

Comments
 (0)