3
3
// See the LICENSE file in the project root for more information.
4
4
5
5
using System ;
6
+ using System . Diagnostics ;
6
7
using System . Linq ;
7
8
using System . Runtime . CompilerServices ;
8
9
using System . Text . Json ;
@@ -21,6 +22,8 @@ public partial class ElasticsearchClient
21
22
{
22
23
private readonly HttpTransport < IElasticsearchClientSettings > _transport ;
23
24
25
+ private readonly ActivitySource _activitySource = new ( "Elastic.Clients.Elasticsearch.ElasticsearchClient" ) ;
26
+
24
27
internal static ConditionalWeakTable < JsonSerializerOptions , IElasticsearchClientSettings > SettingsTable { get ; } = new ( ) ;
25
28
26
29
/// <summary>
@@ -127,8 +130,16 @@ internal TResponse DoRequest<TRequest, TResponse, TRequestParameters>(
127
130
}
128
131
}
129
132
130
- var ( url , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , forceConfiguration ) ;
131
- var response = _transport . Request < TResponse > ( request . HttpMethod , url , postData , parameters ) ;
133
+ var ( resolvedUrl , urlTemplate , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , forceConfiguration ) ;
134
+
135
+ TResponse response ;
136
+
137
+ using ( var activity = _activitySource . StartActivity ( $ "Elasticsearch: { request . HttpMethod } { urlTemplate } ", ActivityKind . Client ) )
138
+ {
139
+ activity ? . AddTag ( "db.system" , "elasticsearch" ) ;
140
+ response = _transport . Request < TResponse > ( request . HttpMethod , resolvedUrl , postData , parameters ) ;
141
+ }
142
+
132
143
PostRequestProductCheck < TRequest , TResponse > ( request , response ) ;
133
144
134
145
if ( _productCheckStatus == ProductCheckStatus . Failed )
@@ -187,8 +198,21 @@ internal TResponse DoRequest<TRequest, TResponse, TRequestParameters>(
187
198
}
188
199
}
189
200
190
- var ( url , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , forceConfiguration ) ;
191
- var response = _transport . Request < TResponse > ( request . HttpMethod , url , postData , request . RequestParameters ) ;
201
+ var ( resolvedUrl , urlTemplate , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , forceConfiguration ) ;
202
+
203
+ TResponse response ;
204
+
205
+ using ( var activity = _activitySource . StartActivity ( $ "Elasticsearch: { request . HttpMethod } { urlTemplate } ", ActivityKind . Client ) )
206
+ {
207
+ activity ? . AddTag ( "db.system" , "elasticsearch" ) ;
208
+ activity ? . SetCustomProperty ( "elastic.transport.client" , true ) ;
209
+
210
+ response = _transport . Request < TResponse > ( request . HttpMethod , resolvedUrl , postData , request . RequestParameters ) ;
211
+
212
+ if ( response . ApiCallDetails . RequestBodyInBytes is not null )
213
+ activity ? . AddTag ( "db.statement" , System . Text . Encoding . UTF8 . GetString ( response . ApiCallDetails . RequestBodyInBytes ) ) ;
214
+ }
215
+
192
216
PostRequestProductCheck < TRequest , TResponse > ( request , response ) ;
193
217
194
218
if ( _productCheckStatus == ProductCheckStatus . Failed )
@@ -249,16 +273,28 @@ internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>
249
273
}
250
274
}
251
275
252
- var ( url , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , null ) ;
276
+ var ( resolvedUrl , urlTemplate , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , null ) ;
253
277
254
- if ( _productCheckStatus == ProductCheckStatus . Succeeded && ! requestModified )
255
- return _transport . RequestAsync < TResponse > ( request . HttpMethod , url , postData , parameters , cancellationToken ) ;
278
+ if ( _productCheckStatus == ProductCheckStatus . Succeeded && ! requestModified && ! _activitySource . HasListeners ( ) )
279
+ return _transport . RequestAsync < TResponse > ( request . HttpMethod , resolvedUrl , postData , parameters , cancellationToken ) ;
256
280
257
- return SendRequest ( request , parameters , url , postData , hadRequestConfig , originalHeaders ) ;
281
+ return SendRequest ( request , parameters , resolvedUrl , postData , hadRequestConfig , originalHeaders ) ;
258
282
259
283
async Task < TResponse > SendRequest ( TRequest request , RequestParameters ? parameters , string url , PostData postData , bool hadRequestConfig , HeadersList ? originalHeaders )
260
284
{
261
- var response = await _transport . RequestAsync < TResponse > ( request . HttpMethod , url , postData , parameters ) . ConfigureAwait ( false ) ;
285
+ TResponse response ;
286
+
287
+ using ( var activity = _activitySource . StartActivity ( $ "Elasticsearch: { request . HttpMethod } { urlTemplate } ", ActivityKind . Client ) )
288
+ {
289
+ activity ? . AddTag ( "db.system" , "elasticsearch" ) ;
290
+ activity ? . SetCustomProperty ( "elastic.transport.client" , true ) ;
291
+
292
+ response = await _transport . RequestAsync < TResponse > ( request . HttpMethod , url , postData , parameters ) . ConfigureAwait ( false ) ;
293
+
294
+ if ( response . ApiCallDetails . RequestBodyInBytes is not null )
295
+ activity ? . AddTag ( "db.statement" , System . Text . Encoding . UTF8 . GetString ( response . ApiCallDetails . RequestBodyInBytes ) ) ;
296
+ }
297
+
262
298
PostRequestProductCheck < TRequest , TResponse > ( request , response ) ;
263
299
264
300
if ( _productCheckStatus == ProductCheckStatus . Failed )
@@ -319,16 +355,28 @@ internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>
319
355
}
320
356
}
321
357
322
- var ( url , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , null ) ;
358
+ var ( resolvedUrl , urlTemplate , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , null ) ;
323
359
324
- if ( _productCheckStatus == ProductCheckStatus . Succeeded && ! requestModified )
325
- return _transport . RequestAsync < TResponse > ( request . HttpMethod , url , postData , request . RequestParameters , cancellationToken ) ;
360
+ if ( _productCheckStatus == ProductCheckStatus . Succeeded && ! requestModified && ! _activitySource . HasListeners ( ) )
361
+ return _transport . RequestAsync < TResponse > ( request . HttpMethod , resolvedUrl , postData , request . RequestParameters , cancellationToken ) ;
326
362
327
- return SendRequest ( request , request . RequestParameters , url , postData , hadRequestConfig , originalHeaders ) ;
363
+ return SendRequest ( request , request . RequestParameters , resolvedUrl , postData , hadRequestConfig , originalHeaders ) ;
328
364
329
365
async Task < TResponse > SendRequest ( TRequest request , RequestParameters ? parameters , string url , PostData postData , bool hadRequestConfig , HeadersList ? originalHeaders )
330
366
{
331
- var response = await _transport . RequestAsync < TResponse > ( request . HttpMethod , url , postData , parameters ) . ConfigureAwait ( false ) ;
367
+ TResponse response ;
368
+
369
+ using ( var activity = _activitySource . StartActivity ( $ "Elasticsearch: { request . HttpMethod } { urlTemplate } ", ActivityKind . Client ) )
370
+ {
371
+ activity ? . AddTag ( "db.system" , "elasticsearch" ) ;
372
+ activity ? . SetCustomProperty ( "elastic.transport.client" , true ) ;
373
+
374
+ response = await _transport . RequestAsync < TResponse > ( request . HttpMethod , url , postData , parameters ) . ConfigureAwait ( false ) ;
375
+
376
+ if ( response . ApiCallDetails . RequestBodyInBytes is not null )
377
+ activity ? . AddTag ( "db.statement" , System . Text . Encoding . UTF8 . GetString ( response . ApiCallDetails . RequestBodyInBytes ) ) ;
378
+ }
379
+
332
380
PostRequestProductCheck < TRequest , TResponse > ( request , response ) ;
333
381
334
382
if ( _productCheckStatus == ProductCheckStatus . Failed )
@@ -391,16 +439,28 @@ internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>
391
439
}
392
440
}
393
441
394
- var ( url , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , forceConfiguration ) ;
442
+ var ( resolvedUrl , urlTemplate , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , null ) ;
395
443
396
- if ( _productCheckStatus == ProductCheckStatus . Succeeded && ! requestModified )
397
- return _transport . RequestAsync < TResponse > ( request . HttpMethod , url , postData , parameters , cancellationToken ) ;
444
+ if ( _productCheckStatus == ProductCheckStatus . Succeeded && ! requestModified && ! _activitySource . HasListeners ( ) )
445
+ return _transport . RequestAsync < TResponse > ( request . HttpMethod , resolvedUrl , postData , parameters , cancellationToken ) ;
398
446
399
- return SendRequest ( request , parameters , url , postData , hadRequestConfig , originalHeaders ) ;
447
+ return SendRequest ( request , parameters , resolvedUrl , postData , hadRequestConfig , originalHeaders ) ;
400
448
401
449
async Task < TResponse > SendRequest ( TRequest request , RequestParameters ? parameters , string url , PostData postData , bool hadRequestConfig , HeadersList ? originalHeaders )
402
450
{
403
- var response = await _transport . RequestAsync < TResponse > ( request . HttpMethod , url , postData , parameters ) . ConfigureAwait ( false ) ;
451
+ TResponse response ;
452
+
453
+ using ( var activity = _activitySource . StartActivity ( $ "Elasticsearch: { request . HttpMethod } { urlTemplate } ", ActivityKind . Client ) )
454
+ {
455
+ activity ? . AddTag ( "db.system" , "elasticsearch" ) ;
456
+ activity ? . SetCustomProperty ( "elastic.transport.client" , true ) ;
457
+
458
+ response = await _transport . RequestAsync < TResponse > ( request . HttpMethod , url , postData , parameters ) . ConfigureAwait ( false ) ;
459
+
460
+ if ( response . ApiCallDetails . RequestBodyInBytes is not null )
461
+ activity ? . AddTag ( "db.statement" , System . Text . Encoding . UTF8 . GetString ( response . ApiCallDetails . RequestBodyInBytes ) ) ;
462
+ }
463
+
404
464
PostRequestProductCheck < TRequest , TResponse > ( request , response ) ;
405
465
406
466
if ( _productCheckStatus == ProductCheckStatus . Failed )
@@ -422,7 +482,7 @@ async Task<TResponse> SendRequest(TRequest request, RequestParameters? parameter
422
482
}
423
483
}
424
484
425
- private ( string url , PostData data ) PrepareRequest < TRequest , TRequestParameters > ( TRequest request ,
485
+ private ( string resolvedUrl , string urlTemplate , PostData data ) PrepareRequest < TRequest , TRequestParameters > ( TRequest request ,
426
486
Action < IRequestConfiguration > ? forceConfiguration )
427
487
where TRequest : Request < TRequestParameters >
428
488
where TRequestParameters : RequestParameters , new ( )
@@ -438,15 +498,15 @@ async Task<TResponse> SendRequest(TRequest request, RequestParameters? parameter
438
498
if ( request . Accept is not null )
439
499
ForceAccept < TRequest , TRequestParameters > ( request , request . Accept ) ;
440
500
441
- var url = request . GetUrl ( ElasticsearchClientSettings ) ;
501
+ var ( resolvedUrl , urlTemplate ) = request . GetUrl ( ElasticsearchClientSettings ) ;
442
502
443
503
var postData =
444
504
request . HttpMethod == HttpMethod . GET ||
445
505
request . HttpMethod == HttpMethod . HEAD || ! request . SupportsBody
446
506
? null
447
507
: PostData . Serializable ( request ) ;
448
508
449
- return ( url , postData ) ;
509
+ return ( resolvedUrl , urlTemplate , postData ) ;
450
510
}
451
511
452
512
private void PostRequestProductCheck < TRequest , TResponse > ( TRequest request , TResponse response )
0 commit comments