/
opentrace.go
111 lines (95 loc) · 3.13 KB
/
opentrace.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
package middleware
import (
"context"
"fmt"
"github.com/eviltomorrow/king/lib/opentrace"
grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func UnaryClientOpentraceInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
ctx = extract(ctx, otel.GetTextMapPropagator())
span1 := trace.SpanFromContext(ctx)
id := span1.SpanContext().TraceID().String()
fmt.Println(id)
name, attr := spanInfo(info.FullMethod, peerFromCtx(ctx))
startOpts := []trace.SpanStartOption{
trace.WithSpanKind(trace.SpanKindServer),
trace.WithAttributes(attr...),
}
ctx, span := opentrace.DefaultTracer().Start(
trace.ContextWithRemoteSpanContext(ctx, trace.SpanContextFromContext(ctx)),
name,
startOpts...,
)
defer span.End()
resp, err = handler(ctx, req)
if err != nil {
s, _ := status.FromError(err)
statusCode, msg := serverStatus(s)
span.SetStatus(statusCode, msg)
span.SetAttributes(statusCodeAttr(s.Code()))
} else {
span.SetAttributes(statusCodeAttr(codes.OK))
}
return resp, err
}
// UnaryServerRecoveryInterceptor recover
func UnaryServerOpentraceInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
ctx = extract(ctx, otel.GetTextMapPropagator())
span1 := trace.SpanFromContext(ctx)
id := span1.SpanContext().TraceID().String()
fmt.Println(id)
name, attr := spanInfo(info.FullMethod, peerFromCtx(ctx))
startOpts := []trace.SpanStartOption{
trace.WithSpanKind(trace.SpanKindServer),
trace.WithAttributes(attr...),
}
ctx, span := opentrace.DefaultTracer().Start(
trace.ContextWithRemoteSpanContext(ctx, trace.SpanContextFromContext(ctx)),
name,
startOpts...,
)
defer span.End()
resp, err = handler(ctx, req)
if err != nil {
s, _ := status.FromError(err)
statusCode, msg := serverStatus(s)
span.SetStatus(statusCode, msg)
span.SetAttributes(statusCodeAttr(s.Code()))
} else {
span.SetAttributes(statusCodeAttr(codes.OK))
}
return resp, err
}
// StreamServerRecoveryInterceptor recover
func StreamServerOpentraceInterceptor(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) (err error) {
ctx := extract(stream.Context(), otel.GetTextMapPropagator())
name, attr := spanInfo(info.FullMethod, peerFromCtx(ctx))
startOpts := []trace.SpanStartOption{
trace.WithSpanKind(trace.SpanKindServer),
trace.WithAttributes(attr...),
}
ctx, span := opentrace.DefaultTracer().Start(
trace.ContextWithRemoteSpanContext(ctx, trace.SpanContextFromContext(ctx)),
name,
startOpts...,
)
defer span.End()
err = handler(srv, &grpc_middleware.WrappedServerStream{
ServerStream: stream,
WrappedContext: ctx,
})
if err != nil {
s, _ := status.FromError(err)
statusCode, msg := serverStatus(s)
span.SetStatus(statusCode, msg)
span.SetAttributes(statusCodeAttr(s.Code()))
} else {
span.SetAttributes(statusCodeAttr(codes.OK))
}
return err
}