@@ -48,7 +48,10 @@ use tokio::{
48
48
} ;
49
49
use tonic:: {
50
50
async_trait,
51
+ metadata:: { Ascii , MetadataValue } ,
52
+ service:: { interceptor:: InterceptedService , Interceptor } ,
51
53
transport:: { self , Channel , Endpoint } ,
54
+ Request , Status ,
52
55
} ;
53
56
54
57
/// Special purpose, used for user-defined production operations. Generally, it
@@ -111,13 +114,31 @@ impl CollectItemConsume for mpsc::UnboundedReceiver<CollectItem> {
111
114
}
112
115
}
113
116
117
+ type DynInterceptHandler = dyn Fn ( Request < ( ) > ) -> Result < Request < ( ) > , Status > + Send + Sync ;
118
+
119
+ #[ derive( Default , Clone ) ]
120
+ struct CustomInterceptor {
121
+ authentication : Option < Arc < String > > ,
122
+ custom_intercept : Option < Arc < DynInterceptHandler > > ,
123
+ }
124
+
125
+ impl Interceptor for CustomInterceptor {
126
+ fn call ( & mut self , mut request : tonic:: Request < ( ) > ) -> Result < tonic:: Request < ( ) > , Status > {
127
+ if let Some ( authentication) = & self . authentication {
128
+ if let Ok ( authentication) = authentication. parse :: < MetadataValue < Ascii > > ( ) {
129
+ request
130
+ . metadata_mut ( )
131
+ . insert ( "authentication" , authentication) ;
132
+ }
133
+ }
134
+ if let Some ( custom_intercept) = & self . custom_intercept {
135
+ request = custom_intercept ( request) ?;
136
+ }
137
+ Ok ( request)
138
+ }
139
+ }
140
+
114
141
struct Inner < P , C > {
115
- trace_client : Mutex < TraceSegmentReportServiceClient < Channel > > ,
116
- log_client : Mutex < LogReportServiceClient < Channel > > ,
117
- meter_client : Mutex < MeterReportServiceClient < Channel > > ,
118
- #[ cfg( feature = "management" ) ]
119
- #[ cfg_attr( docsrs, doc( cfg( feature = "management" ) ) ) ]
120
- management_client : Mutex < ManagementServiceClient < Channel > > ,
121
142
producer : P ,
122
143
consumer : Mutex < Option < C > > ,
123
144
is_reporting : AtomicBool ,
@@ -131,6 +152,8 @@ pub type DynErrHandle = dyn Fn(Box<dyn Error>) + Send + Sync + 'static;
131
152
pub struct GrpcReporter < P , C > {
132
153
inner : Arc < Inner < P , C > > ,
133
154
err_handle : Arc < Option < Box < DynErrHandle > > > ,
155
+ channel : Channel ,
156
+ interceptor : CustomInterceptor ,
134
157
}
135
158
136
159
impl GrpcReporter < mpsc:: UnboundedSender < CollectItem > , mpsc:: UnboundedReceiver < CollectItem > > {
@@ -156,17 +179,14 @@ impl<P: CollectItemProduce, C: CollectItemConsume> GrpcReporter<P, C> {
156
179
pub fn new_with_pc ( channel : Channel , producer : P , consumer : C ) -> Self {
157
180
Self {
158
181
inner : Arc :: new ( Inner {
159
- trace_client : Mutex :: new ( TraceSegmentReportServiceClient :: new ( channel. clone ( ) ) ) ,
160
- log_client : Mutex :: new ( LogReportServiceClient :: new ( channel. clone ( ) ) ) ,
161
- #[ cfg( feature = "management" ) ]
162
- management_client : Mutex :: new ( ManagementServiceClient :: new ( channel. clone ( ) ) ) ,
163
- meter_client : Mutex :: new ( MeterReportServiceClient :: new ( channel) ) ,
164
182
producer,
165
183
consumer : Mutex :: new ( Some ( consumer) ) ,
166
184
is_reporting : Default :: default ( ) ,
167
185
is_closed : Default :: default ( ) ,
168
186
} ) ,
169
187
err_handle : Default :: default ( ) ,
188
+ channel,
189
+ interceptor : Default :: default ( ) ,
170
190
}
171
191
}
172
192
@@ -179,6 +199,22 @@ impl<P: CollectItemProduce, C: CollectItemConsume> GrpcReporter<P, C> {
179
199
self
180
200
}
181
201
202
+ /// Set the authentication header value. By default, the authentication is
203
+ /// not set.
204
+ pub fn with_authentication ( mut self , authentication : impl Into < String > ) -> Self {
205
+ self . interceptor . authentication = Some ( Arc :: new ( authentication. into ( ) ) ) ;
206
+ self
207
+ }
208
+
209
+ /// Set the custom intercept. By default, the custom intercept is not set.
210
+ pub fn with_custom_intercept (
211
+ mut self ,
212
+ custom_intercept : impl Fn ( Request < ( ) > ) -> Result < Request < ( ) > , Status > + Send + Sync + ' static ,
213
+ ) -> Self {
214
+ self . interceptor . custom_intercept = Some ( Arc :: new ( custom_intercept) ) ;
215
+ self
216
+ }
217
+
182
218
/// Start to reporting.
183
219
///
184
220
/// # Panics
@@ -193,9 +229,28 @@ impl<P: CollectItemProduce, C: CollectItemConsume> GrpcReporter<P, C> {
193
229
rb : ReporterAndBuffer {
194
230
inner : Arc :: clone ( & self . inner ) ,
195
231
status_handle : None ,
232
+
196
233
trace_buffer : Default :: default ( ) ,
197
234
log_buffer : Default :: default ( ) ,
198
235
meter_buffer : Default :: default ( ) ,
236
+
237
+ trace_client : TraceSegmentReportServiceClient :: with_interceptor (
238
+ self . channel . clone ( ) ,
239
+ self . interceptor . clone ( ) ,
240
+ ) ,
241
+ log_client : LogReportServiceClient :: with_interceptor (
242
+ self . channel . clone ( ) ,
243
+ self . interceptor . clone ( ) ,
244
+ ) ,
245
+ meter_client : MeterReportServiceClient :: with_interceptor (
246
+ self . channel . clone ( ) ,
247
+ self . interceptor . clone ( ) ,
248
+ ) ,
249
+ #[ cfg( feature = "management" ) ]
250
+ management_client : ManagementServiceClient :: with_interceptor (
251
+ self . channel . clone ( ) ,
252
+ self . interceptor . clone ( ) ,
253
+ ) ,
199
254
} ,
200
255
shutdown_signal : Box :: pin ( pending ( ) ) ,
201
256
consumer : self . inner . consumer . lock ( ) . await . take ( ) . unwrap ( ) ,
@@ -208,6 +263,8 @@ impl<P, C> Clone for GrpcReporter<P, C> {
208
263
Self {
209
264
inner : self . inner . clone ( ) ,
210
265
err_handle : self . err_handle . clone ( ) ,
266
+ channel : self . channel . clone ( ) ,
267
+ interceptor : self . interceptor . clone ( ) ,
211
268
}
212
269
}
213
270
}
@@ -227,9 +284,17 @@ impl<P: CollectItemProduce, C: CollectItemConsume> Report for GrpcReporter<P, C>
227
284
struct ReporterAndBuffer < P , C > {
228
285
inner : Arc < Inner < P , C > > ,
229
286
status_handle : Option < Box < dyn Fn ( tonic:: Status ) + Send + ' static > > ,
287
+
230
288
trace_buffer : LinkedList < SegmentObject > ,
231
289
log_buffer : LinkedList < LogData > ,
232
290
meter_buffer : LinkedList < MeterData > ,
291
+
292
+ trace_client : TraceSegmentReportServiceClient < InterceptedService < Channel , CustomInterceptor > > ,
293
+ log_client : LogReportServiceClient < InterceptedService < Channel , CustomInterceptor > > ,
294
+ meter_client : MeterReportServiceClient < InterceptedService < Channel , CustomInterceptor > > ,
295
+ #[ cfg( feature = "management" ) ]
296
+ #[ cfg_attr( docsrs, doc( cfg( feature = "management" ) ) ) ]
297
+ management_client : ManagementServiceClient < InterceptedService < Channel , CustomInterceptor > > ,
233
298
}
234
299
235
300
impl < P : CollectItemProduce , C : CollectItemConsume > ReporterAndBuffer < P , C > {
@@ -248,10 +313,7 @@ impl<P: CollectItemProduce, C: CollectItemConsume> ReporterAndBuffer<P, C> {
248
313
#[ cfg( feature = "management" ) ]
249
314
CollectItem :: Instance ( item) => {
250
315
if let Err ( e) = self
251
- . inner
252
316
. management_client
253
- . lock ( )
254
- . await
255
317
. report_instance_properties ( * item)
256
318
. await
257
319
{
@@ -262,14 +324,7 @@ impl<P: CollectItemProduce, C: CollectItemConsume> ReporterAndBuffer<P, C> {
262
324
}
263
325
#[ cfg( feature = "management" ) ]
264
326
CollectItem :: Ping ( item) => {
265
- if let Err ( e) = self
266
- . inner
267
- . management_client
268
- . lock ( )
269
- . await
270
- . keep_alive ( * item)
271
- . await
272
- {
327
+ if let Err ( e) = self . management_client . keep_alive ( * item) . await {
273
328
if let Some ( status_handle) = & self . status_handle {
274
329
status_handle ( e) ;
275
330
}
@@ -279,29 +334,15 @@ impl<P: CollectItemProduce, C: CollectItemConsume> ReporterAndBuffer<P, C> {
279
334
280
335
if !self . trace_buffer . is_empty ( ) {
281
336
let buffer = take ( & mut self . trace_buffer ) ;
282
- if let Err ( e) = self
283
- . inner
284
- . trace_client
285
- . lock ( )
286
- . await
287
- . collect ( stream:: iter ( buffer) )
288
- . await
289
- {
337
+ if let Err ( e) = self . trace_client . collect ( stream:: iter ( buffer) ) . await {
290
338
if let Some ( status_handle) = & self . status_handle {
291
339
status_handle ( e) ;
292
340
}
293
341
}
294
342
}
295
343
if !self . log_buffer . is_empty ( ) {
296
344
let buffer = take ( & mut self . log_buffer ) ;
297
- if let Err ( e) = self
298
- . inner
299
- . log_client
300
- . lock ( )
301
- . await
302
- . collect ( stream:: iter ( buffer) )
303
- . await
304
- {
345
+ if let Err ( e) = self . log_client . collect ( stream:: iter ( buffer) ) . await {
305
346
if let Some ( status_handle) = & self . status_handle {
306
347
status_handle ( e) ;
307
348
}
@@ -310,14 +351,7 @@ impl<P: CollectItemProduce, C: CollectItemConsume> ReporterAndBuffer<P, C> {
310
351
311
352
if !self . meter_buffer . is_empty ( ) {
312
353
let buffer = take ( & mut self . meter_buffer ) ;
313
- if let Err ( e) = self
314
- . inner
315
- . meter_client
316
- . lock ( )
317
- . await
318
- . collect ( stream:: iter ( buffer) )
319
- . await
320
- {
354
+ if let Err ( e) = self . meter_client . collect ( stream:: iter ( buffer) ) . await {
321
355
if let Some ( status_handle) = & self . status_handle {
322
356
status_handle ( e) ;
323
357
}
0 commit comments