forked from uptrace/opentelemetry-go-extra
/
otelplay.go
86 lines (73 loc) · 2.2 KB
/
otelplay.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
package otelplay
import (
"context"
"fmt"
"os"
"github.com/middleware-labs/uptrace-go/uptrace"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/trace"
)
func PrintTraceID(ctx context.Context) {
fmt.Println("trace:", TraceURL(trace.SpanFromContext(ctx)))
}
func TraceURL(span trace.Span) string {
switch {
case os.Getenv("UPTRACE_DSN") != "":
return uptrace.TraceURL(span)
case os.Getenv("OTEL_EXPORTER_JAEGER_ENDPOINT") != "":
return fmt.Sprintf("http://localhost:16686/trace/%s", span.SpanContext().TraceID())
default:
return fmt.Sprintf("http://localhost:16686/trace/%s", span.SpanContext().TraceID())
}
}
// ConfigureOpentelemetry configures Opentelemetry to export spans to Uptrace, Jaeger,
// or console depending on environment variables.
//
// You can use it to run examples, but don't use it in your applications. Instead, use
// uptrace-go or opentelemetry-go directly. See https://uptrace.dev/get/opentelemetry-go.html
func ConfigureOpentelemetry(ctx context.Context) func() {
switch {
case os.Getenv("UPTRACE_DSN") != "":
uptrace.ConfigureOpentelemetry(uptrace.WithServiceName("myservicename"))
return func() {
_ = uptrace.Shutdown(ctx)
}
case os.Getenv("OTEL_EXPORTER_JAEGER_ENDPOINT") != "":
return configureJaeger(ctx)
default:
return configureStdout(ctx)
}
}
func configureJaeger(ctx context.Context) func() {
provider := sdktrace.NewTracerProvider()
otel.SetTracerProvider(provider)
exp, err := jaeger.New(jaeger.WithCollectorEndpoint())
if err != nil {
panic(err)
}
bsp := sdktrace.NewBatchSpanProcessor(exp)
provider.RegisterSpanProcessor(bsp)
return func() {
if err := provider.Shutdown(ctx); err != nil {
panic(err)
}
}
}
func configureStdout(ctx context.Context) func() {
provider := sdktrace.NewTracerProvider()
otel.SetTracerProvider(provider)
exp, err := stdouttrace.New(stdouttrace.WithPrettyPrint())
if err != nil {
panic(err)
}
bsp := sdktrace.NewBatchSpanProcessor(exp)
provider.RegisterSpanProcessor(bsp)
return func() {
if err := provider.Shutdown(ctx); err != nil {
panic(err)
}
}
}