Skip to content

Commit 2ae6175

Browse files
committed
Update TracerFlareApi
1 parent a1e9e71 commit 2ae6175

File tree

3 files changed

+46
-30
lines changed

3 files changed

+46
-30
lines changed

tracer/src/Datadog.Trace/Logging/TracerFlare/TracerFlareApi.cs

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System;
99
using System.Collections.Generic;
1010
using System.IO;
11+
using System.Threading;
1112
using System.Threading.Tasks;
1213
using Datadog.Trace.Agent;
1314
using 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
}

tracer/src/Datadog.Trace/TracerManagerFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ internal TracerManager CreateTracerManager(
168168
}
169169

170170
dynamicConfigurationManager ??= new DynamicConfigurationManager(RcmSubscriptionManager.Instance);
171-
tracerFlareManager ??= new TracerFlareManager(discoveryService, RcmSubscriptionManager.Instance, telemetry, TracerFlareApi.Create(settings.Exporter));
171+
tracerFlareManager ??= new TracerFlareManager(discoveryService, RcmSubscriptionManager.Instance, telemetry, TracerFlareApi.CreateManaged(settings.Manager));
172172
spanEventsManager ??= new SpanEventsManager(discoveryService);
173173
}
174174
else

tracer/test/Datadog.Trace.IntegrationTests/Logging/TracerFlare/TracerFlareApiTests.cs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public async Task CanSendToAgent_Tcp()
3232
{
3333
using var agent = MockTracerAgent.Create(output);
3434
var agentPath = new Uri($"http://localhost:{agent.Port}");
35-
var settings = ExporterSettings.Create(new() { { ConfigurationKeys.AgentUri, agentPath } });
35+
var settings = TracerSettings.Create(new() { { ConfigurationKeys.AgentUri, agentPath } });
3636

3737
await RunTest(settings, agent);
3838
}
@@ -45,8 +45,7 @@ public async Task CanSendToAgent_UDS()
4545
{
4646
using var agent = MockTracerAgent.Create(output, new UnixDomainSocketConfig(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()), null));
4747
var agentPath = agent.TracesUdsPath;
48-
var settings = new ExporterSettings(
49-
new NameValueConfigurationSource(new() { { "DD_APM_RECEIVER_SOCKET", agentPath } }));
48+
var settings = TracerSettings.Create(new() { { "DD_APM_RECEIVER_SOCKET", agentPath } });
5049

5150
await RunTest(settings, agent);
5251
}
@@ -82,8 +81,7 @@ async Task RunNamedPipesTest()
8281
{
8382
using var agent = MockTracerAgent.Create(output, new WindowsPipesConfig($"trace-{Guid.NewGuid()}", null));
8483
var pipeName = agent.TracesWindowsPipeName;
85-
var settings = new ExporterSettings(
86-
new NameValueConfigurationSource(new() { { "DD_TRACE_PIPE_NAME", pipeName } }));
84+
var settings = TracerSettings.Create(new() { { "DD_TRACE_PIPE_NAME", pipeName } });
8785

8886
await RunTest(settings, agent);
8987
}
@@ -96,12 +94,12 @@ public async Task ReturnsFalseWhenSendFails()
9694
{
9795
using var agent = MockTracerAgent.Create(output);
9896
var agentPath = new Uri($"http://localhost:{agent.Port}");
99-
var settings = ExporterSettings.Create(new() { { ConfigurationKeys.AgentUri, agentPath } });
97+
var settings = TracerSettings.Create(new() { { ConfigurationKeys.AgentUri, agentPath } });
10098

10199
var invalidJson = "{meep";
102100
agent.CustomResponses[MockTracerResponseType.TracerFlare] = new MockTracerResponse(invalidJson, 500);
103101

104-
var api = TracerFlareApi.Create(settings);
102+
var api = TracerFlareApi.CreateManaged(settings.Manager);
105103

106104
var result = await api.SendTracerFlare(WriteFlareToStreamFunc, CaseId, Hostname, Email);
107105

@@ -118,12 +116,12 @@ public async Task ReturnsErrorMessageWhenSendFails()
118116
{
119117
using var agent = MockTracerAgent.Create(output);
120118
var agentPath = new Uri($"http://localhost:{agent.Port}");
121-
var settings = ExporterSettings.Create(new() { { ConfigurationKeys.AgentUri, agentPath } });
119+
var settings = TracerSettings.Create(new() { { ConfigurationKeys.AgentUri, agentPath } });
122120

123121
var somethingWentWrong = "Something went wrong";
124122
agent.CustomResponses[MockTracerResponseType.TracerFlare] = new MockTracerResponse($$"""{ "error": "{{somethingWentWrong}}" }""", 500);
125123

126-
var api = TracerFlareApi.Create(settings);
124+
var api = TracerFlareApi.CreateManaged(settings.Manager);
127125

128126
var result = await api.SendTracerFlare(WriteFlareToStreamFunc, CaseId, Hostname, Email);
129127

@@ -133,9 +131,9 @@ public async Task ReturnsErrorMessageWhenSendFails()
133131
result.Value.Should().Be(somethingWentWrong);
134132
}
135133

136-
private async Task RunTest(ExporterSettings settings, MockTracerAgent agent)
134+
private async Task RunTest(TracerSettings settings, MockTracerAgent agent)
137135
{
138-
var api = TracerFlareApi.Create(settings);
136+
var api = TracerFlareApi.CreateManaged(settings.Manager);
139137

140138
var result = await api.SendTracerFlare(WriteFlareToStreamFunc, CaseId, Hostname, Email);
141139

0 commit comments

Comments
 (0)