/
tracer.go
95 lines (77 loc) · 2.61 KB
/
tracer.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package telemetry
import (
"context"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
otelresource "go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
"go.opentelemetry.io/otel/trace"
"github.com/foomo/keel/env"
)
func Tracer() trace.Tracer {
return TraceProvider().Tracer(TracerName)
}
func TraceProvider() trace.TracerProvider {
return otel.GetTracerProvider()
}
func NewNoopTraceProvider() (trace.TracerProvider, error) {
tracerProvider := trace.NewNoopTracerProvider()
otel.SetTracerProvider(tracerProvider)
return tracerProvider, nil
}
func NewStdOutTraceProvider(ctx context.Context) (trace.TracerProvider, error) {
var exportOpts []stdouttrace.Option
if env.GetBool("OTEL_EXPORTER_STDOUT_PRETTY_PRINT", true) {
exportOpts = append(exportOpts, stdouttrace.WithPrettyPrint())
}
exporter, err := stdouttrace.New(exportOpts...)
if err != nil {
return nil, err
}
return newTracerProvider(exporter)
}
func NewOTLPHTTPTraceProvider(ctx context.Context, opts ...otlptracehttp.Option) (trace.TracerProvider, error) {
if env.GetBool("OTEL_EXPORTER_OTLP_INSECURE", false) {
opts = append(opts, otlptracehttp.WithInsecure())
}
if value := env.Get("OTEL_EXPORTER_OTLP_ENDPOINT", ""); value != "" {
opts = append(opts, otlptracehttp.WithEndpoint(value))
}
exporter, err := otlptracehttp.New(ctx, opts...)
if err != nil {
return nil, err
}
return newTracerProvider(exporter)
}
func NewOTLPGRPCTraceProvider(ctx context.Context, opts ...otlptracegrpc.Option) (trace.TracerProvider, error) {
if env.GetBool("OTEL_EXPORTER_OTLP_INSECURE", false) {
opts = append(opts, otlptracegrpc.WithInsecure())
}
if value := env.Get("OTEL_EXPORTER_OTLP_ENDPOINT", ""); value != "" {
opts = append(opts, otlptracegrpc.WithEndpoint(value))
}
exporter, err := otlptracegrpc.New(ctx, opts...)
if err != nil {
return nil, err
}
return newTracerProvider(exporter)
}
func newTracerProvider(e sdktrace.SpanExporter) (trace.TracerProvider, error) {
resource := otelresource.NewSchemaless(
semconv.ServiceNameKey.String(env.Get("OTEL_SERVICE_NAME", ServiceName)),
)
tracerProvider := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(e),
sdktrace.WithResource(resource),
sdktrace.WithSampler(
sdktrace.ParentBased(
sdktrace.TraceIDRatioBased(env.GetFloat64("OTEL_TRACE_RATIO", 1)),
),
),
)
otel.SetTracerProvider(tracerProvider)
return tracerProvider, nil
}