Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

## Unreleased

* Remove support for the `OTEL_SEMCONV_STABILITY_OPT_IN` configuration option.
Previously, the old conventions were emitted be default with the option to emit
the stable conventions. Now, only the stable conventions are supported.
([#3592](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3592))

## 1.14.0-beta.1

Released 2025-Nov-13
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,44 +46,25 @@ internal sealed class SqlActivitySourceHelper
SemanticConventions.AttributeServerAddress,
];

public static TagList GetTagListFromConnectionInfo(string? dataSource, string? databaseName, SqlClientTraceInstrumentationOptions options, out string activityName)
public static TagList GetTagListFromConnectionInfo(string? dataSource, string? databaseName, out string activityName)
{
activityName = options.EmitNewAttributes
? MicrosoftSqlServerDbSystemName
: MicrosoftSqlServerDbSystem;
activityName = MicrosoftSqlServerDbSystemName;

TagList tags = default;

if (options.EmitOldAttributes)
{
tags.Add(SemanticConventions.AttributeDbSystem, MicrosoftSqlServerDbSystem);
}

if (options.EmitNewAttributes)
{
tags.Add(SemanticConventions.AttributeDbSystemName, MicrosoftSqlServerDbSystemName);
}
tags.Add(SemanticConventions.AttributeDbSystemName, MicrosoftSqlServerDbSystemName);

if (dataSource != null)
{
var connectionDetails = SqlConnectionDetails.ParseFromDataSource(dataSource);

if (!string.IsNullOrEmpty(databaseName))
{
if (options.EmitOldAttributes)
{
tags.Add(SemanticConventions.AttributeDbName, databaseName);
activityName = databaseName!;
}

if (options.EmitNewAttributes)
{
var dbNamespace = !string.IsNullOrEmpty(connectionDetails.InstanceName)
? $"{connectionDetails.InstanceName}.{databaseName}" // TODO: Refactor SqlConnectionDetails to include database to avoid string allocation here.
: databaseName!;
tags.Add(SemanticConventions.AttributeDbNamespace, dbNamespace);
activityName = dbNamespace;
}
var dbNamespace = !string.IsNullOrEmpty(connectionDetails.InstanceName)
? $"{connectionDetails.InstanceName}.{databaseName}"
: databaseName!;
tags.Add(SemanticConventions.AttributeDbNamespace, dbNamespace);
activityName = dbNamespace;
}

var serverAddress = connectionDetails.ServerHostName ?? connectionDetails.ServerIpAddress;
Expand All @@ -95,36 +76,22 @@ public static TagList GetTagListFromConnectionInfo(string? dataSource, string? d
tags.Add(SemanticConventions.AttributeServerPort, port);
}

if (activityName == MicrosoftSqlServerDbSystem || activityName == MicrosoftSqlServerDbSystemName)
if (activityName == MicrosoftSqlServerDbSystemName)
{
if (connectionDetails.Port is { } portNumber)
{
activityName = $"{serverAddress}:{portNumber}"; // TODO: Another opportunity to refactor SqlConnectionDetails
activityName = $"{serverAddress}:{portNumber}";
}
else
{
activityName = serverAddress!;
}
}
}

if (options.EmitOldAttributes && !string.IsNullOrEmpty(connectionDetails.InstanceName))
{
tags.Add(SemanticConventions.AttributeDbMsSqlInstanceName, connectionDetails.InstanceName);
}
}
else if (!string.IsNullOrEmpty(databaseName))
{
if (options.EmitNewAttributes)
{
tags.Add(SemanticConventions.AttributeDbNamespace, databaseName);
}

if (options.EmitOldAttributes)
{
tags.Add(SemanticConventions.AttributeDbName, databaseName);
}

tags.Add(SemanticConventions.AttributeDbNamespace, databaseName);
activityName = databaseName!;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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, options, out var activityName);
var startTags = SqlActivitySourceHelper.GetTagListFromConnectionInfo(dataSource, databaseName, out var activityName);
activity = SqlActivitySourceHelper.ActivitySource.StartActivity(
activityName,
ActivityKind.Client,
Expand Down Expand Up @@ -145,7 +145,7 @@ public override void OnEventWritten(string name, object? payload)
return;
}

if (options.EmitNewAttributes && options.SetDbQueryParameters)
if (options.SetDbQueryParameters)
{
SqlParameterProcessor.AddQueryParameters(activity, command);
}
Expand All @@ -159,16 +159,16 @@ public override void OnEventWritten(string name, object? payload)
DatabaseSemanticConventionHelper.ApplyConventionsForStoredProcedure(
activity,
commandText,
options.EmitOldAttributes,
options.EmitNewAttributes);
emitOldAttributes: false,
emitNewAttributes: true);
break;

case CommandType.Text:
DatabaseSemanticConventionHelper.ApplyConventionsForQueryText(
activity,
commandText,
options.EmitOldAttributes,
options.EmitNewAttributes);
emitOldAttributes: false,
emitNewAttributes: true);
break;

