Skip to content

Commit e371e6d

Browse files
[SqlClient] Address review feedback
- Guard setting attributes behind `IsAllDataRequested`. - Only set after any filtering decisions are made. - Only set when using the new semantic conventions. - Add test for case sensitivity pending feedback on attribute naming behaviour.
1 parent b2c48e4 commit e371e6d

File tree

6 files changed

+46
-15
lines changed

6 files changed

+46
-15
lines changed

src/OpenTelemetry.Instrumentation.EntityFrameworkCore/Implementation/EntityFrameworkDiagnosticListener.cs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,17 +125,9 @@ public override void OnEventWritten(string name, object? payload)
125125
return;
126126
}
127127

128-
object? command = null;
129-
130-
if (this.options.SetDbQueryParameters)
131-
{
132-
command = this.commandFetcher.Fetch(payload);
133-
SqlParameterProcessor.AddQueryParameters(activity, command);
134-
}
135-
136128
if (activity.IsAllDataRequested)
137129
{
138-
command ??= this.commandFetcher.Fetch(payload);
130+
var command = this.commandFetcher.Fetch(payload);
139131

140132
try
141133
{
@@ -163,6 +155,11 @@ public override void OnEventWritten(string name, object? payload)
163155
return;
164156
}
165157

158+
if (options.EmitNewAttributes && this.options.SetDbQueryParameters)
159+
{
160+
SqlParameterProcessor.AddQueryParameters(activity, command);
161+
}
162+
166163
if (this.commandTypeFetcher.Fetch(command) is CommandType commandType)
167164
{
168165
var commandText = this.commandTextFetcher.Fetch(command);

src/OpenTelemetry.Instrumentation.EntityFrameworkCore/README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,16 @@ services.AddOpenTelemetry()
140140
.AddConsoleExporter());
141141
```
142142

143+
### SetDbStatementForText
144+
145+
`SetDbStatementForText` controls whether the `db.statement` attribute is
146+
emitted. The behavior of `SetDbStatementForText` depends on the runtime used,
147+
see below for more details.
148+
149+
Query text may contain sensitive data, so when `SetDbStatementForText` is
150+
enabled the raw query text is sanitized by automatically replacing literal
151+
values with a `?` character.
152+
143153
## References
144154

145155
* [OpenTelemetry Project](https://opentelemetry.io/)

src/OpenTelemetry.Instrumentation.SqlClient/Implementation/SqlClientDiagnosticListener.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,6 @@ public override void OnEventWritten(string name, object? payload)
121121
}
122122
#endif
123123

124-
if (options.SetDbQueryParameters)
125-
{
126-
SqlParameterProcessor.AddQueryParameters(activity, command);
127-
}
128-
129124
if (activity.IsAllDataRequested)
130125
{
131126
try
@@ -146,6 +141,11 @@ public override void OnEventWritten(string name, object? payload)
146141
return;
147142
}
148143

144+
if (options.EmitNewAttributes && options.SetDbQueryParameters)
145+
{
146+
SqlParameterProcessor.AddQueryParameters(activity, command);
147+
}
148+
149149
if (this.commandTypeFetcher.TryFetch(command, out var commandType) &&
150150
this.commandTextFetcher.TryFetch(command, out var commandText))
151151
{

test/OpenTelemetry.Contrib.Shared.Tests/SqlParameterProcessorTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,16 @@ public static void HandlesMixedCommandParameters()
8989
command.Parameters.Add(new MyDbCommandParameter("foo", 1));
9090
command.Parameters.Add(new MyDbCommandParameter(2));
9191
command.Parameters.Add(new object());
92+
command.Parameters.Add(new MyDbCommandParameter("FOO", 3));
9293

9394
// Act
9495
SqlParameterProcessor.AddQueryParameters(activity, command);
9596

9697
// Assert
9798
Assert.Equal(1, activity.GetTagValue("db.query.parameter.foo"));
9899
Assert.Equal(2, activity.GetTagValue("db.query.parameter.1"));
99-
Assert.Equal(2, activity.TagObjects.Count());
100+
Assert.Equal(3, activity.GetTagValue("db.query.parameter.FOO"));
101+
Assert.Equal(3, activity.TagObjects.Count());
100102
}
101103

102104
#nullable disable

test/OpenTelemetry.Instrumentation.EntityFrameworkCore.Tests/EntityFrameworkIntegrationTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@ bool ActivityFilter(string? providerName, IDbCommand command)
310310
public async Task SuccessfulParameterizedQueryTest(string provider)
311311
{
312312
// Arrange
313+
using var scope = SemanticConventionScope.Get(useNewConventions: true);
314+
313315
var activities = new List<Activity>();
314316
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
315317
.AddInMemoryExporter(activities)

test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientIntegrationTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ public async Task SuccessfulParameterizedQueryTest()
134134
var sampler = new TestSampler();
135135
var activities = new List<Activity>();
136136

137+
using var scope = SemanticConventionScope.Get(useNewConventions: true);
138+
137139
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
138140
.SetSampler(sampler)
139141
.AddInMemoryExporter(activities)
@@ -299,4 +301,22 @@ private string GetConnectionString()
299301
_ => throw new InvalidOperationException($"Container type '${this.fixture.DatabaseContainer.GetType().Name}' is not supported."),
300302
};
301303
}
304+
305+
private sealed class SemanticConventionScope(string? previous) : IDisposable
306+
{
307+
private const string ConventionsOptIn = "OTEL_SEMCONV_STABILITY_OPT_IN";
308+
309+
public static SemanticConventionScope Get(bool useNewConventions)
310+
{
311+
var previous = Environment.GetEnvironmentVariable(ConventionsOptIn);
312+
313+
Environment.SetEnvironmentVariable(
314+
ConventionsOptIn,
315+
useNewConventions ? "database" : string.Empty);
316+
317+
return new SemanticConventionScope(previous);
318+
}
319+
320+
public void Dispose() => Environment.SetEnvironmentVariable(ConventionsOptIn, previous);
321+
}
302322
}

0 commit comments

Comments
 (0)