From 5f17eea09cb014b9044fe45cca9109535788bae5 Mon Sep 17 00:00:00 2001 From: sashass1315 Date: Tue, 3 Feb 2026 14:46:19 +0200 Subject: [PATCH 1/4] Update server.go --- rpc/server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/rpc/server.go b/rpc/server.go index 94d4a3e13e..6f6c44ebf5 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -126,6 +126,7 @@ func (s *Server) ServeCodec(codec ServerCodec, options CodecOption) { idgen: s.idgen, batchItemLimit: s.batchItemLimit, batchResponseLimit: s.batchResponseLimit, + tracerProvider: s.tracerProvider, } c := initClient(codec, &s.services, cfg) <-codec.closed() From 111b97bbb2fdf65b874f0afc81d9029575ff58a8 Mon Sep 17 00:00:00 2001 From: sashass1315 Date: Tue, 3 Feb 2026 14:46:30 +0200 Subject: [PATCH 2/4] Update tracing_test.go --- rpc/tracing_test.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/rpc/tracing_test.go b/rpc/tracing_test.go index f32a647e6f..e77d7d89c7 100644 --- a/rpc/tracing_test.go +++ b/rpc/tracing_test.go @@ -19,6 +19,7 @@ package rpc import ( "context" "net/http/httptest" + "strings" "testing" "go.opentelemetry.io/otel" @@ -196,8 +197,8 @@ func TestTracingBatchHTTP(t *testing.T) { } // TestTracingSubscribeUnsubscribe verifies that subscribe and unsubscribe calls -// do not emit any spans. -// Note: This works because client.newClientConn() passes nil as the tracer provider. +// do not emit RPC server spans (like "jsonrpc.service/method"). +// Note: handleSubscribe does not create the main RPC span, only internal encoding spans. func TestTracingSubscribeUnsubscribe(t *testing.T) { t.Parallel() server, tracer, exporter := newTracingServer(t) @@ -213,12 +214,16 @@ func TestTracingSubscribeUnsubscribe(t *testing.T) { // Unsubscribe. sub.Unsubscribe() - // Flush and check that no spans were emitted. + // Flush and check that no RPC server spans were emitted. + // Internal spans like "rpc.encodeJSONResponse" are allowed. if err := tracer.ForceFlush(context.Background()); err != nil { t.Fatalf("failed to flush: %v", err) } spans := exporter.GetSpans() - if len(spans) != 0 { - t.Errorf("expected no spans for subscribe/unsubscribe, got %d", len(spans)) + for _, span := range spans { + // RPC server spans have names like "jsonrpc.service/method" + if strings.HasPrefix(span.Name, "jsonrpc.") { + t.Errorf("unexpected RPC server span for subscribe/unsubscribe: %s", span.Name) + } } } From 224692eac6ecd78f557bedef5f3255370353fd75 Mon Sep 17 00:00:00 2001 From: sashass1315 Date: Tue, 3 Feb 2026 14:46:43 +0200 Subject: [PATCH 3/4] Update client.go --- rpc/client.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rpc/client.go b/rpc/client.go index 8d81503d59..89cc8235a2 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -29,6 +29,7 @@ import ( "time" "github.com/ethereum/go-ethereum/log" + "go.opentelemetry.io/otel/trace" ) var ( @@ -88,6 +89,7 @@ type Client struct { // config fields batchItemLimit int batchResponseMaxSize int + tracerProvider trace.TracerProvider // writeConn is used for writing to the connection on the caller's goroutine. It should // only be accessed outside of dispatch, with the write lock held. The write lock is @@ -119,7 +121,7 @@ func (c *Client) newClientConn(conn ServerCodec) *clientConn { ctx := context.Background() ctx = context.WithValue(ctx, clientContextKey{}, c) ctx = context.WithValue(ctx, peerInfoContextKey{}, conn.peerInfo()) - handler := newHandler(ctx, conn, c.idgen, c.services, c.batchItemLimit, c.batchResponseMaxSize, nil) + handler := newHandler(ctx, conn, c.idgen, c.services, c.batchItemLimit, c.batchResponseMaxSize, c.tracerProvider) return &clientConn{conn, handler} } @@ -247,6 +249,7 @@ func initClient(conn ServerCodec, services *serviceRegistry, cfg *clientConfig) idgen: cfg.idgen, batchItemLimit: cfg.batchItemLimit, batchResponseMaxSize: cfg.batchResponseLimit, + tracerProvider: cfg.tracerProvider, writeConn: conn, close: make(chan struct{}), closing: make(chan struct{}), From 348e88cb4aeabfa65050997f3cc32b64bc06b313 Mon Sep 17 00:00:00 2001 From: sashass1315 Date: Tue, 3 Feb 2026 14:46:55 +0200 Subject: [PATCH 4/4] Update client_opt.go --- rpc/client_opt.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rpc/client_opt.go b/rpc/client_opt.go index 3fa045a9b9..49cdb54c8a 100644 --- a/rpc/client_opt.go +++ b/rpc/client_opt.go @@ -20,6 +20,7 @@ import ( "net/http" "github.com/gorilla/websocket" + "go.opentelemetry.io/otel/trace" ) // ClientOption is a configuration option for the RPC client. @@ -41,6 +42,7 @@ type clientConfig struct { idgen func() ID batchItemLimit int batchResponseLimit int + tracerProvider trace.TracerProvider } func (cfg *clientConfig) initHeaders() {