33// See the LICENSE file in the project root for more information.
44
55using System ;
6+ using System . Diagnostics ;
67using System . Linq ;
78using System . Runtime . CompilerServices ;
89using System . Text . Json ;
@@ -21,6 +22,8 @@ public partial class ElasticsearchClient
2122{
2223 private readonly HttpTransport < IElasticsearchClientSettings > _transport ;
2324
25+ private readonly ActivitySource _activitySource = new ( "Elastic.Clients.Elasticsearch.ElasticsearchClient" ) ;
26+
2427 internal static ConditionalWeakTable < JsonSerializerOptions , IElasticsearchClientSettings > SettingsTable { get ; } = new ( ) ;
2528
2629 /// <summary>
@@ -127,8 +130,16 @@ internal TResponse DoRequest<TRequest, TResponse, TRequestParameters>(
127130 }
128131 }
129132
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+
132143 PostRequestProductCheck < TRequest , TResponse > ( request , response ) ;
133144
134145 if ( _productCheckStatus == ProductCheckStatus . Failed )
@@ -187,8 +198,21 @@ internal TResponse DoRequest<TRequest, TResponse, TRequestParameters>(
187198 }
188199 }
189200
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+
192216 PostRequestProductCheck < TRequest , TResponse > ( request , response ) ;
193217
194218 if ( _productCheckStatus == ProductCheckStatus . Failed )
@@ -249,16 +273,28 @@ internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>
249273 }
250274 }
251275
252- var ( url , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , null ) ;
276+ var ( resolvedUrl , urlTemplate , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , null ) ;
253277
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 ) ;
256280
257- return SendRequest ( request , parameters , url , postData , hadRequestConfig , originalHeaders ) ;
281+ return SendRequest ( request , parameters , resolvedUrl , postData , hadRequestConfig , originalHeaders ) ;
258282
259283 async Task < TResponse > SendRequest ( TRequest request , RequestParameters ? parameters , string url , PostData postData , bool hadRequestConfig , HeadersList ? originalHeaders )
260284 {
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+
262298 PostRequestProductCheck < TRequest , TResponse > ( request , response ) ;
263299
264300 if ( _productCheckStatus == ProductCheckStatus . Failed )
@@ -319,16 +355,28 @@ internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>
319355 }
320356 }
321357
322- var ( url , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , null ) ;
358+ var ( resolvedUrl , urlTemplate , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , null ) ;
323359
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 ) ;
326362
327- return SendRequest ( request , request . RequestParameters , url , postData , hadRequestConfig , originalHeaders ) ;
363+ return SendRequest ( request , request . RequestParameters , resolvedUrl , postData , hadRequestConfig , originalHeaders ) ;
328364
329365 async Task < TResponse > SendRequest ( TRequest request , RequestParameters ? parameters , string url , PostData postData , bool hadRequestConfig , HeadersList ? originalHeaders )
330366 {
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+
332380 PostRequestProductCheck < TRequest , TResponse > ( request , response ) ;
333381
334382 if ( _productCheckStatus == ProductCheckStatus . Failed )
@@ -391,16 +439,28 @@ internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>
391439 }
392440 }
393441
394- var ( url , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , forceConfiguration ) ;
442+ var ( resolvedUrl , urlTemplate , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , null ) ;
395443
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 ) ;
398446
399- return SendRequest ( request , parameters , url , postData , hadRequestConfig , originalHeaders ) ;
447+ return SendRequest ( request , parameters , resolvedUrl , postData , hadRequestConfig , originalHeaders ) ;
400448
401449 async Task < TResponse > SendRequest ( TRequest request , RequestParameters ? parameters , string url , PostData postData , bool hadRequestConfig , HeadersList ? originalHeaders )
402450 {
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+
404464 PostRequestProductCheck < TRequest , TResponse > ( request , response ) ;
405465
406466 if ( _productCheckStatus == ProductCheckStatus . Failed )
@@ -422,7 +482,7 @@ async Task<TResponse> SendRequest(TRequest request, RequestParameters? parameter
422482 }
423483 }
424484
425- private ( string url , PostData data ) PrepareRequest < TRequest , TRequestParameters > ( TRequest request ,
485+ private ( string resolvedUrl , string urlTemplate , PostData data ) PrepareRequest < TRequest , TRequestParameters > ( TRequest request ,
426486 Action < IRequestConfiguration > ? forceConfiguration )
427487 where TRequest : Request < TRequestParameters >
428488 where TRequestParameters : RequestParameters , new ( )
@@ -438,15 +498,15 @@ async Task<TResponse> SendRequest(TRequest request, RequestParameters? parameter
438498 if ( request . Accept is not null )
439499 ForceAccept < TRequest , TRequestParameters > ( request , request . Accept ) ;
440500
441- var url = request . GetUrl ( ElasticsearchClientSettings ) ;
501+ var ( resolvedUrl , urlTemplate ) = request . GetUrl ( ElasticsearchClientSettings ) ;
442502
443503 var postData =
444504 request . HttpMethod == HttpMethod . GET ||
445505 request . HttpMethod == HttpMethod . HEAD || ! request . SupportsBody
446506 ? null
447507 : PostData . Serializable ( request ) ;
448508
449- return ( url , postData ) ;
509+ return ( resolvedUrl , urlTemplate , postData ) ;
450510 }
451511
452512 private void PostRequestProductCheck < TRequest , TResponse > ( TRequest request , TResponse response )
0 commit comments