@@ -2,8 +2,6 @@ package collector
2
2
3
3
import (
4
4
"context"
5
- "fmt"
6
- "log"
7
5
"sync"
8
6
"time"
9
7
@@ -15,8 +13,6 @@ import (
15
13
pb "go.opentelemetry.io/proto/otlp/collector/trace/v1"
16
14
v1 "go.opentelemetry.io/proto/otlp/trace/v1"
17
15
"go.uber.org/zap"
18
- "google.golang.org/grpc"
19
- "google.golang.org/grpc/credentials/insecure"
20
16
)
21
17
22
18
type stoppable interface {
@@ -37,23 +33,13 @@ func newForwardIngester(ctx context.Context, batchTimeout time.Duration, cfg rem
37
33
ingester := & forwardIngester {
38
34
BatchTimeout : batchTimeout ,
39
35
RemoteIngester : cfg ,
40
- buffer : & buffer {},
41
36
traceIDs : make (map [string ]bool , 0 ),
42
37
done : make (chan bool ),
43
38
traceCache : cfg .traceCache ,
44
39
logger : cfg .logger ,
45
40
sensor : cfg .sensor ,
46
41
}
47
42
48
- if startRemoteServer {
49
- err := ingester .connectToRemoteServer (ctx )
50
- if err != nil {
51
- return nil , fmt .Errorf ("could not connect to remote server: %w" , err )
52
- }
53
-
54
- go ingester .startBatchWorker ()
55
- }
56
-
57
43
return ingester , nil
58
44
}
59
45
@@ -67,8 +53,7 @@ type Statistics struct {
67
53
type forwardIngester struct {
68
54
BatchTimeout time.Duration
69
55
RemoteIngester remoteIngesterConfig
70
- client pb.TraceServiceClient
71
- buffer * buffer
56
+ mutex sync.Mutex
72
57
traceIDs map [string ]bool
73
58
done chan bool
74
59
traceCache TraceCache
@@ -90,11 +75,6 @@ type remoteIngesterConfig struct {
90
75
sensor sensors.Sensor
91
76
}
92
77
93
- type buffer struct {
94
- mutex sync.Mutex
95
- spans []* v1.ResourceSpans
96
- }
97
-
98
78
func (i * forwardIngester ) Statistics () Statistics {
99
79
return i .statistics
100
80
}
@@ -108,16 +88,26 @@ func (i *forwardIngester) SetSensor(sensor sensors.Sensor) {
108
88
}
109
89
110
90
func (i * forwardIngester ) Ingest (ctx context.Context , request * pb.ExportTraceServiceRequest , requestType otlp.RequestType ) (* pb.ExportTraceServiceResponse , error ) {
91
+ go i .ingestSpans (request )
92
+
93
+ return & pb.ExportTraceServiceResponse {
94
+ PartialSuccess : & pb.ExportTracePartialSuccess {
95
+ RejectedSpans : 0 ,
96
+ },
97
+ }, nil
98
+ }
99
+
100
+ func (i * forwardIngester ) ingestSpans (request * pb.ExportTraceServiceRequest ) {
111
101
spanCount := countSpans (request )
112
- i .buffer . mutex .Lock ()
102
+ i .mutex .Lock ()
113
103
114
- i .buffer .spans = append (i .buffer .spans , request .ResourceSpans ... )
115
104
i .statistics .SpanCount += int64 (spanCount )
116
105
i .statistics .LastSpanTimestamp = time .Now ()
106
+ realSpanCount := i .statistics .SpanCount
117
107
118
- i .sensor . Emit ( events . SpanCountUpdated , i . statistics . SpanCount )
108
+ i .mutex . Unlock ( )
119
109
120
- i .buffer . mutex . Unlock ( )
110
+ i .sensor . Emit ( events . SpanCountUpdated , realSpanCount )
121
111
i .logger .Debug ("received spans" , zap .Int ("count" , spanCount ))
122
112
123
113
if i .traceCache != nil {
@@ -127,12 +117,6 @@ func (i *forwardIngester) Ingest(ctx context.Context, request *pb.ExportTraceSer
127
117
i .cacheTestSpans (request .ResourceSpans )
128
118
i .sensor .Emit (events .TraceCountUpdated , len (i .traceIDs ))
129
119
}
130
-
131
- return & pb.ExportTraceServiceResponse {
132
- PartialSuccess : & pb.ExportTracePartialSuccess {
133
- RejectedSpans : 0 ,
134
- },
135
- }, nil
136
120
}
137
121
138
122
func countSpans (request * pb.ExportTraceServiceRequest ) int {
@@ -146,71 +130,6 @@ func countSpans(request *pb.ExportTraceServiceRequest) int {
146
130
return count
147
131
}
148
132
149
- func (i * forwardIngester ) connectToRemoteServer (ctx context.Context ) error {
150
- conn , err := grpc .DialContext (ctx , i .RemoteIngester .URL , grpc .WithTransportCredentials (insecure .NewCredentials ()))
151
- if err != nil {
152
- i .logger .Error ("could not connect to remote server" , zap .Error (err ))
153
- return fmt .Errorf ("could not connect to remote server: %w" , err )
154
- }
155
-
156
- i .client = pb .NewTraceServiceClient (conn )
157
- return nil
158
- }
159
-
160
- func (i * forwardIngester ) startBatchWorker () {
161
- i .logger .Debug ("starting batch worker" , zap .Duration ("batch_timeout" , i .BatchTimeout ))
162
- ticker := time .NewTicker (i .BatchTimeout )
163
- done := make (chan bool )
164
- for {
165
- select {
166
- case <- done :
167
- i .logger .Debug ("stopping batch worker" )
168
- return
169
- case <- ticker .C :
170
- i .logger .Debug ("executing batch" )
171
- err := i .executeBatch (context .Background ())
172
- if err != nil {
173
- i .logger .Error ("could not execute batch" , zap .Error (err ))
174
- log .Println (err )
175
- }
176
- }
177
- }
178
- }
179
-
180
- func (i * forwardIngester ) executeBatch (ctx context.Context ) error {
181
- i .buffer .mutex .Lock ()
182
- newSpans := i .buffer .spans
183
- i .buffer .spans = []* v1.ResourceSpans {}
184
- i .buffer .mutex .Unlock ()
185
-
186
- if len (newSpans ) == 0 {
187
- i .logger .Debug ("no spans to forward" )
188
- return nil
189
- }
190
-
191
- err := i .forwardSpans (ctx , newSpans )
192
- if err != nil {
193
- i .logger .Error ("could not forward spans" , zap .Error (err ))
194
- return err
195
- }
196
-
197
- i .logger .Debug ("successfully forwarded spans" , zap .Int ("count" , len (newSpans )))
198
- return nil
199
- }
200
-
201
- func (i * forwardIngester ) forwardSpans (ctx context.Context , spans []* v1.ResourceSpans ) error {
202
- _ , err := i .client .Export (ctx , & pb.ExportTraceServiceRequest {
203
- ResourceSpans : spans ,
204
- })
205
-
206
- if err != nil {
207
- i .logger .Error ("could not forward spans to remote server" , zap .Error (err ))
208
- return fmt .Errorf ("could not forward spans to remote server: %w" , err )
209
- }
210
-
211
- return nil
212
- }
213
-
214
133
func (i * forwardIngester ) cacheTestSpans (resourceSpans []* v1.ResourceSpans ) {
215
134
i .logger .Debug ("caching test spans" )
216
135
spans := make (map [string ][]* v1.Span )
0 commit comments