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 }