/
xtracer.go
142 lines (125 loc) · 4.23 KB
/
xtracer.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package xtracer
import (
"context"
"time"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/jaeger"
otlp "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.16.0"
"go.opentelemetry.io/otel/trace"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
// 此处Tracer使用otel的API作为标准来实现
type Tracer = trace.Tracer
// 重要,此接口必须实现
// 依托实现的接口是TracerProvider
// 第三方实现的Tracer必须实现Provider接口
type Provider interface {
trace.TracerProvider
}
// otel/trace 包常量、类型、方法 快捷链接
// otel/trace 常量
const (
FlagsSampled = trace.FlagsSampled
SpanKindUnspecified = trace.SpanKindUnspecified
SpanKindInternal = trace.SpanKindInternal
SpanKindServer = trace.SpanKindServer
SpanKindClient = trace.SpanKindClient
SpanKindProducer = trace.SpanKindProducer
SpanKindConsumer = trace.SpanKindConsumer
)
// otel/trace interface
type Span = trace.Span
type SpanContext = trace.SpanContext
// otel/trace funcs
var ContextWithRemoteSpanContext = trace.ContextWithRemoteSpanContext
var ContextWithSpan = trace.ContextWithSpan
var ContextWithSpanContext = trace.ContextWithSpanContext
var LinkFromContext = trace.LinkFromContext
var WithSpanKind = trace.WithSpanKind
var WithAttributes = trace.WithAttributes
var SpanFromContext = trace.SpanFromContext
var SpanContextFromContext = trace.SpanContextFromContext
// otel包 常量、类型、方法 快捷链接
// otel types
type ErrorHandler = otel.ErrorHandler
type ErrorHandlerFunc = otel.ErrorHandlerFunc
// 注意此函数改名
var GetTracer = otel.Tracer
// otel funcs
var GetTracerProvider = otel.GetTracerProvider
var SetTracerProvider = otel.SetTracerProvider
var GetTextMapPropagator = otel.GetTextMapPropagator
var SetTextMapPropagator = otel.SetTextMapPropagator
var Handle = otel.Handle
var GetErrorHandler = otel.GetErrorHandler
var SetErrorHandler = otel.SetErrorHandler
var SetLogger = otel.SetLogger
var OtelVersion = otel.Version
func New(config *Config) Provider {
var exp sdktrace.SpanExporter
switch config.ExporterName {
case EXPORTER_NAME_JAEGER:
exp = newJaegerExporter(config.ExporterEndpoint)
case EXPORTER_NAME_OLTP:
exp = newOtlpExporter(config.ExporterEndpoint)
default:
exp = newStdoutExporter()
}
return NewProvider(config, exp)
}
func NewProvider(config *Config, exp sdktrace.SpanExporter) Provider {
res := resource.NewSchemaless(
semconv.TelemetrySDKLanguageGo,
semconv.ServiceNameKey.String(config.ServiceName),
)
provider := sdktrace.NewTracerProvider(
// 设置导出exporter
sdktrace.WithBatcher(exp),
// 设置采样器
sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(config.SampleRate))),
sdktrace.WithResource(res),
)
otel.SetTracerProvider(provider)
// 设置全局的propagator
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
return provider
}
func WithTextMapPropagator(propagator propagation.TextMapPropagator) {
otel.SetTextMapPropagator(propagator)
}
func newStdoutExporter() sdktrace.SpanExporter {
exp, err := stdouttrace.New()
if err != nil {
// xlog.Errorf("failed to initialize stdout trace exporter %v", err)
}
return exp
}
func newJaegerExporter(url string) sdktrace.SpanExporter {
exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))
if err != nil {
// xlog.Errorf("failed to initialize jaeger trace exporter %v", err)
}
return exp
}
func newOtlpExporter(url string) sdktrace.SpanExporter {
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
conn, err := grpc.DialContext(ctx, url,
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithBlock(),
)
if err != nil {
// xlog.Errorf("failed to create gRPC connection to collector: %v", err)
}
exp, err := otlp.New(ctx, otlp.WithGRPCConn(conn))
if err != nil {
// xlog.Errorf("failed to create the collector exporter: %v", err)
}
return exp
}