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
3 changes: 3 additions & 0 deletions src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 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

Released 2025-Nov-13
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, 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))
Expand All @@ -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),
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -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 _);
Expand Down Expand Up @@ -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
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, out var activityName);
var startTags = SqlTelemetryHelper.GetTagListFromConnectionInfo(dataSource, databaseName, out var activityName);
var commandText = (string)eventData.Payload[3];
if (!string.IsNullOrEmpty(commandText))
{
Expand All @@ -153,7 +153,7 @@ private void OnBeginExecute(EventWrittenEventArgs eventData)
}
}

var activity = SqlActivitySourceHelper.ActivitySource.StartActivity(
var activity = SqlTelemetryHelper.ActivitySource.StartActivity(
activityName,
ActivityKind.Client,
default(ActivityContext),
Expand Down Expand Up @@ -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 =
Expand Down Expand Up @@ -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)
Expand All @@ -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);

Expand All @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

using System.Diagnostics;
using System.Diagnostics.Metrics;
using System.Reflection;
using OpenTelemetry.Internal;
using OpenTelemetry.Trace;

Expand All @@ -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.
/// </summary>
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<double> DbClientOperationDuration = Meter.CreateHistogram(
"db.client.operation.duration",
Expand Down Expand Up @@ -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!;
}
}
}
Expand All @@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public static TracerProviderBuilder AddSqlClientInstrumentation(
return SqlClientInstrumentation.Instance.HandleManager.AddTracingHandle();
});

builder.AddSource(SqlActivitySourceHelper.ActivitySourceName);
builder.AddSource(SqlTelemetryHelper.ActivitySource.Name);

return builder;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand Down