88using System ;
99using System . Collections . Generic ;
1010using System . IO ;
11+ using System . Threading ;
1112using System . Threading . Tasks ;
1213using Datadog . Trace . Agent ;
1314using Datadog . Trace . Agent . Transports ;
@@ -23,35 +24,38 @@ internal class TracerFlareApi
2324 private const string TracerFlareEndpoint = "tracer_flare/v1" ;
2425 private static readonly IDatadogLogger Log = DatadogLogging . GetLoggerFor < TracerFlareApi > ( ) ;
2526
26- private readonly IApiRequestFactory _requestFactory ;
27- private readonly Uri _endpoint ;
27+ private Api _api ;
2828
29+ // Internal for testing
2930 public TracerFlareApi ( IApiRequestFactory requestFactory )
3031 {
31- _requestFactory = requestFactory ;
32- _endpoint = _requestFactory . GetEndpoint ( TracerFlareEndpoint ) ;
32+ _api = new ( requestFactory , requestFactory . GetEndpoint ( TracerFlareEndpoint ) ) ;
3333 }
3434
35- public static TracerFlareApi Create ( ExporterSettings exporterSettings )
35+ public TracerFlareApi ( TracerSettings . SettingsManager settings )
36+ : this ( CreateApiRequestFactory ( settings . InitialExporterSettings ) )
3637 {
37- var requestFactory = AgentTransportStrategy . Get (
38- exporterSettings ,
39- productName : "tracer_flare" ,
40- tcpTimeout : TimeSpan . FromSeconds ( 30 ) ,
41- AgentHttpHeaderNames . MinimalHeaders ,
42- ( ) => new MinimalAgentHeaderHelper ( ) ,
43- uri => uri ) ;
44-
45- return new TracerFlareApi ( requestFactory ) ;
38+ settings . SubscribeToChanges ( changes =>
39+ {
40+ if ( changes . UpdatedExporter is { } exporter )
41+ {
42+ var requestFactory = CreateApiRequestFactory ( exporter ) ;
43+ var api = new Api ( requestFactory , requestFactory . GetEndpoint ( TracerFlareEndpoint ) ) ;
44+ Interlocked . Exchange ( ref _api , api ) ;
45+ }
46+ } ) ;
4647 }
4748
49+ public static TracerFlareApi CreateManaged ( TracerSettings . SettingsManager settings ) => new ( settings ) ;
50+
4851 public async Task < KeyValuePair < bool , string ? > > SendTracerFlare ( Func < Stream , Task > writeFlareToStreamFunc , string caseId , string hostname , string email )
4952 {
53+ var api = Volatile . Read ( ref _api ) ;
5054 try
5155 {
52- Log . Debug ( "Sending tracer flare to {Endpoint}" , _endpoint ) ;
56+ Log . Debug ( "Sending tracer flare to {Endpoint}" , api . Endpoint ) ;
5357
54- var request = _requestFactory . Create ( _endpoint ) ;
58+ var request = api . RequestFactory . Create ( api . Endpoint ) ;
5559 using var response = await request . PostAsync (
5660 stream => TracerFlareRequestFactory . WriteRequestBody ( stream , writeFlareToStreamFunc , caseId , hostname : hostname , email : email ) ,
5761 MimeTypes . MultipartFormData ,
@@ -80,13 +84,27 @@ public static TracerFlareApi Create(ExporterSettings exporterSettings)
8084 Log . Warning < int , string ? > ( e , "Error parsing {StatusCode} response from tracer flare endpoint: {ResponseContent}" , response . StatusCode , responseContent ) ;
8185 }
8286
83- Log . Warning < string , int > ( "Error sending tracer flare to '{Endpoint}' {StatusCode} " , _requestFactory . Info ( _endpoint ) , response . StatusCode ) ;
87+ Log . Warning < string , int > ( "Error sending tracer flare to '{Endpoint}' {StatusCode} " , api . RequestFactory . Info ( api . Endpoint ) , response . StatusCode ) ;
8488 return new ( false , error ) ;
8589 }
8690 catch ( Exception ex )
8791 {
88- Log . Information ( ex , "Error sending tracer flare to '{Endpoint}'" , _requestFactory . Info ( _endpoint ) ) ;
92+ Log . Information ( ex , "Error sending tracer flare to '{Endpoint}'" , api . RequestFactory . Info ( api . Endpoint ) ) ;
8993 return new ( false , null ) ;
9094 }
9195 }
96+
97+ private static IApiRequestFactory CreateApiRequestFactory ( ExporterSettings exporterSettings )
98+ {
99+ var requestFactory = AgentTransportStrategy . Get (
100+ exporterSettings ,
101+ productName : "tracer_flare" ,
102+ tcpTimeout : TimeSpan . FromSeconds ( 30 ) ,
103+ AgentHttpHeaderNames . MinimalHeaders ,
104+ ( ) => new MinimalAgentHeaderHelper ( ) ,
105+ uri => uri ) ;
106+ return requestFactory ;
107+ }
108+
109+ private record Api ( IApiRequestFactory RequestFactory , Uri Endpoint ) ;
92110}
0 commit comments