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  }