case CommandType.TableDirect:
Expand Down Expand Up @@ -322,7 +322,6 @@ private void RecordDuration(Activity? activity, object? payload, bool hasError =
var connectionTags = SqlActivitySourceHelper.GetTagListFromConnectionInfo(
dataSource,
databaseName,
SqlClientInstrumentation.TracingOptions,
out _);

foreach (var tag in connectionTags)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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, options, out var activityName);
var startTags = SqlActivitySourceHelper.GetTagListFromConnectionInfo(dataSource, databaseName, out var activityName);
var activity = SqlActivitySourceHelper.ActivitySource.StartActivity(
activityName,
ActivityKind.Client,
Expand All @@ -160,19 +160,11 @@ private void OnBeginExecute(EventWrittenEventArgs eventData)
if (!string.IsNullOrEmpty(commandText))
{
var sqlStatementInfo = SqlProcessor.GetSanitizedSql(commandText);
if (options.EmitOldAttributes)
activity.SetTag(SemanticConventions.AttributeDbQueryText, sqlStatementInfo.SanitizedSql);
if (!string.IsNullOrEmpty(sqlStatementInfo.DbQuerySummary))
{
activity.SetTag(SemanticConventions.AttributeDbStatement, sqlStatementInfo.SanitizedSql);
}

if (options.EmitNewAttributes)
{
activity.SetTag(SemanticConventions.AttributeDbQueryText, sqlStatementInfo.SanitizedSql);
if (!string.IsNullOrEmpty(sqlStatementInfo.DbQuerySummary))
{
activity.SetTag(SemanticConventions.AttributeDbQuerySummary, sqlStatementInfo.DbQuerySummary);
activity.DisplayName = sqlStatementInfo.DbQuerySummary;
}
activity.SetTag(SemanticConventions.AttributeDbQuerySummary, sqlStatementInfo.DbQuerySummary);
activity.DisplayName = sqlStatementInfo.DbQuerySummary;
}
}
}
Expand Down Expand Up @@ -264,17 +256,7 @@ private void RecordDuration(Activity? activity, EventWrittenEventArgs eventData)
}
else
{
var options = SqlClientInstrumentation.TracingOptions;

if (options.EmitOldAttributes)
{
tags.Add(SemanticConventions.AttributeDbSystem, SqlActivitySourceHelper.MicrosoftSqlServerDbSystem);
}

if (options.EmitNewAttributes)
{
tags.Add(SemanticConventions.AttributeDbSystemName, SqlActivitySourceHelper.MicrosoftSqlServerDbSystemName);
}
tags.Add(SemanticConventions.AttributeDbSystemName, SqlActivitySourceHelper.MicrosoftSqlServerDbSystemName);

var (hasError, errorNumber, exceptionType) = ExtractErrorFromEvent(eventData);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
#if NET
using OpenTelemetry.Instrumentation.SqlClient.Implementation;
#endif
using static OpenTelemetry.Internal.DatabaseSemanticConventionHelper;

namespace OpenTelemetry.Instrumentation.SqlClient;

Expand All @@ -33,10 +32,6 @@ public SqlClientTraceInstrumentationOptions()

internal SqlClientTraceInstrumentationOptions(IConfiguration configuration)
{
var databaseSemanticConvention = GetSemanticConventionOptIn(configuration);
this.EmitOldAttributes = databaseSemanticConvention.HasFlag(DatabaseSemanticConvention.Old);
this.EmitNewAttributes = databaseSemanticConvention.HasFlag(DatabaseSemanticConvention.New);

#if NET
Debug.Assert(configuration != null, "configuration was null");

Expand Down Expand Up @@ -127,16 +122,6 @@ internal SqlClientTraceInstrumentationOptions(IConfiguration configuration)
internal bool SetDbQueryParameters { get; set; }
#endif

/// <summary>
/// Gets or sets a value indicating whether the old database attributes should be emitted.
/// </summary>
internal bool EmitOldAttributes { get; set; }

/// <summary>
/// Gets or sets a value indicating whether the new database attributes should be emitted.
/// </summary>
internal bool EmitNewAttributes { get; set; }

#if NET
/// <summary>
/// Gets or sets a value indicating whether to send traceparent information to SQL Server database.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,18 +221,10 @@ private static void VerifyActivityData(
string? commandText,
bool isFailure,
bool recordException,
Activity activity,
bool emitOldAttributes = true,
bool emitNewAttributes = false)
Activity activity)
{
if (emitNewAttributes)
{
Assert.Equal("MSSQLLocalDB.master", activity.DisplayName);
}
else
{
Assert.Equal("master", activity.DisplayName);
}
var dbQuerySummary = activity.GetTagValue(SemanticConventions.AttributeDbQuerySummary);
Assert.Equal(dbQuerySummary, activity.DisplayName);

Assert.Equal(ActivityKind.Client, activity.Kind);

Expand All @@ -258,47 +250,19 @@ private static void VerifyActivityData(
}
}

