Skip to content

Commit 77b1eac

Browse files
committed
internal/telemetry/tracesetup: start exporter with node
1 parent 3fea293 commit 77b1eac

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

cmd/geth/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ func makeFullNode(ctx *cli.Context) *node.Node {
244244
utils.SetupMetrics(&cfg.Metrics)
245245

246246
// Setup OpenTelemetry reporting if enabled.
247-
if err := tracesetup.StartTelemetry(ctx.Context, cfg.Node.OpenTelemetry, stack); err != nil {
247+
if err := tracesetup.SetupTelemetry(cfg.Node.OpenTelemetry, stack); err != nil {
248248
utils.Fatalf("failed to setup OpenTelemetry: %v", err)
249249
}
250250

internal/telemetry/tracesetup/setup.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,38 @@ import (
2828
"github.com/ethereum/go-ethereum/node"
2929
"go.opentelemetry.io/otel"
3030
"go.opentelemetry.io/otel/attribute"
31+
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
3132
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
3233
"go.opentelemetry.io/otel/propagation"
3334
"go.opentelemetry.io/otel/sdk/resource"
3435
sdktrace "go.opentelemetry.io/otel/sdk/trace"
3536
semconv "go.opentelemetry.io/otel/semconv/v1.38.0"
3637
)
3738

39+
const startStopTimeout = 10 * time.Second
40+
3841
// Service wraps the provider to implement node.Lifecycle.
3942
type Service struct {
43+
endpoint string
44+
exporter *otlptrace.Exporter
4045
provider *sdktrace.TracerProvider
4146
}
4247

4348
// Start implements node.Lifecycle.
4449
func (t *Service) Start() error {
45-
return nil // provider is already started during setup
50+
ctx, cancel := context.WithTimeout(context.Background(), startStopTimeout)
51+
defer cancel()
52+
if err := t.exporter.Start(ctx); err != nil {
53+
log.Info("OpenTelemetry exporter didn't start", "endpoint", t.endpoint, "err", err)
54+
return err
55+
}
56+
log.Info("OpenTelemetry trace export enabled", "endpoint", t.endpoint)
57+
return nil
4658
}
4759

4860
// Stop implements node.Lifecycle.
4961
func (t *Service) Stop() error {
50-
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
62+
ctx, cancel := context.WithTimeout(context.Background(), startStopTimeout)
5163
defer cancel()
5264
if err := t.provider.Shutdown(ctx); err != nil {
5365
log.Error("Failed to stop OpenTelemetry service", "err", err)
@@ -57,22 +69,20 @@ func (t *Service) Stop() error {
5769
return nil
5870
}
5971

60-
// StartTelemetry initializes telemetry with the given parameters.
61-
func StartTelemetry(ctx context.Context, cfg node.OpenTelemetryConfig, stack *node.Node) error {
72+
// SetupTelemetry initializes telemetry with the given parameters.
73+
func SetupTelemetry(cfg node.OpenTelemetryConfig, stack *node.Node) error {
6274
if !cfg.Enabled {
6375
return nil
6476
}
65-
6677
if cfg.SampleRatio < 0 || cfg.SampleRatio > 1 {
6778
return fmt.Errorf("invalid sample ratio: %f", cfg.SampleRatio)
6879
}
69-
7080
// Create exporter based on endpoint URL
7181
u, err := url.Parse(cfg.Endpoint)
7282
if err != nil {
7383
return fmt.Errorf("invalid rpc tracing endpoint URL: %w", err)
7484
}
75-
var exporter sdktrace.SpanExporter
85+
var exporter *otlptrace.Exporter
7686
switch u.Scheme {
7787
case "http", "https":
7888
opts := []otlptracehttp.Option{
@@ -89,13 +99,10 @@ func StartTelemetry(ctx context.Context, cfg node.OpenTelemetryConfig, stack *no
8999
"Authorization": "Basic " + base64.StdEncoding.EncodeToString([]byte(cfg.AuthUser+":"+cfg.AuthPassword)),
90100
}))
91101
}
92-
exporter, err = otlptracehttp.New(ctx, opts...)
102+
exporter = otlptracehttp.NewUnstarted(opts...)
93103
default:
94104
return fmt.Errorf("unsupported telemetry url scheme: %s", u.Scheme)
95105
}
96-
if err != nil {
97-
return fmt.Errorf("failed to create telemetry exporter: %w", err)
98-
}
99106

100107
// Define sampler such that if no parent span is available,
101108
// then sampleRatio of traces are sampled; otherwise, inherit
@@ -138,8 +145,7 @@ func StartTelemetry(ctx context.Context, cfg node.OpenTelemetryConfig, stack *no
138145
propagation.TraceContext{},
139146
propagation.Baggage{},
140147
))
141-
service := &Service{provider: tp}
148+
service := &Service{endpoint: cfg.Endpoint, exporter: exporter, provider: tp}
142149
stack.RegisterLifecycle(service)
143-
log.Info("OpenTelemetry tracing enabled", "endpoint", cfg.Endpoint)
144150
return nil
145151
}

0 commit comments

Comments
 (0)