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