master
go 67 lines 2.07 KB
Raw
1 package tracing
2
3 import (
4 "context"
5 "fmt"
6
7 "github.com/ipfs/boxo/tracing"
8 version "github.com/ipfs/kubo"
9 "go.opentelemetry.io/otel"
10 "go.opentelemetry.io/otel/sdk/resource"
11 "go.opentelemetry.io/otel/sdk/trace"
12 semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
13 traceapi "go.opentelemetry.io/otel/trace"
14 "go.opentelemetry.io/otel/trace/noop"
15 )
16
17 // shutdownTracerProvider adds a shutdown method for tracer providers.
18 //
19 // Note that this doesn't directly use the provided TracerProvider interface
20 // to avoid build breaking go-ipfs if new methods are added to it.
21 type shutdownTracerProvider interface {
22 traceapi.TracerProvider
23
24 Tracer(instrumentationName string, opts ...traceapi.TracerOption) traceapi.Tracer
25 Shutdown(ctx context.Context) error
26 }
27
28 // noopShutdownTracerProvider adds a no-op Shutdown method to a TracerProvider.
29 type noopShutdownTracerProvider struct{ traceapi.TracerProvider }
30
31 func (n *noopShutdownTracerProvider) Shutdown(ctx context.Context) error { return nil }
32
33 // NewTracerProvider creates and configures a TracerProvider.
34 func NewTracerProvider(ctx context.Context) (shutdownTracerProvider, error) {
35 exporters, err := tracing.NewSpanExporters(ctx)
36 if err != nil {
37 return nil, err
38 }
39 if len(exporters) == 0 {
40 return &noopShutdownTracerProvider{TracerProvider: noop.NewTracerProvider()}, nil
41 }
42
43 options := []trace.TracerProviderOption{}
44
45 for _, exporter := range exporters {
46 options = append(options, trace.WithBatcher(exporter))
47 }
48
49 r, err := resource.Merge(
50 resource.Default(),
51 resource.NewSchemaless(
52 semconv.ServiceNameKey.String("Kubo"),
53 semconv.ServiceVersionKey.String(version.CurrentVersionNumber),
54 ),
55 )
56 if err != nil {
57 return nil, err
58 }
59 options = append(options, trace.WithResource(r))
60
61 return trace.NewTracerProvider(options...), nil
62 }
63
64 // Span starts a new span using the standard IPFS tracing conventions.
65 func Span(ctx context.Context, componentName string, spanName string, opts ...traceapi.SpanStartOption) (context.Context, traceapi.Span) {
66 return otel.Tracer("Kubo").Start(ctx, fmt.Sprintf("%s.%s", componentName, spanName), opts...)
67 }