github.com/MetalBlockchain/metalgo@v1.11.9/trace/tracer.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package trace 5 6 import ( 7 "context" 8 "io" 9 "time" 10 11 "go.opentelemetry.io/otel/attribute" 12 "go.opentelemetry.io/otel/sdk/resource" 13 "go.opentelemetry.io/otel/trace" 14 15 sdktrace "go.opentelemetry.io/otel/sdk/trace" 16 semconv "go.opentelemetry.io/otel/semconv/v1.4.0" 17 ) 18 19 const ( 20 tracerExportTimeout = 10 * time.Second 21 // [tracerProviderShutdownTimeout] is longer than [tracerExportTimeout] so 22 // in-flight exports can finish before the tracer provider shuts down. 23 tracerProviderShutdownTimeout = 15 * time.Second 24 ) 25 26 type Config struct { 27 ExporterConfig `json:"exporterConfig"` 28 29 // Used to flag if tracing should be performed 30 Enabled bool `json:"enabled"` 31 32 // The fraction of traces to sample. 33 // If >= 1 always samples. 34 // If <= 0 never samples. 35 TraceSampleRate float64 `json:"traceSampleRate"` 36 37 AppName string `json:"appName"` 38 Version string `json:"version"` 39 } 40 41 type Tracer interface { 42 trace.Tracer 43 io.Closer 44 } 45 46 type tracer struct { 47 trace.Tracer 48 49 tp *sdktrace.TracerProvider 50 } 51 52 func (t *tracer) Close() error { 53 ctx, cancel := context.WithTimeout(context.Background(), tracerProviderShutdownTimeout) 54 defer cancel() 55 return t.tp.Shutdown(ctx) 56 } 57 58 func New(config Config) (Tracer, error) { 59 if !config.Enabled { 60 return Noop, nil 61 } 62 63 exporter, err := newExporter(config.ExporterConfig) 64 if err != nil { 65 return nil, err 66 } 67 68 tracerProviderOpts := []sdktrace.TracerProviderOption{ 69 sdktrace.WithBatcher(exporter, sdktrace.WithExportTimeout(tracerExportTimeout)), 70 sdktrace.WithResource(resource.NewWithAttributes(semconv.SchemaURL, 71 attribute.String("version", config.Version), 72 semconv.ServiceNameKey.String(config.AppName), 73 )), 74 sdktrace.WithSampler(sdktrace.TraceIDRatioBased(config.TraceSampleRate)), 75 } 76 77 tracerProvider := sdktrace.NewTracerProvider(tracerProviderOpts...) 78 return &tracer{ 79 Tracer: tracerProvider.Tracer(config.AppName), 80 tp: tracerProvider, 81 }, nil 82 }