Skip to content

Commit 9d45f57

Browse files
committed
Moved parsing to tracer settings plus other minor fixes
1 parent 702feb6 commit 9d45f57

File tree

6 files changed

+46
-54
lines changed

6 files changed

+46
-54
lines changed

tracer/src/Datadog.Trace/Configuration/TracerSettings.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using Datadog.Trace.ClrProfiler.ServerlessInstrumentation;
1515
using Datadog.Trace.Configuration.ConfigurationSources.Telemetry;
1616
using Datadog.Trace.Configuration.Telemetry;
17+
using Datadog.Trace.DataStreamsMonitoring.TransactionTracking;
1718
using Datadog.Trace.LibDatadog;
1819
using Datadog.Trace.Logging;
1920
using Datadog.Trace.Logging.DirectSubmission;
@@ -587,7 +588,10 @@ not null when string.Equals(value, "otlp", StringComparison.OrdinalIgnoreCase) =
587588

588589
DataStreamsTransactionExtractors = config
589590
.WithKeys(ConfigurationKeys.DataStreamsMonitoring.TransactionExtractors)
590-
.AsString(string.Empty);
591+
.GetAs(
592+
defaultValue: new DefaultResult<IReadOnlyList<DataStreamsTransactionExtractor>>([], "[]"),
593+
converter: json => ParsingResult<IReadOnlyList<DataStreamsTransactionExtractor>>.Success(DataStreamsTransactionExtractor.ParseList(json)),
594+
validator: null);
591595

592596
// no legacy headers if we are in "enbaled by default" state
593597
IsDataStreamsLegacyHeadersEnabled = config
@@ -1215,7 +1219,7 @@ not null when string.Equals(value, "otlp", StringComparison.OrdinalIgnoreCase) =
12151219
/// <summary>
12161220
/// Gets a raw value for DSM extractors
12171221
/// </summary>
1218-
internal string DataStreamsTransactionExtractors { get; }
1222+
internal IReadOnlyList<DataStreamsTransactionExtractor> DataStreamsTransactionExtractors { get; }
12191223

12201224
/// <summary>
12211225
/// Gets a value indicating whether data streams schema extraction is enabled or not.

tracer/src/Datadog.Trace/DataStreamsMonitoring/TransactionTracking/DataStreamsExtractorRegistry.cs

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,19 @@
44
// </copyright>
55
#nullable enable
66

7-
using System;
87
using System.Collections.Generic;
9-
using Datadog.Trace.Logging;
108
using Datadog.Trace.Util.Json;
119

1210
namespace Datadog.Trace.DataStreamsMonitoring.TransactionTracking;
1311

1412
internal sealed class DataStreamsExtractorRegistry
1513
{
16-
private static readonly IDatadogLogger Log = DatadogLogging.GetLoggerFor<DataStreamsExtractorRegistry>();
14+
private readonly Dictionary<DataStreamsTransactionExtractor.ExtractorType, List<DataStreamsTransactionExtractor>> _extractors;
1715

18-
private readonly Dictionary<DataStreamsTransactionExtractor.ExtractorType, List<DataStreamsTransactionExtractor>> _extractors = new();
19-
20-
internal DataStreamsExtractorRegistry(string extractorsJson)
16+
internal DataStreamsExtractorRegistry(IReadOnlyList<DataStreamsTransactionExtractor> extractors)
2117
{
22-
if (string.IsNullOrWhiteSpace(extractorsJson))
23-
{
24-
return;
25-
}
26-
27-
List<DataStreamsTransactionExtractor>? deserialized;
28-
try
29-
{
30-
deserialized = JsonHelper.DeserializeObject<List<DataStreamsTransactionExtractor>>(extractorsJson);
31-
}
32-
catch (Exception ex)
33-
{
34-
Log.Warning(ex, "Failed to parse DD_DATA_STREAMS_TRANSACTION_EXTRACTORS value. Transaction tracking extractors will be disabled.");
35-
return;
36-
}
37-
38-
if (deserialized == null)
39-
{
40-
return;
41-
}
42-
43-
foreach (var extractor in deserialized)
18+
_extractors = new(extractors.Count);
19+
foreach (var extractor in extractors)
4420
{
4521
var list = _extractors.GetValueOrDefault(extractor.ParsedType) ?? new();
4622
list.Add(extractor);

tracer/src/Datadog.Trace/DataStreamsMonitoring/TransactionTracking/DataStreamsTransactionExtractor.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#nullable enable
66

77
using System.Collections.Generic;
8+
using Datadog.Trace.Util.Json;
89
using Datadog.Trace.Vendors.Newtonsoft.Json;
910

1011
namespace Datadog.Trace.DataStreamsMonitoring.TransactionTracking;
@@ -54,4 +55,18 @@ public ExtractorType ParsedType
5455
return _cachedType.Value;
5556
}
5657
}
58+
59+
public static IReadOnlyList<DataStreamsTransactionExtractor> ParseList(string json)
60+
{
61+
try
62+
{
63+
return JsonHelper.DeserializeObject<List<DataStreamsTransactionExtractor>>(json)
64+
?.FindAll(e => e.ParsedType != ExtractorType.Unknown)
65+
?? [];
66+
}
67+
catch
68+
{
69+
return [];
70+
}
71+
}
5772
}

tracer/src/Datadog.Trace/DataStreamsMonitoring/TransactionTracking/DataStreamsTransactionInfo.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ internal DataStreamsTransactionInfo(byte[] idBytes, long timestamp, string check
5858
_checkpointId = Cache.GetOrAdd(checkpoint, _ => Interlocked.Increment(ref _counter));
5959
}
6060

