github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/infrastructure/open_telemetry/open_telemetry.go (about)

     1  package open_telemetry
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  
     9  	gcptrace "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace"
    10  	"go.opentelemetry.io/otel/attribute"
    11  	"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
    12  	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
    13  	"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
    14  	"go.opentelemetry.io/otel/sdk/resource"
    15  	"go.opentelemetry.io/otel/sdk/trace"
    16  	semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
    17  
    18  	"github.com/oinume/lekcije/backend/domain/config"
    19  )
    20  
    21  type nopSpanExporter struct{}
    22  
    23  func (e *nopSpanExporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) error {
    24  	return nil
    25  }
    26  
    27  func (e *nopSpanExporter) Shutdown(ctx context.Context) error {
    28  	return nil
    29  }
    30  
    31  func NewTracerProvider(serviceName string, cfg *config.Vars) (*trace.TracerProvider, error) {
    32  	var exporter trace.SpanExporter
    33  	var err error
    34  	switch cfg.Exporter {
    35  	case "cloud_trace":
    36  		exporter, err = gcptrace.New(gcptrace.WithProjectID(cfg.GCPProjectID))
    37  		if err != nil {
    38  			return nil, err
    39  		}
    40  	case "jaeger":
    41  		client := otlptracehttp.NewClient()
    42  		exporter, err = otlptrace.New(context.Background(), client)
    43  		if err != nil {
    44  			return nil, fmt.Errorf("failed to create OTLP trace exporter: %w", err)
    45  		}
    46  	case "stdout":
    47  		exporter, err = NewStdoutExporter(os.Stdout)
    48  		if err != nil {
    49  			return nil, err
    50  		}
    51  	}
    52  
    53  	if !cfg.Enable {
    54  		exporter = &nopSpanExporter{}
    55  	}
    56  
    57  	r := NewResource(serviceName, config.DefaultVars.VersionHash, config.DefaultVars.ServiceEnv)
    58  	return trace.NewTracerProvider(
    59  		trace.WithBatcher(exporter),
    60  		trace.WithResource(r),
    61  		trace.WithSampler(trace.TraceIDRatioBased(cfg.Trace.SamplingRate)),
    62  	), nil
    63  }
    64  
    65  func NewStdoutExporter(w io.Writer) (trace.SpanExporter, error) {
    66  	return stdouttrace.New(
    67  		stdouttrace.WithWriter(w),
    68  		// Use human-readable output.
    69  		stdouttrace.WithPrettyPrint(),
    70  		// Do not print timestamps for the demo.
    71  		stdouttrace.WithoutTimestamps(),
    72  	)
    73  }
    74  
    75  func NewResource(serviceName string, version string, environment string) *resource.Resource {
    76  	r, _ := resource.Merge(
    77  		resource.Default(),
    78  		resource.NewWithAttributes(
    79  			semconv.SchemaURL,
    80  			semconv.ServiceNameKey.String(serviceName),
    81  			semconv.ServiceVersionKey.String(version),
    82  			attribute.String("environment", environment),
    83  		),
    84  	)
    85  	return r
    86  }