Skip to content

Commit 40b9770

Browse files
[Tracing] Update telemetry metrics for OpenTelemetry integration (#6454)
For the OpenTelemetry integration, update the tag generated for the span_created telemetry metric from integration_name:opentelemetry to integration_name:otel to align with other tracing libraries.
1 parent fb20dfc commit 40b9770

File tree

15 files changed

+88
-40
lines changed

15 files changed

+88
-40
lines changed

tracer/src/Datadog.Trace/Generated/net461/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/CiVisibilityMetricsTelemetryCollector_CountShared.g.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,9 @@ private static AggregatedMetric[] GetCountSharedBuffer()
176176
new(new[] { "integration_name:symmetricalgorithm", "error_type:duck_typing" }),
177177
new(new[] { "integration_name:symmetricalgorithm", "error_type:invoker" }),
178178
new(new[] { "integration_name:symmetricalgorithm", "error_type:execution" }),
179-
new(new[] { "integration_name:opentelemetry", "error_type:duck_typing" }),
180-
new(new[] { "integration_name:opentelemetry", "error_type:invoker" }),
181-
new(new[] { "integration_name:opentelemetry", "error_type:execution" }),
179+
new(new[] { "integration_name:otel", "error_type:duck_typing" }),
180+
new(new[] { "integration_name:otel", "error_type:invoker" }),
181+
new(new[] { "integration_name:otel", "error_type:execution" }),
182182
new(new[] { "integration_name:pathtraversal", "error_type:duck_typing" }),
183183
new(new[] { "integration_name:pathtraversal", "error_type:invoker" }),
184184
new(new[] { "integration_name:pathtraversal", "error_type:execution" }),

tracer/src/Datadog.Trace/Generated/net461/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/MetricsTelemetryCollector_Count.g.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private static AggregatedMetric[] GetCountBuffer()
7777
new(new[] { "integration_name:process" }),
7878
new(new[] { "integration_name:hashalgorithm" }),
7979
new(new[] { "integration_name:symmetricalgorithm" }),
80-
new(new[] { "integration_name:opentelemetry" }),
80+
new(new[] { "integration_name:otel" }),
8181
new(new[] { "integration_name:pathtraversal" }),
8282
new(new[] { "integration_name:ssrf" }),
8383
new(new[] { "integration_name:ldap" }),
@@ -498,7 +498,7 @@ private static AggregatedMetric[] GetCountBuffer()
498498
new(new[] { "integration_name:process" }),
499499
new(new[] { "integration_name:hashalgorithm" }),
500500
new(new[] { "integration_name:symmetricalgorithm" }),
501-
new(new[] { "integration_name:opentelemetry" }),
501+
new(new[] { "integration_name:otel" }),
502502
new(new[] { "integration_name:pathtraversal" }),
503503
new(new[] { "integration_name:ssrf" }),
504504
new(new[] { "integration_name:ldap" }),

tracer/src/Datadog.Trace/Generated/net461/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/MetricsTelemetryCollector_CountShared.g.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,9 @@ private static AggregatedMetric[] GetCountSharedBuffer()
176176
new(new[] { "integration_name:symmetricalgorithm", "error_type:duck_typing" }),
177177
new(new[] { "integration_name:symmetricalgorithm", "error_type:invoker" }),
178178
new(new[] { "integration_name:symmetricalgorithm", "error_type:execution" }),
179-
new(new[] { "integration_name:opentelemetry", "error_type:duck_typing" }),
180-
new(new[] { "integration_name:opentelemetry", "error_type:invoker" }),
181-
new(new[] { "integration_name:opentelemetry", "error_type:execution" }),
179+
new(new[] { "integration_name:otel", "error_type:duck_typing" }),
180+
new(new[] { "integration_name:otel", "error_type:invoker" }),
181+
new(new[] { "integration_name:otel", "error_type:execution" }),
182182
new(new[] { "integration_name:pathtraversal", "error_type:duck_typing" }),
183183
new(new[] { "integration_name:pathtraversal", "error_type:invoker" }),
184184
new(new[] { "integration_name:pathtraversal", "error_type:execution" }),

tracer/src/Datadog.Trace/Generated/net6.0/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/CiVisibilityMetricsTelemetryCollector_CountShared.g.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,9 @@ private static AggregatedMetric[] GetCountSharedBuffer()
176176
new(new[] { "integration_name:symmetricalgorithm", "error_type:duck_typing" }),
177177
new(new[] { "integration_name:symmetricalgorithm", "error_type:invoker" }),
178178
new(new[] { "integration_name:symmetricalgorithm", "error_type:execution" }),
179-
new(new[] { "integration_name:opentelemetry", "error_type:duck_typing" }),
180-
new(new[] { "integration_name:opentelemetry", "error_type:invoker" }),
181-
new(new[] { "integration_name:opentelemetry", "error_type:execution" }),
179+
new(new[] { "integration_name:otel", "error_type:duck_typing" }),
180+
new(new[] { "integration_name:otel", "error_type:invoker" }),
181+
new(new[] { "integration_name:otel", "error_type:execution" }),
182182
new(new[] { "integration_name:pathtraversal", "error_type:duck_typing" }),
183183
new(new[] { "integration_name:pathtraversal", "error_type:invoker" }),
184184
new(new[] { "integration_name:pathtraversal", "error_type:execution" }),

tracer/src/Datadog.Trace/Generated/net6.0/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/MetricsTelemetryCollector_Count.g.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private static AggregatedMetric[] GetCountBuffer()
7777
new(new[] { "integration_name:process" }),
7878
new(new[] { "integration_name:hashalgorithm" }),
7979
new(new[] { "integration_name:symmetricalgorithm" }),
80-
new(new[] { "integration_name:opentelemetry" }),
80+
new(new[] { "integration_name:otel" }),
8181
new(new[] { "integration_name:pathtraversal" }),
8282
new(new[] { "integration_name:ssrf" }),
8383
new(new[] { "integration_name:ldap" }),
@@ -498,7 +498,7 @@ private static AggregatedMetric[] GetCountBuffer()
498498
new(new[] { "integration_name:process" }),
499499
new(new[] { "integration_name:hashalgorithm" }),
500500
new(new[] { "integration_name:symmetricalgorithm" }),
501-
new(new[] { "integration_name:opentelemetry" }),
501+
new(new[] { "integration_name:otel" }),
502502
new(new[] { "integration_name:pathtraversal" }),
503503
new(new[] { "integration_name:ssrf" }),
504504
new(new[] { "integration_name:ldap" }),

tracer/src/Datadog.Trace/Generated/net6.0/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/MetricsTelemetryCollector_CountShared.g.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,9 @@ private static AggregatedMetric[] GetCountSharedBuffer()
176176
new(new[] { "integration_name:symmetricalgorithm", "error_type:duck_typing" }),
177177
new(new[] { "integration_name:symmetricalgorithm", "error_type:invoker" }),
178178
new(new[] { "integration_name:symmetricalgorithm", "error_type:execution" }),
179-
new(new[] { "integration_name:opentelemetry", "error_type:duck_typing" }),
180-
new(new[] { "integration_name:opentelemetry", "error_type:invoker" }),
181-
new(new[] { "integration_name:opentelemetry", "error_type:execution" }),
179+
new(new[] { "integration_name:otel", "error_type:duck_typing" }),
180+
new(new[] { "integration_name:otel", "error_type:invoker" }),
181+
new(new[] { "integration_name:otel", "error_type:execution" }),
182182
new(new[] { "integration_name:pathtraversal", "error_type:duck_typing" }),
183183
new(new[] { "integration_name:pathtraversal", "error_type:invoker" }),
184184
new(new[] { "integration_name:pathtraversal", "error_type:execution" }),

tracer/src/Datadog.Trace/Generated/netcoreapp3.1/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/CiVisibilityMetricsTelemetryCollector_CountShared.g.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,9 @@ private static AggregatedMetric[] GetCountSharedBuffer()
176176
new(new[] { "integration_name:symmetricalgorithm", "error_type:duck_typing" }),
177177
new(new[] { "integration_name:symmetricalgorithm", "error_type:invoker" }),
178178
new(new[] { "integration_name:symmetricalgorithm", "error_type:execution" }),
179-
new(new[] { "integration_name:opentelemetry", "error_type:duck_typing" }),
180-
new(new[] { "integration_name:opentelemetry", "error_type:invoker" }),
181-
new(new[] { "integration_name:opentelemetry", "error_type:execution" }),
179+
new(new[] { "integration_name:otel", "error_type:duck_typing" }),
180+
new(new[] { "integration_name:otel", "error_type:invoker" }),
181+
new(new[] { "integration_name:otel", "error_type:execution" }),
182182
new(new[] { "integration_name:pathtraversal", "error_type:duck_typing" }),
183183
new(new[] { "integration_name:pathtraversal", "error_type:invoker" }),
184184
new(new[] { "integration_name:pathtraversal", "error_type:execution" }),

tracer/src/Datadog.Trace/Generated/netcoreapp3.1/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/MetricsTelemetryCollector_Count.g.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private static AggregatedMetric[] GetCountBuffer()
7777
new(new[] { "integration_name:process" }),
7878
new(new[] { "integration_name:hashalgorithm" }),
7979
new(new[] { "integration_name:symmetricalgorithm" }),
80-
new(new[] { "integration_name:opentelemetry" }),
80+
new(new[] { "integration_name:otel" }),
8181
new(new[] { "integration_name:pathtraversal" }),
8282
new(new[] { "integration_name:ssrf" }),
8383
new(new[] { "integration_name:ldap" }),
@@ -498,7 +498,7 @@ private static AggregatedMetric[] GetCountBuffer()
498498
new(new[] { "integration_name:process" }),
499499
new(new[] { "integration_name:hashalgorithm" }),
500500
new(new[] { "integration_name:symmetricalgorithm" }),
501-
new(new[] { "integration_name:opentelemetry" }),
501+
new(new[] { "integration_name:otel" }),
502502
new(new[] { "integration_name:pathtraversal" }),
503503
new(new[] { "integration_name:ssrf" }),
504504
new(new[] { "integration_name:ldap" }),

tracer/src/Datadog.Trace/Generated/netcoreapp3.1/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/MetricsTelemetryCollector_CountShared.g.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,9 @@ private static AggregatedMetric[] GetCountSharedBuffer()
176176
new(new[] { "integration_name:symmetricalgorithm", "error_type:duck_typing" }),
177177
new(new[] { "integration_name:symmetricalgorithm", "error_type:invoker" }),
178178
new(new[] { "integration_name:symmetricalgorithm", "error_type:execution" }),
179-
new(new[] { "integration_name:opentelemetry", "error_type:duck_typing" }),
180-
new(new[] { "integration_name:opentelemetry", "error_type:invoker" }),
181-
new(new[] { "integration_name:opentelemetry", "error_type:execution" }),
179+
new(new[] { "integration_name:otel", "error_type:duck_typing" }),
180+
new(new[] { "integration_name:otel", "error_type:invoker" }),
181+
new(new[] { "integration_name:otel", "error_type:execution" }),
182182
new(new[] { "integration_name:pathtraversal", "error_type:duck_typing" }),
183183
new(new[] { "integration_name:pathtraversal", "error_type:invoker" }),
184184
new(new[] { "integration_name:pathtraversal", "error_type:execution" }),

tracer/src/Datadog.Trace/Generated/netstandard2.0/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/CiVisibilityMetricsTelemetryCollector_CountShared.g.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,9 @@ private static AggregatedMetric[] GetCountSharedBuffer()
176176
new(new[] { "integration_name:symmetricalgorithm", "error_type:duck_typing" }),
177177
new(new[] { "integration_name:symmetricalgorithm", "error_type:invoker" }),
178178
new(new[] { "integration_name:symmetricalgorithm", "error_type:execution" }),
179-
new(new[] { "integration_name:opentelemetry", "error_type:duck_typing" }),
180-
new(new[] { "integration_name:opentelemetry", "error_type:invoker" }),
181-
new(new[] { "integration_name:opentelemetry", "error_type:execution" }),
179+
new(new[] { "integration_name:otel", "error_type:duck_typing" }),
180+
new(new[] { "integration_name:otel", "error_type:invoker" }),
181+
new(new[] { "integration_name:otel", "error_type:execution" }),
182182
new(new[] { "integration_name:pathtraversal", "error_type:duck_typing" }),
183183
new(new[] { "integration_name:pathtraversal", "error_type:invoker" }),
184184
new(new[] { "integration_name:pathtraversal", "error_type:execution" }),

tracer/src/Datadog.Trace/Generated/netstandard2.0/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/MetricsTelemetryCollector_Count.g.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private static AggregatedMetric[] GetCountBuffer()
7777
new(new[] { "integration_name:process" }),
7878
new(new[] { "integration_name:hashalgorithm" }),
7979
new(new[] { "integration_name:symmetricalgorithm" }),
80-
new(new[] { "integration_name:opentelemetry" }),
80+
new(new[] { "integration_name:otel" }),
8181
new(new[] { "integration_name:pathtraversal" }),
8282
new(new[] { "integration_name:ssrf" }),
8383
new(new[] { "integration_name:ldap" }),
@@ -498,7 +498,7 @@ private static AggregatedMetric[] GetCountBuffer()
498498
new(new[] { "integration_name:process" }),
499499
new(new[] { "integration_name:hashalgorithm" }),
500500
new(new[] { "integration_name:symmetricalgorithm" }),
501-
new(new[] { "integration_name:opentelemetry" }),
501+
new(new[] { "integration_name:otel" }),
502502
new(new[] { "integration_name:pathtraversal" }),
503503
new(new[] { "integration_name:ssrf" }),
504504
new(new[] { "integration_name:ldap" }),

tracer/src/Datadog.Trace/Generated/netstandard2.0/Datadog.Trace.SourceGenerators/TelemetryMetricGenerator/MetricsTelemetryCollector_CountShared.g.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,9 @@ private static AggregatedMetric[] GetCountSharedBuffer()
176176
new(new[] { "integration_name:symmetricalgorithm", "error_type:duck_typing" }),
177177
new(new[] { "integration_name:symmetricalgorithm", "error_type:invoker" }),
178178
new(new[] { "integration_name:symmetricalgorithm", "error_type:execution" }),
179-
new(new[] { "integration_name:opentelemetry", "error_type:duck_typing" }),
180-
new(new[] { "integration_name:opentelemetry", "error_type:invoker" }),
181-
new(new[] { "integration_name:opentelemetry", "error_type:execution" }),
179+
new(new[] { "integration_name:otel", "error_type:duck_typing" }),
180+
new(new[] { "integration_name:otel", "error_type:invoker" }),
181+
new(new[] { "integration_name:otel", "error_type:execution" }),
182182
new(new[] { "integration_name:pathtraversal", "error_type:duck_typing" }),
183183
new(new[] { "integration_name:pathtraversal", "error_type:invoker" }),
184184
new(new[] { "integration_name:pathtraversal", "error_type:execution" }),

tracer/src/Datadog.Trace/Telemetry/Metrics/MetricTags.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ internal enum IntegrationName
239239
[Description("integration_name:process")]Process,
240240
[Description("integration_name:hashalgorithm")]HashAlgorithm,
241241
[Description("integration_name:symmetricalgorithm")]SymmetricAlgorithm,
242-
[Description("integration_name:opentelemetry")]OpenTelemetry,
242+
[Description("integration_name:otel")]OpenTelemetry, // Note: The naming of this tag value breaks the convention of using the integration name to use a standardized value
243243
[Description("integration_name:pathtraversal")]PathTraversal,
244244
[Description("integration_name:ssrf")]Ssrf,
245245
[Description("integration_name:ldap")]Ldap,

tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/Helpers/TelemetryHelper.cs

+38-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// <copyright file="TelemetryHelper.cs" company="Datadog">
1+
// <copyright file="TelemetryHelper.cs" company="Datadog">
22
// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License.
33
// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc.
44
// </copyright>
@@ -165,9 +165,45 @@ _ when data.TryGetPayload<AppIntegrationsChangedPayload>(TelemetryRequestTypes.A
165165
}
166166
}
167167

