8000 Product mask support for DSM (#6961) · DataDog/dd-trace-dotnet@726bb6e · GitHub
[go: up one dir, main page]

Skip to content

Commit 726bb6e

Browse files
authored
Product mask support for DSM (#6961)
## Summary of changes DSM backend will route payloads differently based on how the client which produced them was configured. This change mirrors the one [done for Java ](DataDog/dd-trace-java#8051). Ticket [DSMON-778](https://datadoghq.atlassian.net/browse/DSMON-778). ## Reason for change This flag will allow us to better understand in which environments and with which configurations DSM is being run. The value of the tag is a bitmask which can be extended as needed in the future. ## Implementation details The DSM payload was extended with `ProductMask` field. ## Test coverage Existing tests were updated. [DSMON-778]: https://datadoghq.atlassian.net/browse/DSMON-778?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
1 parent 646fddf commit 726bb6e

20 files changed

+83
-34
lines changed

tracer/src/Datadog.Trace/DataStreamsMonitoring/Aggregation/DataStreamsMessagePackFormatter.cs

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ internal class DataStreamsMessagePackFormatter
1919
private readonly byte[] _environmentBytes = StringEncoding.UTF8.GetBytes("Env");
2020
private readonly byte[] _environmentValueBytes;
2121
private readonly byte[] _serviceBytes = StringEncoding.UTF8.GetBytes("Service");
22+
private readonly long _productMask;
2223

2324
private readonly byte[] _serviceValueBytes;
2425

@@ -46,30 +47,55 @@ internal class DataStreamsMessagePackFormatter
4647

4748
private readonly byte[] _backlogTagsBytes = StringEncoding.UTF8.GetBytes("Tags");
4849
private readonly byte[] _backlogValueBytes = StringEncoding.UTF8.GetBytes("Value");
50+
private readonly byte[] _productMaskBytes = StringEncoding.UTF8.GetBytes("ProductMask");
4951

5052
public DataStreamsMessagePackFormatter(TracerSettings tracerSettings, string defaultServiceName)
51-
: this(tracerSettings.Environment, defaultServiceName)
52-
{
53-
}
54-
55-
public DataStreamsMessagePackFormatter(string? environment, string defaultServiceName)
5653
{
54+
var env = tracerSettings.Environment;
5755
// .NET tracer doesn't yet support primary tag
5856
// _primaryTagValueBytes = Array.Empty<byte>();
59-
_environmentValueBytes = string.IsNullOrEmpty(environment)
60-
? Array.Empty<byte>()
61-
: StringEncoding.UTF8.GetBytes(environment);
57+
_environmentValueBytes = string.IsNullOrEmpty(env)
58+
? []
59+
: StringEncoding.UTF8.GetBytes(env);
6260
_serviceValueBytes = StringEncoding.UTF8.GetBytes(defaultServiceName);
61+
_productMask = GetProductsMask(tracerSettings);
62+
}
63+
64+
[Flags]
65+
private enum Products : long
66+
{
67+
None = 0,
68+
Apm = 1, // 00000001
69+
Dsm = 1 << 1, // 00000010
70+
Djm = 1 << 2, // 00000100
71+
Profiling = 1 << 3, // 00001000
72+
}
73+
74+
private static long GetProductsMask(TracerSettings tracerSettings)
75+
{
76+
var productsMask = (long)Products.Apm;
77+
if (tracerSettings.IsDataStreamsMonitoringEnabled)
78+
{
79+
productsMask |= (long)Products.Dsm;
80+
}
81+
82+
if (tracerSettings.ProfilingEnabledInternal)
83+
{
84+
productsMask |= (long)Products.Profiling;
85+
}
86+
87+
return productsMask;
6388
}
6489

6590
public int Serialize(Stream stream, long bucketDurationNs, List<SerializableStatsBucket> statsBuckets, List<SerializableBacklogBucket> backlogsBuckets)
6691
{
6792
var bytesWritten = 0;
6893

69-
// 6 entries in StatsPayload:
94+
// Should be in sync with Java
95+
// https://github.com/DataDog/dd-trace-java/blob/a4b7a7b177709e6bdfd9261904cb9a777e4febbe/dd-trace-core/src/main/java/datadog/trace/core/datastreams/MsgPackDatastreamsPayloadWriter.java#L35
7096
// -1 because we don't have a primary tag
71-
// https://github.com/DataDog/data-streams-go/blob/6772b163707c0a8ecc8c9a3b28e0dab7e0cf58d4/datastreams/payload.go#L11
72-
bytesWritten += MessagePackBinary.WriteMapHeader(stream, 5);
97+
// -1 because service name override is not supported
98+
bytesWritten += MessagePackBinary.WriteMapHeader(stream, 6);
7399

74100
bytesWritten += MessagePackBinary.WriteStringBytes(stream, _environmentBytes);
75101
bytesWritten += MessagePackBinary.WriteStringBytes(stream, _environmentValueBytes);
@@ -160,6 +186,9 @@ public int Serialize(Stream stream, long bucketDurationNs, List<SerializableStat
160186
}
161187
}
162188

189+
bytesWritten += MessagePackBinary.WriteStringBytes(stream, _productMaskBytes);
190+
bytesWritten += MessagePackBinary.WriteInt64(stream, _productMask);
191+
163192
return bytesWritten;
164193
}
165194

tracer/src/Datadog.Trace/DataStreamsMonitoring/DataStreamsWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public static DataStreamsWriter Create(
7474
string defaultServiceName)
7575
=> new DataStreamsWriter(
7676
new DataStreamsAggregator(
77-
new DataStreamsMessagePackFormatter(settings.Environment, defaultServiceName),
77+
new DataStreamsMessagePackFormatter(settings, defaultServiceName),
7878
bucketDurationMs: DataStreamsConstants.DefaultBucketDurationMs),
7979
new DataStreamsApi(DataStreamsTransportStrategy.GetAgentIntakeFactory(settings.Exporter)),
8080
bucketDurationMs: DataStreamsConstants.DefaultBucketDurationMs,

tracer/test/Datadog.Trace.TestHelpers/DataStreamsMonitoring/MockDataStreamsPayload.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ public class MockDataStreamsPayload
3434
[Key(nameof(Stats))]
3535
public MockDataStreamsBucket[] Stats { get; set; }
3636

37+
[Key(nameof(ProductMask))]
38+
public long ProductMask { get; set; }
39+
3740
public static MockDataStreamsPayload Normalize(IImmutableList<MockDataStreamsPayload> dataStreams)
3841
{
3942
// This is nasty and hacky, but it's the only way I could get any semblance

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public void Aggregator_FlushesStats()
125125
private static DataStreamsAggregator CreateAggregatorWithData(long t1, long t2)
126126
{
127127
var aggregator = new DataStreamsAggregator(
128-
new DataStreamsMessagePackFormatter("env", "service"),
128+
new DataStreamsMessagePackFormatter(Tracer.Instance.Settings, "service"),
129129
BucketDurationMs);
130130

131131
aggregator.Add(

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System;
77
using System.Collections.Generic;
88
using System.IO;
9+
using Datadog.Trace.Configuration;
910
using Datadog.Trace.DataStreamsMonitoring.Aggregation;
1011
using Datadog.Trace.DataStreamsMonitoring.Hashes;
1112
using Datadog.Trace.DataStreamsMonitoring.Utils;
@@ -23,11 +24,11 @@ public class DataStreamsMessagePackFormatterTests
2324
[Fact]
2425
public void CanRoundTripMessagePackFormat()
2526
{
26-
var env = "my-env";
2727
var service = "service=name";
2828
var bucketDuration = 10_000_000_000;
2929
var edgeTags = new[] { "edge-1" };
30-
var formatter = new DataStreamsMessagePackFormatter(env, service);
30+
var settings = TracerSettings.Create(new() { { ConfigurationKeys.Environment, "my-env" } });
31+
var formatter = new DataStreamsMessagePackFormatter(settings, service);
3132

3233
var timeNs = DateTimeOffset.UtcNow.ToUnixTimeNanoseconds();
3334

@@ -106,10 +107,11 @@ public void CanRoundTripMessagePackFormat()
106107

107108
var expected = new MockDataStreamsPayload
108109
{
109-
Env = env,
110+
Env = settings.Environment,
110111
Service = service,
111112
Lang = "dotnet",
112113
TracerVersion = TracerConstants.AssemblyVersion,
114+
ProductMask = 1,
113115
Stats = new MockDataStreamsBucket[]
114116
{
115117
new()

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public async Task TransportsWorkCorrectly(Enum transport)
6161
var discovery = new DiscoveryServiceMock();
6262
var writer = new DataStreamsWriter(
6363
new DataStreamsAggregator(
64-
new DataStreamsMessagePackFormatter("env", "service"),
64+
new DataStreamsMessagePackFormatter(tracerSettings, "service"),
6565
bucketDurationMs),
6666
api,
6767
bucketDurationMs: bucketDurationMs,
@@ -127,10 +127,10 @@ private MockTracerAgent Create(TracesTransportType transportType)
127127
private TracerSettings GetSettings(MockTracerAgent agent)
128128
=> agent switch
129129
{
130-
MockTracerAgent.TcpUdpAgent x => TracerSettings.Create(new() { { ConfigurationKeys.AgentUri, $"http://localhost:{x.Port}" } }),
131-
MockTracerAgent.NamedPipeAgent x => TracerSettings.Create(new() { { ConfigurationKeys.TracesPipeName, x.TracesWindowsPipeName } }),
130+
MockTracerAgent.TcpUdpAgent x => TracerSettings.Create(new() { { ConfigurationKeys.AgentUri, $"http://localhost:{x.Port}" }, { ConfigurationKeys.Environment, "env" } }),
131+
MockTracerAgent.NamedPipeAgent x => TracerSettings.Create(new() { { ConfigurationKeys.TracesPipeName, x.TracesWindowsPipeName }, { ConfigurationKeys.Environment, "env" } }),
132132
#if NETCOREAPP3_1_OR_GREATER
133-
MockTracerAgent.UdsAgent x => TracerSettings.Create(new() { { ConfigurationKeys.AgentUri, ExporterSettings.UnixDomainSocketPrefix + x.TracesUdsPath } }),
133+
MockTracerAgent.UdsAgent x => TracerSettings.Create(new() { { ConfigurationKeys.AgentUri, ExporterSettings.UnixDomainSocketPrefix + x.TracesUdsPath }, { ConfigurationKeys.Environment, "env" } }),
134134
#endif
135135
_ => throw new InvalidOperationException("Unknown agent type " + agent.GetType()),
136136
};

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Linq;
1111
using System.Threading;
1212
using System.Threading.Tasks;
13+
using Datadog.Trace.Configuration;
1314
using Datadog.Trace.DataStreamsMonitoring;
1415
using Datadog.Trace.DataStreamsMonitoring.Aggregation;
1516
using Datadog.Trace.DataStreamsMonitoring.Hashes;
@@ -339,9 +340,10 @@ private static DataStreamsWriter CreateWriter(
339340
int bucketDurationMs = BucketDurationMs)
340341
{
341342
discoveryService = new DiscoveryServiceMock();
343+
var settings = TracerSettings.Create(new() { { ConfigurationKeys.Environment, Environment } });
342344
return new DataStreamsWriter(
343345
new DataStreamsAggregator(
344-
new DataStreamsMessagePackFormatter(Environment, Service),
346+
new DataStreamsMessagePackFormatter(settings, Service),
345347
bucketDurationMs),
346348
stubApi,
347349
bucketDurationMs: bucketDurationMs,

tracer/test/snapshots/DataStreamsMonitoringAwsKinesisTests.NetCore.SchemaV0.verified.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,6 @@
4040
}
4141
]
4242
}
43-
]
43+
],
44+
ProductMask: 3
4445
}

tracer/test/snapshots/DataStreamsMonitoringAwsKinesisTests.NetCore.SchemaV1.verified.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,6 @@
4040
}
4141
]
4242
}
43-
]
43+
],
44+
ProductMask: 3
4445
}

tracer/test/snapshots/DataStreamsMonitoringAwsKinesisTests.NetFramework.SchemaV0.verified.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,6 @@
4040
}
4141
]
4242
}
43-
]
43+
],
44+
ProductMask: 3
4445
}

0 commit comments

Comments
 (0)
0