From c3e5afc808789e4a18ff939f5c3e426313d06087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Kie=C5=82kowicz?= Date: Tue, 13 Jan 2026 09:26:12 +0100 Subject: [PATCH 1/3] [SqlClient] Instrumentation reports telemetry schema URL v1.33.0 --- .../SqlClientDiagnosticListener.cs | 16 +++---- .../SqlEventSourceListener.netfx.cs | 14 +++--- ...ySourceHelper.cs => SqlTelemetryHelper.cs} | 43 ++++++++++++++----- ...SqlClientMeterProviderBuilderExtensions.cs | 2 +- .../TracerProviderBuilderExtensions.cs | 2 +- .../SqlClientIntegrationTests.cs | 4 +- .../SqlClientTestCases.cs | 2 +- .../SqlClientTests.cs | 4 +- .../SqlEventSourceTests.netfx.cs | 2 +- 9 files changed, 55 insertions(+), 34 deletions(-) rename src/OpenTelemetry.Instrumentation.SqlClient/Implementation/{SqlActivitySourceHelper.cs => SqlTelemetryHelper.cs} (71%) diff --git a/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlClientDiagnosticListener.cs b/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlClientDiagnosticListener.cs index 0889fc6375..7f98866736 100644 --- a/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlClientDiagnosticListener.cs +++ b/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlClientDiagnosticListener.cs @@ -87,7 +87,7 @@ public override void OnEventWritten(string name, object? payload) _ = this.databaseFetcher.TryFetch(connection, out var databaseName); _ = this.dataSourceFetcher.TryFetch(connection, out var dataSource); - var startTags = SqlActivitySourceHelper.GetTagListFromConnectionInfo(dataSource, databaseName, out var activityName); + var startTags = SqlTelemetryHelper.GetTagListFromConnectionInfo(dataSource, databaseName, out var activityName); if (this.commandTypeFetcher.TryFetch(command, out var commandType) && this.commandTextFetcher.TryFetch(command, out var commandText)) @@ -114,7 +114,7 @@ public override void OnEventWritten(string name, object? payload) } } - activity = SqlActivitySourceHelper.ActivitySource.StartActivity( + activity = SqlTelemetryHelper.ActivitySource.StartActivity( activityName, ActivityKind.Client, default(ActivityContext), @@ -207,7 +207,7 @@ public override void OnEventWritten(string name, object? payload) return; } - if (activity.Source != SqlActivitySourceHelper.ActivitySource) + if (activity.Source != SqlTelemetryHelper.ActivitySource) { this.RecordDuration(null, payload); return; @@ -239,7 +239,7 @@ public override void OnEventWritten(string name, object? payload) return; } - if (activity.Source != SqlActivitySourceHelper.ActivitySource) + if (activity.Source != SqlTelemetryHelper.ActivitySource) { this.RecordDuration(null, payload); return; @@ -295,7 +295,7 @@ private void RecordDuration(Activity? activity, object? payload, bool hasError = if (activity != null && activity.IsAllDataRequested) { - foreach (var name in SqlActivitySourceHelper.SharedTagNames) + foreach (var name in SqlTelemetryHelper.SharedTagNames) { var value = activity.GetTagItem(name); if (value != null) @@ -312,7 +312,7 @@ private void RecordDuration(Activity? activity, object? payload, bool hasError = this.databaseFetcher.TryFetch(connection, out var databaseName); this.dataSourceFetcher.TryFetch(connection, out var dataSource); - var connectionTags = SqlActivitySourceHelper.GetTagListFromConnectionInfo( + var connectionTags = SqlTelemetryHelper.GetTagListFromConnectionInfo( dataSource, databaseName, out _); @@ -347,8 +347,8 @@ private void RecordDuration(Activity? activity, object? payload, bool hasError = } var duration = activity?.Duration.TotalSeconds - ?? SqlActivitySourceHelper.CalculateDurationFromTimestamp(this.beginTimestamp.Value); - SqlActivitySourceHelper.DbClientOperationDuration.Record(duration, tags); + ?? SqlTelemetryHelper.CalculateDurationFromTimestamp(this.beginTimestamp.Value); + SqlTelemetryHelper.DbClientOperationDuration.Record(duration, tags); } } #endif diff --git a/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlEventSourceListener.netfx.cs b/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlEventSourceListener.netfx.cs index bdd57e0aa3..785ca5a0e3 100644 --- a/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlEventSourceListener.netfx.cs +++ b/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlEventSourceListener.netfx.cs @@ -140,7 +140,7 @@ private void OnBeginExecute(EventWrittenEventArgs eventData) var dataSource = (string)eventData.Payload[1]; var databaseName = (string)eventData.Payload[2]; - var startTags = SqlActivitySourceHelper.GetTagListFromConnectionInfo(dataSource, databaseName, out var activityName); + var startTags = SqlTelemetryHelper.GetTagListFromConnectionInfo(dataSource, databaseName, out var activityName); var commandText = (string)eventData.Payload[3]; if (!string.IsNullOrEmpty(commandText)) { @@ -153,7 +153,7 @@ private void OnBeginExecute(EventWrittenEventArgs eventData) } } - var activity = SqlActivitySourceHelper.ActivitySource.StartActivity( + var activity = SqlTelemetryHelper.ActivitySource.StartActivity( activityName, ActivityKind.Client, default(ActivityContext), @@ -194,7 +194,7 @@ private void OnEndExecute(EventWrittenEventArgs eventData) // Ensure any activity that may exist due to ActivitySource.AddActivityListener() // is stopped regardless of whether we're doing metrics and/or tracing. // See https://github.com/open-telemetry/opentelemetry-dotnet-contrib/issues/3033. - var sqlActivity = currentActivity?.Source == SqlActivitySourceHelper.ActivitySource ? currentActivity : null; + var sqlActivity = currentActivity?.Source == SqlTelemetryHelper.ActivitySource ? currentActivity : null; // If we're only collecting metrics, then we don't want to modify the activity var traceActivity = @@ -242,7 +242,7 @@ private void RecordDuration(Activity? activity, EventWrittenEventArgs eventData) if (activity != null && activity.IsAllDataRequested) { - foreach (var name in SqlActivitySourceHelper.SharedTagNames) + foreach (var name in SqlTelemetryHelper.SharedTagNames) { var value = activity.GetTagItem(name); if (value != null) @@ -253,7 +253,7 @@ private void RecordDuration(Activity? activity, EventWrittenEventArgs eventData) } else { - tags.Add(SemanticConventions.AttributeDbSystemName, SqlActivitySourceHelper.MicrosoftSqlServerDbSystemName); + tags.Add(SemanticConventions.AttributeDbSystemName, SqlTelemetryHelper.MicrosoftSqlServerDbSystemName); var (hasError, errorNumber, exceptionType) = ExtractErrorFromEvent(eventData); @@ -268,8 +268,8 @@ private void RecordDuration(Activity? activity, EventWrittenEventArgs eventData) } var duration = activity?.Duration.TotalSeconds - ?? SqlActivitySourceHelper.CalculateDurationFromTimestamp(this.beginTimestamp.Value); - SqlActivitySourceHelper.DbClientOperationDuration.Record(duration, tags); + ?? SqlTelemetryHelper.CalculateDurationFromTimestamp(this.beginTimestamp.Value); + SqlTelemetryHelper.DbClientOperationDuration.Record(duration, tags); } } #endif diff --git a/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlActivitySourceHelper.cs b/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlTelemetryHelper.cs similarity index 71% rename from src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlActivitySourceHelper.cs rename to src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlTelemetryHelper.cs index 88531df4cf..4b227ab5ba 100644 --- a/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlActivitySourceHelper.cs +++ b/src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlTelemetryHelper.cs @@ -3,7 +3,6 @@ using System.Diagnostics; using System.Diagnostics.Metrics; -using System.Reflection; using OpenTelemetry.Internal; using OpenTelemetry.Trace; @@ -13,18 +12,15 @@ namespace OpenTelemetry.Instrumentation.SqlClient.Implementation; /// Helper class to hold common properties used by both SqlClientDiagnosticListener on .NET Core /// and SqlEventSourceListener on .NET Framework. /// -internal sealed class SqlActivitySourceHelper +internal sealed class SqlTelemetryHelper { public const string MicrosoftSqlServerDbSystemName = "microsoft.sql_server"; - public const string MicrosoftSqlServerDbSystem = "mssql"; - public static readonly Assembly Assembly = typeof(SqlActivitySourceHelper).Assembly; - public static readonly AssemblyName AssemblyName = Assembly.GetName(); - public static readonly string ActivitySourceName = AssemblyName.Name!; - public static readonly ActivitySource ActivitySource = new(ActivitySourceName, Assembly.GetPackageVersion()); - - public static readonly string MeterName = AssemblyName.Name!; - public static readonly Meter Meter = new(MeterName, Assembly.GetPackageVersion()); + private static readonly (ActivitySource ActivitySource, Meter Meter) Telemetry = CreateTelemetry(); +#pragma warning disable SA1202 // Elements must be ordered by accessibility. Telemetry field should be private and initialized earlier + public static readonly ActivitySource ActivitySource = Telemetry.ActivitySource; +#pragma warning restore SA1202 // Elements must be ordered by accessibility. Telemetry field should be private and initialized earlier + public static readonly Meter Meter = Telemetry.Meter; public static readonly Histogram DbClientOperationDuration = Meter.CreateHistogram( "db.client.operation.duration", @@ -78,7 +74,9 @@ public static TagList GetTagListFromConnectionInfo(string? dataSource, string? d if (activityName == MicrosoftSqlServerDbSystemName) { - activityName = connectionDetails.Port is { } portNumber ? $"{serverAddress}:{portNumber}" : serverAddress!; + activityName = connectionDetails.Port is { } portNumber + ? $"{serverAddress}:{portNumber}" + : serverAddress!; } } } @@ -105,4 +103,27 @@ internal static double CalculateDurationFromTimestamp(long begin) return duration.TotalSeconds; } + + private static (ActivitySource ActivitySource, Meter Meter) CreateTelemetry() + { + const string telemetrySchemaUrl = "https://opentelemetry.io/schemas/1.33.0"; + var assembly = typeof(SqlTelemetryHelper).Assembly; + var assemblyName = assembly.GetName(); + var name = assemblyName.Name!; + var version = assembly.GetPackageVersion(); + + var activitySourceOptions = new ActivitySourceOptions(name) + { + Version = version, + TelemetrySchemaUrl = telemetrySchemaUrl, + }; + + var meterOptions = new MeterOptions(name) + { + Version = version, + TelemetrySchemaUrl = telemetrySchemaUrl, + }; + + return (new ActivitySource(activitySourceOptions), new Meter(meterOptions)); + } } diff --git a/src/OpenTelemetry.Instrumentation.SqlClient/SqlClientMeterProviderBuilderExtensions.cs b/src/OpenTelemetry.Instrumentation.SqlClient/SqlClientMeterProviderBuilderExtensions.cs index 364cb44c20..dc017eefaa 100644 --- a/src/OpenTelemetry.Instrumentation.SqlClient/SqlClientMeterProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.Instrumentation.SqlClient/SqlClientMeterProviderBuilderExtensions.cs @@ -32,7 +32,7 @@ public static MeterProviderBuilder AddSqlClientInstrumentation(this MeterProvide return SqlClientInstrumentation.Instance.HandleManager.AddMetricHandle(); }); - builder.AddMeter(SqlActivitySourceHelper.MeterName); + builder.AddMeter(SqlTelemetryHelper.Meter.Name); return builder; } diff --git a/src/OpenTelemetry.Instrumentation.SqlClient/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry.Instrumentation.SqlClient/TracerProviderBuilderExtensions.cs index d948ce2f94..4e4c0cc70f 100644 --- a/src/OpenTelemetry.Instrumentation.SqlClient/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.Instrumentation.SqlClient/TracerProviderBuilderExtensions.cs @@ -73,7 +73,7 @@ public static TracerProviderBuilder AddSqlClientInstrumentation( return SqlClientInstrumentation.Instance.HandleManager.AddTracingHandle(); }); - builder.AddSource(SqlActivitySourceHelper.ActivitySourceName); + builder.AddSource(SqlTelemetryHelper.ActivitySource.Name); return builder; } diff --git a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientIntegrationTests.cs b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientIntegrationTests.cs index d3d42053ee..50cffe856d 100644 --- a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientIntegrationTests.cs +++ b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientIntegrationTests.cs @@ -251,7 +251,7 @@ private static void VerifyActivityData( } } - Assert.Equal(SqlActivitySourceHelper.MicrosoftSqlServerDbSystemName, activity.GetTagValue(SemanticConventions.AttributeDbSystemName)); + Assert.Equal(SqlTelemetryHelper.MicrosoftSqlServerDbSystemName, activity.GetTagValue(SemanticConventions.AttributeDbSystemName)); Assert.Equal("master", activity.GetTagValue(SemanticConventions.AttributeDbNamespace)); Assert.DoesNotContain(activity.TagObjects, tag => tag.Key.StartsWith("db.query.parameter.", StringComparison.Ordinal)); @@ -281,7 +281,7 @@ private static void VerifySamplingParameters(SamplingParameters samplingParamete samplingParameters.Tags, kvp => kvp.Key == SemanticConventions.AttributeDbSystemName && kvp.Value != null - && (string)kvp.Value == SqlActivitySourceHelper.MicrosoftSqlServerDbSystemName); + && (string)kvp.Value == SqlTelemetryHelper.MicrosoftSqlServerDbSystemName); } private string GetConnectionString() diff --git a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTestCases.cs b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTestCases.cs index 8fd9c6536b..a88f97deff 100644 --- a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTestCases.cs +++ b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTestCases.cs @@ -93,7 +93,7 @@ public class SqlClientTestCaseExpected [JsonPropertyName("db.stored_procedure.name")] public string? DbStoredProcedureName { get; set; } - public string DbSystemName { get; set; } = SqlActivitySourceHelper.MicrosoftSqlServerDbSystemName; + public string DbSystemName { get; set; } = SqlTelemetryHelper.MicrosoftSqlServerDbSystemName; [JsonPropertyName("error.type")] public string? ErrorType { get; set; } diff --git a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTests.cs b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTests.cs index 186aa9e72d..f5d24dc73d 100644 --- a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTests.cs +++ b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTests.cs @@ -62,7 +62,7 @@ public void SqlClientAddsConnectionLevelAttributes( string? expectedServerIpAddress, int? expectedPort) { - var tags = SqlActivitySourceHelper.GetTagListFromConnectionInfo(dataSource, databaseName: null, out var _); + var tags = SqlTelemetryHelper.GetTagListFromConnectionInfo(dataSource, databaseName: null, out var _); Assert.Equal(expectedServerHostName ?? expectedServerIpAddress, tags.FirstOrDefault(x => x.Key == SemanticConventions.AttributeServerAddress).Value); Assert.Equal(expectedPort, tags.FirstOrDefault(x => x.Key == SemanticConventions.AttributeServerPort).Value); } @@ -168,7 +168,7 @@ private static void VerifySamplingParameters(SqlClientTestCase testCase, Samplin samplingParameters.Tags, kvp => kvp.Key == SemanticConventions.AttributeDbSystemName && kvp.Value is string - && (string)kvp.Value == SqlActivitySourceHelper.MicrosoftSqlServerDbSystemName); + && (string)kvp.Value == SqlTelemetryHelper.MicrosoftSqlServerDbSystemName); if (testCase.Expected.DbNamespace != null) { diff --git a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs index 62080ee2d9..80eb8d9d80 100644 --- a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs +++ b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs @@ -227,7 +227,7 @@ private static void VerifyActivityData( Assert.Equal(connectionDetails.Port, activity.GetTagValue(SemanticConventions.AttributeServerPort)); } - Assert.Equal(SqlActivitySourceHelper.MicrosoftSqlServerDbSystemName, activity.GetTagValue(SemanticConventions.AttributeDbSystemName)); + Assert.Equal(SqlTelemetryHelper.MicrosoftSqlServerDbSystemName, activity.GetTagValue(SemanticConventions.AttributeDbSystemName)); Assert.Equal("instanceName.master", activity.GetTagValue(SemanticConventions.AttributeDbNamespace)); Assert.Equal(commandText, activity.GetTagValue(SemanticConventions.AttributeDbQueryText)); From 6fe5b7c9a28702e8112d455626f29488cafbbcdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Kie=C5=82kowicz?= Date: Tue, 13 Jan 2026 09:33:05 +0100 Subject: [PATCH 2/3] CHANGELOG --- src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md index c4e39eeb69..0c8e092f39 100644 --- a/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md @@ -26,6 +26,9 @@ [semantic conventions](https://github.com/open-telemetry/semantic-conventions/blob/v1.33.0/docs/database/database-spans.md#span-definition). ([#3675](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3675)) +* Metrics ans spans report telemetry schema URL v1.33.0. + ([#3680](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3680)) + ## 1.14.0-beta.1 Released 2025-Nov-13 From a802ac81b9835f6658fb070417616aec68d6b6e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Kie=C5=82kowicz?= Date: Tue, 13 Jan 2026 10:49:48 +0100 Subject: [PATCH 3/3] typo fix Co-authored-by: Martin Costello --- src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md index 0c8e092f39..f1b70fa446 100644 --- a/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md @@ -26,7 +26,7 @@ [semantic conventions](https://github.com/open-telemetry/semantic-conventions/blob/v1.33.0/docs/database/database-spans.md#span-definition). ([#3675](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3675)) -* Metrics ans spans report telemetry schema URL v1.33.0. +* Metrics and spans report telemetry schema URL v1.33.0. ([#3680](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3680)) ## 1.14.0-beta.1