@@ -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.
3942type Service struct {
43+ endpoint string
44+ exporter * otlptrace.Exporter
4045 provider * sdktrace.TracerProvider
4146}
4247
4348// Start implements node.Lifecycle.
4449func (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.
4961func (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