Skip to content

Adds Tracer Side SQL Query Obfuscator#2498

Merged
link04 merged 13 commits into
masterfrom
maximo/sql-span-obfuscator
Apr 11, 2022
Merged

Adds Tracer Side SQL Query Obfuscator#2498
link04 merged 13 commits into
masterfrom
maximo/sql-span-obfuscator

Conversation

@link04

@link04 link04 commented Feb 23, 2022

Copy link
Copy Markdown
Contributor

Summary of changes

This is a mock PR Based from Tony's CI App branch, the new changes are the implementation of an Obfuscator for SQL queries based on what the Java tracer currently supports.

Reason for change

To help reduce overhead on the work the Trace Agent does.

Implementation details

Still need to add the obfuscation processor and in the meantime added the method to obfuscate queries and related queries tests.

@link04
link04 requested review from a team as code owners February 23, 2022 23:24
Comment thread tracer/src/Datadog.Trace/Configuration/ConfigurationKeys.cs
Comment thread tracer/src/Datadog.Trace/ExtensionMethods/StringExtensions.cs Outdated
Comment thread tracer/src/Datadog.Trace/Span.cs
Comment thread tracer/src/Datadog.Trace/TraceProcessors/TraceUtil.cs Outdated
@link04
link04 changed the base branch from master to tony/agentless-poc February 24, 2022 15:58
@lucaspimentel
lucaspimentel requested a review from a team February 24, 2022 16:10
@andrewlock

This comment has been minimized.

@andrewlock

This comment has been minimized.

@kevingosse kevingosse left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't fully reviewed the code yet. I think it needs to be rewritten to directly manipulate the chars rather than encoding to UTF-8 bytes.

Comment on lines +27 to +40
char[] byteArray1 = new char[13] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+', '.' };
char[] byteArray2 = new char[4] { ',', '(', ')', '|' };

for (int i = 0; i < byteArray1.Length; ++i)
{
int unsigned = byteArray1[i] & 0xFF;
numericLiteralPrefix.Set(unsigned, true);
}

