Skip to content

Commit

Permalink
Add db name & host to sql injected tags (#5278)
Browse files Browse the repository at this point in the history
  • Loading branch information
vandonr authored Mar 8, 2024
1 parent a8cb7e3 commit 31fa50b
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 21 deletions.
1 change: 0 additions & 1 deletion tracer/missing-nullability-files.csv
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,6 @@ src/Datadog.Trace/ContinuousProfiler/IProfilerStatus.cs
src/Datadog.Trace/ContinuousProfiler/NativeInterop.cs
src/Datadog.Trace/ContinuousProfiler/Profiler.cs
src/Datadog.Trace/ContinuousProfiler/ProfilerStatus.cs
src/Datadog.Trace/DatabaseMonitoring/DatabaseMonitoringPropagator.cs
src/Datadog.Trace/DataStreamsMonitoring/CheckpointKind.cs
src/Datadog.Trace/Debugger/ILineProbeResolver.cs
src/Datadog.Trace/Debugger/LiveDebugger.cs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ private static Scope CreateDbCommandScope(Tracer tracer, IDbCommand command, Int
}
else
{
var propagatedCommand = DatabaseMonitoringPropagator.PropagateSpanData(tracer.Settings.DbmPropagationMode, tracer.DefaultServiceName, scope.Span, integrationId, out var traceParentInjected);
var propagatedCommand = DatabaseMonitoringPropagator.PropagateSpanData(tracer.Settings.DbmPropagationMode, tracer.DefaultServiceName, tagsFromConnectionString.DbName, tagsFromConnectionString.OutHost, scope.Span, integrationId, out var traceParentInjected);
if (!string.IsNullOrEmpty(propagatedCommand))
{
command.CommandText = $"{propagatedCommand} {commandText}";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,21 @@
using Datadog.Trace.Tagging;
using Datadog.Trace.Util;

#nullable enable

namespace Datadog.Trace.DatabaseMonitoring
{
internal static class DatabaseMonitoringPropagator
{
private const string SqlCommentSpanService = "dddbs";
private const string SqlCommentRootService = "ddps";
private const string SqlCommentDbName = "dddb";
private const string SqlCommentOuthost = "ddh";
private const string SqlCommentVersion = "ddpv";
private const string SqlCommentEnv = "dde";
internal const string DbmPrefix = $"/*{SqlCommentSpanService}='";

internal static string PropagateSpanData(DbmPropagationLevel propagationStyle, string configuredServiceName, Span span, IntegrationId integrationId, out bool traceParentInjected)
internal static string PropagateSpanData(DbmPropagationLevel propagationStyle, string configuredServiceName, string? dbName, string? outhost, Span span, IntegrationId integrationId, out bool traceParentInjected)
{
traceParentInjected = false;

Expand All @@ -37,6 +41,16 @@ internal static string PropagateSpanData(DbmPropagationLevel propagationStyle, s

propagatorStringBuilder.Append(',').Append(SqlCommentRootService).Append("='").Append(Uri.EscapeDataString(configuredServiceName)).Append('\'');

if (!string.IsNullOrEmpty(dbName))
{
propagatorStringBuilder.Append(value: ',').Append(SqlCommentDbName).Append("='").Append(Uri.EscapeDataString(dbName)).Append(value: '\'');
}

if (!string.IsNullOrEmpty(outhost))
{
propagatorStringBuilder.Append(value: ',').Append(SqlCommentOuthost).Append("='").Append(Uri.EscapeDataString(outhost)).Append(value: '\'');
}

if (span.Context.TraceContext?.ServiceVersion is { } versionTag)
{
propagatorStringBuilder.Append(',').Append(SqlCommentVersion).Append("='").Append(Uri.EscapeDataString(versionTag)).Append('\'');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ public DatabaseMonitoringPropagatorTests(ITestOutputHelper output)
[InlineData("string100", SamplingPriorityValues.UserKeep, "npgsql", "", "", false)]
[InlineData("full", SamplingPriorityValues.UserKeep, "sqlite", "", "", false)]
[InlineData("disabled", SamplingPriorityValues.UserKeep, "sqlclient", "", "", false)]
[InlineData("Service", SamplingPriorityValues.AutoReject, "npgsql", "Test.Service-postgres", "/*dddbs='Test.Service-postgres',ddps='Test.Service'*/", false)]
[InlineData("full", SamplingPriorityValues.UserReject, "sqlclient", "Test.Service-sql-server", "/*dddbs='Test.Service-sql-server',ddps='Test.Service'*/", false)]
[InlineData("fUlL", SamplingPriorityValues.AutoKeep, "mysql", "Test.Service-mysql", "/*dddbs='Test.Service-mysql',ddps='Test.Service',traceparent='00-00000000000000006172c1c9a829c71c-05a5f7b5320d6e4d-01'*/", true)]
[InlineData("Service", SamplingPriorityValues.AutoReject, "npgsql", "Test.Service-postgres", "/*dddbs='Test.Service-postgres',ddps='Test.Service',dddb='MyDatabase',ddh='MyHost'*/", false)]
[InlineData("full", SamplingPriorityValues.UserReject, "sqlclient", "Test.Service-sql-server", "/*dddbs='Test.Service-sql-server',ddps='Test.Service',dddb='MyDatabase',ddh='MyHost'*/", false)]
[InlineData("fUlL", SamplingPriorityValues.AutoKeep, "mysql", "Test.Service-mysql", "/*dddbs='Test.Service-mysql',ddps='Test.Service',dddb='MyDatabase',ddh='MyHost',traceparent='00-00000000000000006172c1c9a829c71c-05a5f7b5320d6e4d-01'*/", true)]
public void ExpectedCommentInjected(string propagationMode, int? samplingPriority, string integration, string dbServiceName, string expectedComment, bool traceParentInjected)
{
DbmPropagationLevel dbmPropagationLevel;
Expand All @@ -56,45 +56,44 @@ public void ExpectedCommentInjected(string propagationMode, int? samplingPriorit
var span = _v0Tracer.StartSpan(operationName: "mysql.query", parent: SpanContext.None, serviceName: dbServiceName, traceId: (TraceId)7021887840877922076, spanId: 407003698947780173);
span.SetTraceSamplingPriority((SamplingPriority)samplingPriority.Value);

var returnedComment = DatabaseMonitoringPropagator.PropagateSpanData(dbmPropagationLevel, "Test.Service", span, integrationId, out var traceParentInjectedValue);
var returnedComment = DatabaseMonitoringPropagator.PropagateSpanData(dbmPropagationLevel, "Test.Service", "MyDatabase", "MyHost", span, integrationId, out var traceParentInjectedValue);

traceParentInjectedValue.Should().Be(traceParentInjected);
returnedComment.Should().Be(expectedComment);
}

[Theory]

[InlineData("/*dddbs='Test.Service-mysql',dde='testing',ddps='Test.Service',ddpv='1.0.0'*/", "testing", "1.0.0")]
[InlineData("/*dddbs='Test.Service-mysql',ddps='Test.Service',ddpv='1.0.0'*/", null, "1.0.0")]
[InlineData("/*dddbs='Test.Service-mysql',dde='testing',ddps='Test.Service'*/", "testing", null)]
[InlineData("/*dddbs='Test.Service-mysql',ddps='Test.Service'*/", null, null)]
[InlineData("/*dddbs='Test.Service-mysql',dde='testing',ddps='Test.Service',dddb='MyDatabase',ddh='MyHost',ddpv='1.0.0'*/", "testing", "1.0.0")]
[InlineData("/*dddbs='Test.Service-mysql',ddps='Test.Service',dddb='MyDatabase',ddh='MyHost',ddpv='1.0.0'*/", null, "1.0.0")]
[InlineData("/*dddbs='Test.Service-mysql',dde='testing',ddps='Test.Service',dddb='MyDatabase',ddh='MyHost'*/", "testing", null)]
[InlineData("/*dddbs='Test.Service-mysql',ddps='Test.Service',dddb='MyDatabase',ddh='MyHost'*/", null, null)]
public void ExpectedTagsInjected(string expectedComment, string env = null, string version = null)
{
var span = _v0Tracer.StartSpan(operationName: "mysql.query", parent: SpanContext.None, serviceName: "Test.Service-mysql", traceId: (TraceId)7021887840877922076, spanId: 407003698947780173);
span.Context.TraceContext.Environment = env;
span.Context.TraceContext.ServiceVersion = version;
span.SetTraceSamplingPriority(SamplingPriority.AutoKeep);

var returnedComment = DatabaseMonitoringPropagator.PropagateSpanData(DbmPropagationLevel.Service, "Test.Service", span, IntegrationId.MySql, out bool traceParentInjected);
var returnedComment = DatabaseMonitoringPropagator.PropagateSpanData(DbmPropagationLevel.Service, "Test.Service", "MyDatabase", "MyHost", span, IntegrationId.MySql, out var traceParentInjected);

// Always false since this test never runs for full mode
traceParentInjected.Should().Be(false);
returnedComment.Should().Be(expectedComment);
}

[Theory]
[InlineData("/*dddbs='Test.Service%20%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D-mysql',dde='testing',ddps='Test.Service%20%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D',ddpv='1.0.0'*/", "Test.Service !#$%&'()*+,/:;=?@[]", "testing", "1.0.0")]
[InlineData("/*dddbs='Test.Service-mysql',dde='te%23%27sti%2F%2Ang',ddps='Test.Service',ddpv='1.0.0'*/", "Test.Service", "te#'sti/*ng", "1.0.0")]
[InlineData("/*dddbs='Test.Service-mysql',dde='testing',ddps='Test.Service',ddpv='1.%2A0.0'*/", "Test.Service", "testing", "1.*0.0")]
[InlineData("/*dddbs='Test.Service%20%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D-mysql',dde='te%23%27sti%2F%2Ang',ddps='Test.Service%20%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D',ddpv='1.%2A0.0'*/", "Test.Service !#$%&'()*+,/:;=?@[]", "te#'sti/*ng", "1.*0.0")]
public void ExpectedTagsEncoded(string expectedComment, string service, string env, string version)
[InlineData("/*dddbs='Test.Service%20%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D-mysql',dde='testing',ddps='Test.Service%20%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D',dddb='My.Database%20%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D',ddh='My.Host%20%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D',ddpv='1.0.0'*/", "Test.Service !#$%&'()*+,/:;=?@[]", "My.Database !#$%&'()*+,/:;=?@[]", "My.Host !#$%&'()*+,/:;=?@[]", "testing", "1.0.0")]
[InlineData("/*dddbs='Test.Service-mysql',dde='te%23%27sti%2F%2Ang',ddps='Test.Service',ddpv='1.0.0'*/", "Test.Service", null, null, "te#'sti/*ng", "1.0.0")]
[InlineData("/*dddbs='Test.Service-mysql',dde='testing',ddps='Test.Service',ddpv='1.%2A0.0'*/", "Test.Service", "", "", "testing", "1.*0.0")]
[InlineData("/*dddbs='Test.Service%20%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D-mysql',dde='te%23%27sti%2F%2Ang',ddps='Test.Service%20%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D',dddb='My_Database',ddh='192.168.0.1',ddpv='1.%2A0.0'*/", "Test.Service !#$%&'()*+,/:;=?@[]", "My_Database", "192.168.0.1", "te#'sti/*ng", "1.*0.0")]
public void ExpectedTagsEncoded(string expectedComment, string service, string dbName, string host, string env, string version)
{
var span = _v0Tracer.StartSpan(operationName: "mysql.query", parent: SpanContext.None, serviceName: $"{service}-mysql", traceId: (TraceId)7021887840877922076, spanId: 407003698947780173);
span.Context.TraceContext.Environment = env;
span.Context.TraceContext.ServiceVersion = version;
span.SetTraceSamplingPriority(SamplingPriority.AutoKeep);

var returnedComment = DatabaseMonitoringPropagator.PropagateSpanData(DbmPropagationLevel.Service, service, span, IntegrationId.MySql, out bool traceParentInjected);
var returnedComment = DatabaseMonitoringPropagator.PropagateSpanData(DbmPropagationLevel.Service, service, dbName, host, span, IntegrationId.MySql, out var traceParentInjected);

// Always false since this test never runs for full mode
traceParentInjected.Should().Be(false);
Expand All @@ -108,14 +107,14 @@ public void ExpectedCommentInjectedV1()
var integrationId = IntegrationId.Npgsql;
var samplingPriority = SamplingPriority.AutoReject;
var dbServiceName = "Test.Service-postgres";
var expectedComment = "/*dddbs='dbname',ddps='Test.Service'*/";
var expectedComment = "/*dddbs='dbname',ddps='Test.Service',dddb='MyDatabase',ddh='MyHost'*/";
var traceParentInjected = false;
var dbName = "dbname";

var span = _v1Tracer.StartSpan(tags: new SqlV1Tags() { DbName = dbName }, operationName: "mysql.query", parent: SpanContext.None, serviceName: dbServiceName, traceId: (TraceId)7021887840877922076, spanId: 407003698947780173);
span.SetTraceSamplingPriority(samplingPriority);

var returnedComment = DatabaseMonitoringPropagator.PropagateSpanData(dbmPropagationLevel, "Test.Service", span, integrationId, out var traceParentInjectedValue);
var returnedComment = DatabaseMonitoringPropagator.PropagateSpanData(dbmPropagationLevel, "Test.Service", "MyDatabase", "MyHost", span, integrationId, out var traceParentInjectedValue);

traceParentInjectedValue.Should().Be(traceParentInjected);
returnedComment.Should().Be(expectedComment);
Expand Down

0 comments on commit 31fa50b

Please sign in to comment.