if (emitOldAttributes)
{
Assert.Equal(SqlActivitySourceHelper.MicrosoftSqlServerDbSystem, activity.GetTagValue(SemanticConventions.AttributeDbSystem));
Assert.Equal("master", activity.GetTagValue(SemanticConventions.AttributeDbName));
}

if (emitNewAttributes)
{
Assert.Equal(SqlActivitySourceHelper.MicrosoftSqlServerDbSystemName, activity.GetTagValue(SemanticConventions.AttributeDbSystemName));
Assert.Equal("MSSQLLocalDB.master", activity.GetTagValue(SemanticConventions.AttributeDbNamespace));
}
Assert.Equal(SqlActivitySourceHelper.MicrosoftSqlServerDbSystemName, activity.GetTagValue(SemanticConventions.AttributeDbSystemName));
Assert.Equal("master", activity.GetTagValue(SemanticConventions.AttributeDbNamespace));
Comment thread
martincostello marked this conversation as resolved.

Assert.DoesNotContain(activity.TagObjects, tag => tag.Key.StartsWith("db.query.parameter.", StringComparison.Ordinal));
Assert.DoesNotContain(activity.Tags, tag => tag.Key.StartsWith("db.query.parameter.", StringComparison.Ordinal));

switch (commandType)
{
case CommandType.StoredProcedure:
if (emitOldAttributes)
{
Assert.Equal(commandText, activity.GetTagValue(SemanticConventions.AttributeDbStatement));
}

if (emitNewAttributes)
{
Assert.Equal(commandText, activity.GetTagValue(SemanticConventions.AttributeDbStoredProcedureName));
}

Assert.Equal(commandText, activity.GetTagValue(SemanticConventions.AttributeDbStoredProcedureName));
break;

case CommandType.Text:
if (emitOldAttributes)
{
Assert.Equal(commandText, activity.GetTagValue(SemanticConventions.AttributeDbStatement));
}

if (emitNewAttributes)
{
Assert.Equal(commandText, activity.GetTagValue(SemanticConventions.AttributeDbQueryText));
}

Assert.Equal(commandText, activity.GetTagValue(SemanticConventions.AttributeDbQueryText));
break;
case CommandType.TableDirect:
Assert.Fail("Not supported command type: CommandType.TableDirect");
Expand All @@ -314,9 +278,9 @@ private static void VerifySamplingParameters(SamplingParameters samplingParamete
Assert.NotNull(samplingParameters.Tags);
Assert.Contains(
samplingParameters.Tags,
kvp => kvp.Key == SemanticConventions.AttributeDbSystem
kvp => kvp.Key == SemanticConventions.AttributeDbSystemName
&& kvp.Value != null
&& (string)kvp.Value == SqlActivitySourceHelper.MicrosoftSqlServerDbSystem);
&& (string)kvp.Value == SqlActivitySourceHelper.MicrosoftSqlServerDbSystemName);
}

private string GetConnectionString()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@ public class SqlClientTestCase
public SqlClientTestCaseExpected Expected { get; set; } = new();

public SqlClientTestCaseExpected ExpectedNetFramework { get; set; } = new();

public SqlClientTestCaseOldConventions ExpectedOldConventions { get; set; } = new();
}

public class SqlClientTestCaseInput
Expand Down Expand Up @@ -108,20 +106,4 @@ public class SqlClientTestCaseExpected

public string SpanName { get; set; } = string.Empty;
}

public class SqlClientTestCaseOldConventions
{
[JsonPropertyName("db.mssql.instance_name")]
public string? DbMsSqlInstanceName { get; set; }

[JsonPropertyName("db.name")]
public string? DbName { get; set; }

public string DbSystem { get; set; } = SqlActivitySourceHelper.MicrosoftSqlServerDbSystem;

[JsonPropertyName("db.statement")]
public string? DbStatement { get; set; }

public string SpanName { get; set; } = string.Empty;
}
#pragma warning restore SA1402 // File may only contain a single type
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,6 @@
"db.query.text": "select * from sys.databases",
"db.stored_procedure.name": null,
"spanName": "select sys.databases"
},
"expectedOldConventions": {
"db.mssql.instance_name": "MSSQLLocalDB",
"db.name": "master",
"db.statement": "select * from sys.databases",
"spanName": "master"
}
},
{
Expand Down Expand Up @@ -61,12 +55,6 @@
"db.query.text": "SP_GetOrders",
"db.stored_procedure.name": null,
"spanName": "MSSQLLocalDB.master"
},
"expectedOldConventions": {
"db.mssql.instance_name": "MSSQLLocalDB",
"db.name": "master",
"db.statement": "SP_GetOrders",
"spanName": "master"
}
},
{
Expand Down Expand Up @@ -96,12 +84,6 @@
"db.query.text": "select * from sys.databases",
"db.stored_procedure.name": null,
"spanName": "select sys.databases"
},
"expectedOldConventions": {
"db.mssql.instance_name": "MSSQLLocalDB",
"db.name": "master",
"db.statement": "select * from sys.databases",
"spanName": "master"
}
}
]
Loading