for (int i = 0; i < byteArray2.Length; ++i)
{
int unsigned = byteArray2[i] & 0xFF;
splitters.Set(unsigned, true);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the &0xFF is needed in the Java version of the code because java bytes are signed, but this is not needed here (char is unsigned).
Also, there is an implicit cast from char to int.
Finally, you shouldn't name them "byteArray" since they're char arrays 😉

Suggested change
char[] byteArray1 = new char[13] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+', '.' };
char[] byteArray2 = new char[4] { ',', '(', ')', '|' };
for (int i = 0; i < byteArray1.Length; ++i)
{
int unsigned = byteArray1[i] & 0xFF;
numericLiteralPrefix.Set(unsigned, true);
}
for (int i = 0; i < byteArray2.Length; ++i)
{
int unsigned = byteArray2[i] & 0xFF;
splitters.Set(unsigned, true);
}
var charArray1 = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+', '.' };
var charArray2 = new[] { ',', '(', ')', '|' };
foreach (var c in charArray1)
{
numericLiteralPrefix.Set(c, true);
}
foreach (var c in charArray2)
{
splitters.Set(c, true);
}

Comment on lines +22 to +23
private static BitArray numericLiteralPrefix = new BitArray(255, false);
private static BitArray splitters = new BitArray(255, false);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe the size should be 256. You may encounter all values from 0 to 255 inclusive, so that's 256 different values.

Suggested change
private static BitArray numericLiteralPrefix = new BitArray(255, false);
private static BitArray splitters = new BitArray(255, false);
private static BitArray numericLiteralPrefix = new BitArray(256, false);
private static BitArray splitters = new BitArray(256, false);

Comment on lines +110 to +112
// return UTF8BytesString.create(sql, utf8);
Console.WriteLine("sql: " + sql + "utf8: " + utf8);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// return UTF8BytesString.create(sql, utf8);
Console.WriteLine("sql: " + sql + "utf8: " + utf8);

Comment on lines +113 to +120
if (utf8 is null)
{
return null;
}
else
{
return sql;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utf8 cannot be null

Suggested change
if (utf8 is null)
{
return null;
}
else
{
return sql;
}
return sql;


public static string SqlObfuscator(string sql)
{
var utf8 = Encoding.GetBytes(sql);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Java version of the code applies the filtering on the UTF8 bytes because it needs to return an UTF8BytesString (so it saves one encoding step).
Here you're returning a string, so encoding the string is just adding extra overhead. You should instead convert the string to a char array:

var str = sql.ToCharArray();

Then apply the same algorithm on the char array. Later we can even add extra logic to have that array allocated lazily

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @kevingosse thank you for the comments! In my lasted commit you can see the changes I've applied:
c6fc4e4

One thing to note is that for the IsSplitter function I end up adding a logic to return false if converting the char to bye/int leads to a value larger than the index of the array it is supposed to for the character in.

When I used to do the encoding to byte the Kanji characters there were converted to 3 different bytes [231, 189, 191] representing it, but now that we manipulate the Kanji character directly when converted to byte/int the result is [32639] and that would lead to a IndexOutOfRangeException for which I simply added the if to prevent using this large index numbers, please let me know your thoughts on that.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah that sounds correct 👍

Base automatically changed from tony/agentless-poc to master March 1, 2022 21:48
@tonyredondo

Copy link
Copy Markdown
Member

This PR needs to be rebased

@pierotibou
pierotibou force-pushed the maximo/sql-span-obfuscator branch from c6fc4e4 to ca7200c Compare March 31, 2022 11:25
@andrewlock

This comment has been minimized.

@andrewlock

This comment has been minimized.

@kevingosse kevingosse left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM + a few minor changes. Great work!

var splitterBytes = FindSplitterPositions(sqlChars);
var outputLength = sqlChars.Length;
var end = outputLength;
var start = end > 0 ? PreviousSetBit(splitterBytes, end - 1) : -1;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NIT: end == 0 means that the string is empty. We should probably check this at the very beginning of the method and exit early when that happens

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Earlier I added the logic to not even call the method if the string was empty on the ObfuscatorTraceProcessor.cs file instead: https://github.com/DataDog/dd-trace-dotnet/pull/2498/files#diff-35a4636a4a751afda8b9ae23ab84ccc0f42591704b2ed3d70a6289ad902e42a3R50-R53

Is that good or should I moved it to the method instead as we expect most strings to not be empty anyways?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, it gives the same result. Checking this here seem better as you don't ask the caller to do it.

Comment thread tracer/src/Datadog.Trace/Processors/Obfuscator.cs Outdated
Comment thread tracer/src/Datadog.Trace/Processors/Obfuscator.cs Outdated
@andrewlock

This comment has been minimized.

@andrewlock

This comment has been minimized.

@pierotibou pierotibou left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With one nit and a question on the commented utest.
Also, could you rename the PR title to make it more readable (titles go into release notes)?

var splitterBytes = FindSplitterPositions(sqlChars);
var outputLength = sqlChars.Length;
var end = outputLength;
var start = end > 0 ? PreviousSetBit(splitterBytes, end - 1) : -1;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, it gives the same result. Checking this here seem better as you don't ask the caller to do it.

Comment thread tracer/src/Datadog.Trace/Processors/ObfuscatorTraceProcessor.cs
Comment thread tracer/test/Datadog.Trace.Tests/TraceProcessors/ObfuscatorTraceProcessorTests.cs Outdated
Comment thread tracer/src/Datadog.Trace/Processors/Obfuscator.cs Outdated
@link04 link04 changed the title Maximo/sql span obfuscator Adds Tracer Side SQL Query Obfuscator Apr 6, 2022
@andrewlock

This comment has been minimized.

@andrewlock

This comment has been minimized.

@pierotibou pierotibou left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A very small nit.
Besides that, looks good. Great job! And thanks a lot

if (span.Type == "sql" || span.Type == "cassandra")
{
span.ResourceName = ObfuscateSqlResource(span.ResourceName);
span.ResourceName = SqlObfuscator(span.ResourceName);

@pierotibou pierotibou Apr 8, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpicking again - (and clearly don't mind me)
But as it's not a class, but a function I'd change that to a verb. So ObfuscateSql or ObfuscateSqlResource would be better IMO

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TIL, yeah that does make, sense, made the new commits, will wait for the checks to run so I can merge.

link04 added 2 commits April 8, 2022 14:05
Change function name from `SqlObfuscator` to `ObfuscateSqlResource`.
@pierotibou
pierotibou removed the request for review from a team April 8, 2022 18:16
@andrewlock

Copy link
Copy Markdown
Member

Code Coverage Report 📊

✔️ Merging #2498 into master will not change line coverage
✔️ Merging #2498 into master will not change branch coverage
⛔ Merging #2498 into master will will increase complexity by 65

master #2498 Change
Lines 13438 / 18464 13510 / 18553
Lines % 73% 73% 0% ✔️
Branches 7754 / 11017 7821 / 11073
Branches % 70% 71% 0% ✔️
Complexity 12307 12372 65

View the full report for further details:

Datadog.Trace Breakdown ✔️

master #2498 Change
Lines % 73% 73% 0% ✔️
Branches % 70% 71% 0% ✔️
Complexity 12307 12372 65

The following classes have significant coverage changes.

File Line coverage change Branch coverage change Complexity change
Datadog.Trace.Telemetry.JsonWebRequestTelemetryTransport 27% ✔️ 57% ✔️ 0 ✔️

The following classes were added in #2498:

File Line coverage Branch coverage Complexity
Datadog.Trace.TraceProcessors.ObfuscatorTraceProcessor 81% 84% 59

View the full reports for further details:

@andrewlock

Copy link
Copy Markdown
Member

Benchmarks Report 🐌

Benchmarks for #2498 compared to master:

  • 1 benchmarks are slower, with geometric mean 1.181
  • All benchmarks have the same allocations

The following thresholds were used for comparing the benchmark speeds:

  • Mann–Whitney U test with statistical test for significance of 5%
  • Only results indicating a difference greater than 10% and 0.3 ns are considered.

Allocation changes below 0.5% are ignored.

Benchmark details

Benchmarks.Trace.AgentWriterBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master WriteAndFlushEnrichedTraces net472 914μs 3.17μs 11.9μs 0 0 0 3.16 KB
master WriteAndFlushEnrichedTraces netcoreapp3.1 704μs 1.96μs 7.57μs 0 0 0 2.57 KB
#2498 WriteAndFlushEnrichedTraces net472 913μs 3.6μs 14.4μs 0 0 0 3.16 KB
#2498 WriteAndFlushEnrichedTraces netcoreapp3.1 697μs 3.4μs 13.6μs 0 0 0 2.57 KB
Benchmarks.Trace.AppSecBodyBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master AllCycleSimpleBody net472 290ns 1.05ns 4.05ns 0.052 0 0 329 B
master AllCycleSimpleBody netcoreapp3.1 366ns 1.48ns 5.55ns 0.00449 0 0 328 B
master AllCycleMoreComplexBody net472 299ns 1.7ns 11.4ns 0.0481 0 0 305 B
master AllCycleMoreComplexBody netcoreapp3.1 354ns 1.04ns 4.04ns 0.00407 0 0 304 B
master BodyExtractorSimpleBody net472 469ns 7.02ns 70.2ns 0.0569 0 0 361 B
master BodyExtractorSimpleBody netcoreapp3.1 429ns 1.96ns 7.32ns 0.00376 0 0 272 B
master BodyExtractorMoreComplexBody net472 23.9μs 115ns 673ns 1.18 0.0119 0 7.62 KB
master BodyExtractorMoreComplexBody netcoreapp3.1 21.5μs 90.7ns 351ns 0.0955 0 0 6.75 KB
#2498 AllCycleSimpleBody net472 291ns 1.03ns 3.84ns 0.0521 0 0 329 B
#2498 AllCycleSimpleBody netcoreapp3.1 378ns 2.18ns 18.9ns 0.00446 0 0 328 B
#2498 AllCycleMoreComplexBody net472 283ns 0.772ns 2.67ns 0.0482 0 0 305 B
#2498 AllCycleMoreComplexBody netcoreapp3.1 365ns 1.67ns 7.99ns 0.00424 0 0 304 B
#2498 BodyExtractorSimpleBody net472 421ns 1.39ns 5.39ns 0.057 0 0 361 B
#2498 BodyExtractorSimpleBody netcoreapp3.1 439ns 1.97ns 7.62ns 0.00369 0 0 272 B
#2498 BodyExtractorMoreComplexBody net472 23.8μs 117ns 481ns 1.19 0.0117 0 7.62 KB
#2498 BodyExtractorMoreComplexBody netcoreapp3.1 21.4μs 60.7ns 235ns 0.0942 0 0 6.75 KB
Benchmarks.Trace.AspNetCoreBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendRequest net472 0ns 0ns 0ns 0 0 0 0 b
master SendRequest netcoreapp3.1 307μs 1.67μs 10.6μs 0.153 0 0 19.74 KB
#2498 SendRequest net472 0ns 0ns 0ns 0 0 0 0 b
#2498 SendRequest netcoreapp3.1 294μs 1.37μs 5.66μs 0.15 0 0 19.74 KB
Benchmarks.Trace.DbCommandBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master ExecuteNonQuery net472 1.81μs 6.49ns 24.3ns 0.0943 0.000943 0 594 B
master ExecuteNonQuery netcoreapp3.1 1.55μs 8.24ns 52.1ns 0.00879 0 0 632 B
#2498 ExecuteNonQuery net472 1.77μs 8.46ns 37.8ns 0.0938 0.000852 0 594 B
#2498 ExecuteNonQuery netcoreapp3.1 1.46μs 6.69ns 46.8ns 0.00884 0 0 632 B
Benchmarks.Trace.ElasticsearchBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master CallElasticsearch net472 2.79μs 15.2ns 88.5ns 0.127 0 0 803 B
master CallElasticsearch netcoreapp3.1 1.65μs 3.29ns 11.4ns 0.0111 0 0 792 B
master CallElasticsearchAsync net472 3.01μs 17.1ns 121ns 0.147 0 0 939 B
master CallElasticsearchAsync netcoreapp3.1 1.82μs 9.02ns 37.2ns 0.0125 0 0 912 B
#2498 CallElasticsearch net472 2.72μs 14.2ns 69.5ns 0.127 0 0 803 B
#2498 CallElasticsearch netcoreapp3.1 1.69μs 9.21ns 58.2ns 0.0113 0 0 792 B
#2498 CallElasticsearchAsync net472 2.98μs 15.3ns 114ns 0.147 0 0 939 B
#2498 CallElasticsearchAsync netcoreapp3.1 1.8μs 7.31ns 28.3ns 0.0127 0 0 912 B
Benchmarks.Trace.GraphQLBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master ExecuteAsync net472 3.02μs 15.2ns 68.2ns 0.168 0.00147 0 1.06 KB
master ExecuteAsync netcoreapp3.1 2.06μs 7.46ns 28.9ns 0.0138 0 0 1.03 KB
#2498 ExecuteAsync net472 3.1μs 15ns 63.5ns 0.168 0 0 1.06 KB
#2498 ExecuteAsync netcoreapp3.1 2μs 7.31ns 26.4ns 0.0137 0 0 1.03 KB
Benchmarks.Trace.HttpClientBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendAsync net472 6.72μs 21.9ns 84.9ns 0.361 0 0 2.28 KB
master SendAsync netcoreapp3.1 4.66μs 19ns 73.6ns 0.0311 0 0 2.21 KB
#2498 SendAsync net472 6.85μs 31.2ns 112ns 0.361 0 0 2.28 KB
#2498 SendAsync netcoreapp3.1 4.85μs 24.1ns 99.5ns 0.0297 0 0 2.21 KB
Benchmarks.Trace.ILoggerBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net472 3.41μs 14.7ns 55ns 0.228 0 0 1.45 KB
master EnrichedLog netcoreapp3.1 3.13μs 14.6ns 58.4ns 0.0212 0 0 1.53 KB
#2498 EnrichedLog net472 3.32μs 8.28ns 32.1ns 0.228 0 0 1.45 KB
#2498 EnrichedLog netcoreapp3.1 3.08μs 6.88ns 25.7ns 0.0212 0 0 1.53 KB
Benchmarks.Trace.Log4netBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net472 292μs 1.39μs 5.57μs 0.312 0.156 0 4.33 KB
master EnrichedLog netcoreapp3.1 244μs 1.23μs 5.37μs 0 0 0 4.21 KB
#2498 EnrichedLog net472 303μs 1.42μs 5.49μs 0.418 0.139 0 4.33 KB
#2498 EnrichedLog netcoreapp3.1 233μs 1.19μs 5.31μs 0 0 0 4.21 KB
Benchmarks.Trace.NLogBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net472 8μs 42.5ns 217ns 0.503 0 0 3.23 KB
master EnrichedLog netcoreapp3.1 6.44μs 30.6ns 126ns 0.0507 0 0 3.6 KB
#2498 EnrichedLog net472 8.31μs 118ns 1.17μs 0.507 0 0 3.23 KB
#2498 EnrichedLog netcoreapp3.1 6.49μs 26.7ns 125ns 0.0477 0 0 3.6 KB
Benchmarks.Trace.RedisBenchmark - Slower ⚠️ Same allocations ✔️

Slower ⚠️ in #2498

Benchmark diff/base Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.RedisBenchmark.SendReceive‑netcoreapp3.1 1.181 2,083.64 2,460.30

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendReceive net472 2.45μs 13.8ns 91.7ns 0.16 0 0 1.01 KB
master SendReceive netcoreapp3.1 2.09μs 8.68ns 31.3ns 0.0138 0 0 1.01 KB
#2498 SendReceive net472 2.34μs 10.8ns 40.3ns 0.16 0.00115 0 1.01 KB
#2498 SendReceive netcoreapp3.1 2.48μs 13.9ns 96.5ns 0.0137 0 0 1.01 KB
Benchmarks.Trace.SerilogBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net472 5.9μs 31.3ns 159ns 0.292 0 0 1.87 KB
master EnrichedLog netcoreapp3.1 5.17μs 16.6ns 64.1ns 0.0204 0 0 1.49 KB
#2498 EnrichedLog net472 5.98μs 27ns 105ns 0.29 0 0 1.87 KB
#2498 EnrichedLog netcoreapp3.1 5.21μs 20.4ns 78.9ns 0.0205 0 0 1.49 KB
Benchmarks.Trace.SpanBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StartFinishSpan net472 898ns 3.86ns 14.4ns 0.0717 0 0 457 B
master StartFinishSpan netcoreapp3.1 889ns 3.93ns 14.2ns 0.00647 0 0 456 B
master StartFinishScope net472 1.12μs 4.23ns 15.8ns 0.0846 0 0 538 B
master StartFinishScope netcoreapp3.1 1.05μs 5.91ns 46.6ns 0.00802 0 0 576 B
#2498 StartFinishSpan net472 917ns 4.96ns 28.5ns 0.0718 0 0 457 B
#2498 StartFinishSpan netcoreapp3.1 930ns 5.25ns 36ns 0.00621 0 0 456 B
#2498 StartFinishScope net472 1.26μs 6.89ns 40.2ns 0.0843 0 0 538 B
#2498 StartFinishScope netcoreapp3.1 1.05μs 3ns 11.6ns 0.00793 0 0 576 B
Benchmarks.Trace.TraceAnnotationsBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master RunOnMethodBegin net472 1.27μs 6.67ns 35.3ns 0.0845 0 0 538 B
master RunOnMethodBegin netcoreapp3.1 1.19μs 6.27ns 31.4ns 0.00775 0 0 576 B
#2498 RunOnMethodBegin net472 1.3μs 7.09ns 45.4ns 0.0842 0 0 538 B
#2498 RunOnMethodBegin netcoreapp3.1 1.13μs 3.94ns 15.3ns 0.00803 0 0 576 B

@link04
link04 merged commit f689a74 into master Apr 11, 2022
@link04
link04 deleted the maximo/sql-span-obfuscator branch April 11, 2022 04:53
@github-actions github-actions Bot added this to the vNext milestone Apr 11, 2022
@andrewlock andrewlock added the area:tracer The core tracer library (Datadog.Trace, does not include OpenTracing, native code, or integrations) label Apr 22, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:tracer The core tracer library (Datadog.Trace, does not include OpenTracing, native code, or integrations)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants