...
1
18
19 package grpc
20
21 import (
22 "bytes"
23 "fmt"
24 "io"
25 "net"
26 "strings"
27 "sync"
28 "time"
29 )
30
31
32
33 var EnableTracing bool
34
35
36
37 func methodFamily(m string) string {
38 m = strings.TrimPrefix(m, "/")
39 if i := strings.Index(m, "/"); i >= 0 {
40 m = m[:i]
41 }
42 return m
43 }
44
45
46
47
48 type traceEventLog interface {
49 Printf(format string, a ...any)
50 Errorf(format string, a ...any)
51 Finish()
52 }
53
54
55
56
57 type traceLog interface {
58 LazyLog(x fmt.Stringer, sensitive bool)
59 LazyPrintf(format string, a ...any)
60 SetError()
61 SetRecycler(f func(any))
62 SetTraceInfo(traceID, spanID uint64)
63 SetMaxEvents(m int)
64 Finish()
65 }
66
67
68 type traceInfo struct {
69 tr traceLog
70 firstLine firstLine
71 }
72
73
74
75
76 type firstLine struct {
77 mu sync.Mutex
78 client bool
79 remoteAddr net.Addr
80 deadline time.Duration
81 }
82
83 func (f *firstLine) SetRemoteAddr(addr net.Addr) {
84 f.mu.Lock()
85 f.remoteAddr = addr
86 f.mu.Unlock()
87 }
88
89 func (f *firstLine) String() string {
90 f.mu.Lock()
91 defer f.mu.Unlock()
92
93 var line bytes.Buffer
94 io.WriteString(&line, "RPC: ")
95 if f.client {
96 io.WriteString(&line, "to")
97 } else {
98 io.WriteString(&line, "from")
99 }
100 fmt.Fprintf(&line, " %v deadline:", f.remoteAddr)
101 if f.deadline != 0 {
102 fmt.Fprint(&line, f.deadline)
103 } else {
104 io.WriteString(&line, "none")
105 }
106 return line.String()
107 }
108
109 const truncateSize = 100
110
111 func truncate(x string, l int) string {
112 if l > len(x) {
113 return x
114 }
115 return x[:l]
116 }
117
118
119 type payload struct {
120 sent bool
121 msg any
122
123 }
124
125 func (p payload) String() string {
126 if p.sent {
127 return truncate(fmt.Sprintf("sent: %v", p.msg), truncateSize)
128 }
129 return truncate(fmt.Sprintf("recv: %v", p.msg), truncateSize)
130 }
131
132 type fmtStringer struct {
133 format string
134 a []any
135 }
136
137 func (f *fmtStringer) String() string {
138 return fmt.Sprintf(f.format, f.a...)
139 }
140
141 type stringer string
142
143 func (s stringer) String() string { return string(s) }
144
View as plain text