Skip to content

Commit 254196f

Browse files
committed
chore: add example of Datadog transaction tracking
1 parent 01db940 commit 254196f

2 files changed

Lines changed: 54 additions & 28 deletions

File tree

print-service/src/Stickerlandia.PrintService.Client/Telemetry/DatadogTransactionTracker.cs

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,36 @@
1212

1313
namespace Stickerlandia.PrintService.Client.Telemetry;
1414

15-
internal class DatadogTransactionTracker(
16-
IHttpClientFactory httpClientFactory,
17-
IConfiguration configuration,
18-
ILogger<DatadogTransactionTracker> logger)
15+
internal class DatadogTransactionTracker
1916
{
20-
private static readonly Uri PipelineStatsEndpoint =
21-
new("https://trace.agent.datadoghq.com/api/v0.1/pipeline_stats");
17+
private readonly string _apiKey;
18+
private readonly string _service;
19+
private readonly string _environment;
20+
private readonly Uri _pipelineStatsEndpoint;
2221

23-
private readonly string _apiKey = configuration["DD_API_KEY"] ?? string.Empty;
24-
private readonly string _service = configuration["DD_SERVICE"] ?? "print-service";
25-
private readonly string _environment = configuration["DD_ENV"] ?? "local";
22+
private readonly IHttpClientFactory _httpClientFactory;
23+
private readonly ILogger<DatadogTransactionTracker> _logger;
24+
25+
internal DatadogTransactionTracker(IHttpClientFactory httpClientFactory,
26+
IConfiguration configuration,
27+
ILogger<DatadogTransactionTracker> logger)
28+
{
29+
ArgumentNullException.ThrowIfNull(configuration);
30+
31+
_httpClientFactory = httpClientFactory;
32+
_logger = logger;
33+
_apiKey = configuration["DD_API_KEY"] ?? string.Empty;
34+
_service = configuration["DD_SERVICE"] ?? "print-service";
35+
_environment = configuration["DD_ENV"] ?? "local";
36+
var ddSite = configuration["DD_SITE"] ?? "datadoghq.com";
37+
_pipelineStatsEndpoint = new Uri($"https://trace.agent.{ddSite}/api/v0.1/pipeline_stats");
38+
}
2639

2740
internal async Task TrackTransactionAsync(string transactionId, string checkpoint)
2841
{
2942
if (string.IsNullOrEmpty(_apiKey))
3043
{
31-
logger.LogWarning("DD_API_KEY is not configured. Skipping transaction tracking.");
44+
_logger.LogWarning("DD_API_KEY is not configured. Skipping transaction tracking for transaction {TransactionId} at checkpoint {Checkpoint}.", transactionId, checkpoint);
3245
return;
3346
}
3447

@@ -55,8 +68,8 @@ internal async Task TrackTransactionAsync(string transactionId, string checkpoin
5568
var json = JsonSerializer.Serialize(payload);
5669
var compressed = Gzip(Encoding.UTF8.GetBytes(json));
5770

58-
using var client = httpClientFactory.CreateClient();
59-
using var request = new HttpRequestMessage(HttpMethod.Post, PipelineStatsEndpoint);
71+
using var client = _httpClientFactory.CreateClient();
72+
using var request = new HttpRequestMessage(HttpMethod.Post, _pipelineStatsEndpoint);
6073
request.Headers.Add("DD-API-KEY", _apiKey);
6174
request.Content = new ByteArrayContent(compressed);
6275
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
@@ -66,14 +79,14 @@ internal async Task TrackTransactionAsync(string transactionId, string checkpoin
6679
response.EnsureSuccessStatusCode();
6780

6881
#pragma warning disable
69-
logger.LogInformation("Successfully tracked transaction {TransactionId} at checkpoint {Checkpoint} with status code {StatusCode}", transactionId, checkpoint, response.StatusCode);
82+
_logger.LogInformation("Successfully tracked transaction {TransactionId} at checkpoint {Checkpoint} with status code {StatusCode}", transactionId, checkpoint, response.StatusCode);
7083
#pragma warning enable
7184
}
7285
#pragma warning disable CA1031
7386
catch (Exception ex)
7487
#pragma warning restore CA1031
7588
{
76-
logger.LogWarning(ex, "Failure tracking transaction");
89+
_logger.LogWarning(ex, "Failed to track transaction {TransactionId} at checkpoint {Checkpoint}. Exception: {ExceptionMessage}", transactionId, checkpoint);
7790
}
7891
}
7992

print-service/src/Stickerlandia.PrintService.Core/Observability/DatadogTransactionTracker.cs

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,36 @@
1212

1313
namespace Stickerlandia.PrintService.Core.Observability;
1414

15-
public class DatadogTransactionTracker(
16-
IHttpClientFactory httpClientFactory,
17-
IConfiguration configuration,
18-
ILogger<DatadogTransactionTracker> logger)
15+
public class DatadogTransactionTracker
1916
{
20-
private static readonly Uri PipelineStatsEndpoint =
21-
new("https://trace.agent.datadoghq.com/api/v0.1/pipeline_stats");
17+
private readonly string _apiKey;
18+
private readonly string _service;
19+
private readonly string _environment;
20+
private readonly Uri _pipelineStatsEndpoint;
2221

23-
private readonly string _apiKey = configuration["DD_API_KEY"] ?? string.Empty;
24-
private readonly string _service = configuration["DD_SERVICE"] ?? "print-service";
25-
private readonly string _environment = configuration["DD_ENV"] ?? "local";
22+
private readonly IHttpClientFactory _httpClientFactory;
23+
private readonly ILogger<DatadogTransactionTracker> _logger;
24+
25+
public DatadogTransactionTracker(IHttpClientFactory httpClientFactory,
26+
IConfiguration configuration,
27+
ILogger<DatadogTransactionTracker> logger)
28+
{
29+
ArgumentNullException.ThrowIfNull(configuration);
30+
31+
_httpClientFactory = httpClientFactory;
32+
_logger = logger;
33+
_apiKey = configuration["DD_API_KEY"] ?? string.Empty;
34+
_service = configuration["DD_SERVICE"] ?? "print-service";
35+
_environment = configuration["DD_ENV"] ?? "local";
36+
var ddSite = configuration["DD_SITE"] ?? "datadoghq.com";
37+
_pipelineStatsEndpoint = new Uri($"https://trace.agent.{ddSite}/api/v0.1/pipeline_stats");
38+
}
2639

2740
public async Task TrackTransactionAsync(string transactionId, string checkpoint)
2841
{
2942
if (string.IsNullOrEmpty(_apiKey))
3043
{
31-
Log.TransactionTrackingSkipped(logger);
44+
Log.TransactionTrackingSkipped(_logger);
3245
return;
3346
}
3447

@@ -55,8 +68,8 @@ public async Task TrackTransactionAsync(string transactionId, string checkpoint)
5568
var json = JsonSerializer.Serialize(payload);
5669
var compressed = Gzip(Encoding.UTF8.GetBytes(json));
5770

58-
using var client = httpClientFactory.CreateClient();
59-
using var request = new HttpRequestMessage(HttpMethod.Post, PipelineStatsEndpoint);
71+
using var client = _httpClientFactory.CreateClient();
72+
using var request = new HttpRequestMessage(HttpMethod.Post, _pipelineStatsEndpoint);
6073
request.Headers.Add("DD-API-KEY", _apiKey);
6174
request.Content = new ByteArrayContent(compressed);
6275
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
@@ -66,14 +79,14 @@ public async Task TrackTransactionAsync(string transactionId, string checkpoint)
6679
response.EnsureSuccessStatusCode();
6780

6881
#pragma warning disable
69-
logger.LogInformation("Successfully tracked transaction {TransactionId} at checkpoint {Checkpoint} with status code {StatusCode}", transactionId, checkpoint, response.StatusCode);
82+
_logger.LogInformation("Successfully tracked transaction {TransactionId} at checkpoint {Checkpoint} with status code {StatusCode}", transactionId, checkpoint, response.StatusCode);
7083
#pragma warning enable
7184
}
7285
#pragma warning disable CA1031
7386
catch (Exception ex)
7487
#pragma warning restore CA1031
7588
{
76-
Log.TransactionTrackingFailed(logger, transactionId, checkpoint, ex);
89+
Log.TransactionTrackingFailed(_logger, transactionId, checkpoint, ex);
7790
}
7891
}
7992

0 commit comments

Comments
 (0)