168+
var spansCreatedByIntegration = new ConcurrentDictionary<string, MetricData>();
169+
var metricsPayloads =
170+
allData
171+
.Select(
172+
data => data switch
173+
{
174+
_ when data.TryGetPayload<GenerateMetricsPayload>(TelemetryRequestTypes.GenerateMetrics) is { } p => p.Series.Where(s => s.Metric == "spans_created"),
175+
_ => null,
176+
})
177+
.Where(x => x is not null);
178+
179+
// Flatten the spans_created metrics
180+
foreach (var metricPayload in metricsPayloads)
181+
{
182+
foreach (var metricEntry in metricPayload)
183+
{
184+
spansCreatedByIntegration.TryAdd(metricEntry.Tags.First(s => s.StartsWith("integration_name:")), metricEntry);
185+
}
186+
}
187+
188+
var integrationName = integrationId.ToString();
189+
var integrationNameTagValue = integrationName switch
190+
{
191+
"OpenTelemetry" => "otel",
192+
_ => integrationName.ToLowerInvariant(),
193+
};
194+
195+
if (enabled)
196+
{
197+
spansCreatedByIntegration.Should().NotBeEmpty();
198+
199+
var spansCreated = spansCreatedByIntegration.Should().ContainKey($"integration_name:{integrationNameTagValue}").WhoseValue;
200+
spansCreated.Points.Should().NotBeEmpty();
201+
spansCreated.Points.Sum(p => p.Value).Should().BeGreaterThanOrEqualTo(1);
202+
}
203+
168204
latestIntegrations.Should().NotBeEmpty();
169205