61-
internal long TimestampNs { get => _timestamp; }
62-
63-
internal string TransactionId { get => Encoding.UTF8.GetString(_idBytes); }
61+
internal long TimestampNs => _timestamp;
6462

6563
private static byte[] Truncate(byte[] source)
6664
{

tracer/test/Datadog.Trace.Tests/DataStreamsMonitoring/DataStreamsExtractorRegistryTest.cs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,17 @@ namespace Datadog.Trace.Tests.DataStreamsMonitoring;
1212

1313
public class DataStreamsExtractorRegistryTest
1414
{
15-
[Theory]
16-
[InlineData("not valid json")]
17-
[InlineData("{\"not\": \"a list\"}")]
18-
[InlineData("[{\"name\": \"n\", \"type\":")] // truncated / incomplete
19-
public void MalformedJson_DoesNotThrow_AndLeavesExtractorsEmpty(string json)
20-
{
21-
var registry = new DataStreamsExtractorRegistry(json);
22-
23-
registry.GetExtractorsByType(DataStreamsTransactionExtractor.ExtractorType.HttpOutHeaders).Should().BeNull();
24-
registry.GetExtractorsByType(DataStreamsTransactionExtractor.ExtractorType.HttpInHeaders).Should().BeNull();
25-
}
26-
2715
[Fact]
2816
public void DeserializeCorrectly()
2917
{
30-
var registry = new DataStreamsExtractorRegistry("[{\"name\": \"transaction-origin\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"transaction-id\"}]");
18+
var registry = FromJson("[{\"name\": \"transaction-origin\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"transaction-id\"}]");
3119
registry.AsJson().Should().Be("{\"HttpOutHeaders\":[{\"name\":\"transaction-origin\",\"type\":\"HTTP_OUT_HEADERS\",\"value\":\"transaction-id\",\"ParsedType\":1}]}");
3220
}
3321

3422
[Fact]
3523
public void GetExtractorsByType_ReturnsAllExtractors_ForSameType()
3624
{
37-
var registry = new DataStreamsExtractorRegistry(
25+
var registry = FromJson(
3826
"[" +
3927
"{\"name\": \"n1\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"v1\"}," +
4028
"{\"name\": \"n2\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"v2\"}" +
@@ -50,9 +38,11 @@ public void GetExtractorsByType_ReturnsAllExtractors_ForSameType()
5038
[Fact]
5139
public void GetExtractorsByType_DoesNotReturnExtractors_ForOtherType()
5240
{
53-
var registry = new DataStreamsExtractorRegistry(
54-
"[{\"name\": \"n1\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"v1\"}]");
41+
var registry = FromJson("[{\"name\": \"n1\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"v1\"}]");
5542

5643
registry.GetExtractorsByType(DataStreamsTransactionExtractor.ExtractorType.HttpInHeaders).Should().BeNull();
5744
}
45+
46+
private static DataStreamsExtractorRegistry FromJson(string json)
47+
=> new(DataStreamsTransactionExtractor.ParseList(json));
5848
}

tracer/test/Datadog.Trace.Tests/DataStreamsMonitoring/DataStreamsTransactionExtractorTests.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,30 @@ public class DataStreamsTransactionExtractorTests
1818
[InlineData("HTTP_IN_HEADERS", 2)]
1919
[InlineData("KAFKA_CONSUME_HEADERS", 3)]
2020
[InlineData("KAFKA_PRODUCE_HEADERS", 4)]
21-
[InlineData("UNKNOWN_STUFF", 0)]
22-
[InlineData("", 0)]
23-
public void ExtractorType_ReturnsCorrectType_ForTypeString(string stringType, int expectedInt)
21+
public void ExtractorType_ReturnsCorrectType_ForKnownTypeString(string stringType, int expectedInt)
2422
{
2523
var expected = (DataStreamsTransactionExtractor.ExtractorType)expectedInt;
2624
var json = $"[{{\"name\": \"n\", \"type\": \"{stringType}\", \"value\": \"v\"}}]";
27-
var registry = new DataStreamsExtractorRegistry(json);
25+
var registry = new DataStreamsExtractorRegistry(DataStreamsTransactionExtractor.ParseList(json));
2826
registry.GetExtractorsByType(expected).Should().ContainSingle()
2927
.Which.ParsedType.Should().Be(expected);
3028
}
3129

30+
[Theory]
31+
[InlineData("UNKNOWN_STUFF")]
32+
[InlineData("")]
33+
public void ExtractorType_SkipsItem_ForUnknownTypeString(string stringType)
34+
{
35+
var json = $"[{{\"name\": \"n\", \"type\": \"{stringType}\", \"value\": \"v\"}}]";
36+
var registry = new DataStreamsExtractorRegistry(DataStreamsTransactionExtractor.ParseList(json));
37+
registry.GetExtractorsByType(DataStreamsTransactionExtractor.ExtractorType.Unknown).Should().BeNull();
38+
}
39+
3240
[Fact]
3341
public void ExtractorType_ReturnsSameValue_OnMultipleCalls()
3442
{
35-
var registry = new DataStreamsExtractorRegistry("[{\"name\": \"n\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"v\"}]");
43+
var json = "[{\"name\": \"n\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"v\"}]";
44+
var registry = new DataStreamsExtractorRegistry(DataStreamsTransactionExtractor.ParseList(json));
3645
var extractor = registry.GetExtractorsByType(DataStreamsTransactionExtractor.ExtractorType.HttpOutHeaders)!.Single();
3746
extractor.ParsedType.Should().Be(extractor.ParsedType);
3847
}

0 commit comments

Comments
 (0)