170-
var integration = latestIntegrations.Should().ContainKey(integrationId.ToString()).WhoseValue;
206+
var integration = latestIntegrations.Should().ContainKey(integrationName).WhoseValue;
171207

172208
integration.Enabled.Should().Be(enabled, $"{integration.Name} should only be enabled if we generate a span");
173209
if (autoEnabled.HasValue)

tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/Helpers/TelemetryHelperTests.cs

+17-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Datadog.Trace.Configuration.ConfigurationSources.Telemetry;
1212
using Datadog.Trace.Configuration.Telemetry;
1313
using Datadog.Trace.Telemetry;
14+
using Datadog.Trace.Telemetry.Metrics;
1415
using Datadog.Trace.TestHelpers;
1516
using FluentAssertions;
1617
using FluentAssertions.Execution;
@@ -48,25 +49,35 @@ public TelemetryHelperTests(ITestOutputHelper output)
4849
public void AssertIntegration_HandlesMultipleTelemetryPushes()
4950
{
5051
var collector = new IntegrationTelemetryCollector();
52+
var metricsCollector = new MetricsTelemetryCollector();
5153
var telemetryData = new List<TelemetryData>();
5254

5355
collector.IntegrationRunning(IntegrationId.Aerospike);
5456

55-
telemetryData.Add(BuildTelemetryData(collector.GetData()));
57+
metricsCollector.AggregateMetrics();
58+
telemetryData.Add(BuildTelemetryData(collector.GetData(), metrics: metricsCollector.GetMetrics()));
5659

60+
// The updates to both the IntegrationTelemetryCollector and the MetricsTelemetryCollector
61+
// are typically handled by TelemetryController.IntegrationGeneratedSpan(IntegrationId),
62+
// so we simulate that here with the separate calls
5763
collector.IntegrationGeneratedSpan(IntegrationId.Aerospike);
64+
metricsCollector.RecordCountSpanCreated(IntegrationId.Aerospike.GetMetricTag());
65+
5866
collector.IntegrationRunning(IntegrationId.Couchbase);
59-
telemetryData.Add(BuildTelemetryData(collector.GetData(), sendAppStarted: false));
67+
68+
metricsCollector.AggregateMetrics();
69+
telemetryData.Add(BuildTelemetryData(collector.GetData(), metrics: metricsCollector.GetMetrics(), sendAppStarted: false));
6070

6171
collector.IntegrationRunning(IntegrationId.Kafka);
62-
collector.IntegrationGeneratedSpan(IntegrationId.Msmq);
72+
collector.IntegrationRunning(IntegrationId.Msmq);
6373
var tracerSettings = TracerSettings.Create(new()
6474
{
6575
{ ConfigurationKeys.DisabledIntegrations, $"{nameof(IntegrationId.Kafka)};{nameof(IntegrationId.Msmq)}" }
6676
});
6777

6878
collector.RecordTracerSettings(tracerSettings);
69-
telemetryData.Add(BuildTelemetryData(collector.GetData(), sendAppClosing: true));
79+
metricsCollector.AggregateMetrics();
80+
telemetryData.Add(BuildTelemetryData(collector.GetData(), metrics: metricsCollector.GetMetrics(), sendAppClosing: true));
7081

7182
using var s = new AssertionScope();
7283
TelemetryHelper.AssertIntegration(telemetryData, IntegrationId.Aerospike, enabled: true, autoEnabled: true);
@@ -150,12 +161,13 @@ public void AssertConfiguration_HandlesMultipleTelemetryPushes()
150161
private TelemetryData BuildTelemetryData(
151162
ICollection<IntegrationTelemetryData> integrations,
152163
ICollection<ConfigurationKeyValue> configuration = null,
164+
MetricResults? metrics = null,
153165
bool sendAppStarted = true,
154166
bool sendAppClosing = false)
155167
=> _dataBuilder.BuildTelemetryData(
156168
_app,
157169
_host,
158-
new TelemetryInput(configuration, null, integrations, null, null, sendAppStarted),
170+
new TelemetryInput(configuration, null, integrations, metrics, null, sendAppStarted),
159171
namingSchemeVersion: "1",
160172
sendAppClosing);
161173
}

0 commit comments

Comments
 (0)