Skip to content

Update language used in native log messages#7467

Merged
andrewlock merged 4 commits intomasterfrom
andrew/update-native-logs
Sep 5, 2025
Merged

Update language used in native log messages#7467
andrewlock merged 4 commits intomasterfrom
andrew/update-native-logs

Conversation

@andrewlock
Copy link
Member

@andrewlock andrewlock commented Sep 4, 2025

Summary of changes

Updates some of the language used in native logs to avoid ambiguous use of Profiler

Reason for change

Profiler is tricky. We use the .NET profiling APIs for all our native functionality, so our native components are technically all "profilers". But this is ambiguous with the Continuous Profiler product, and can often confuse both customers and support.

To reduce confusion, we should aim to avoid using "Profiler" to refer to the native components where possible. In particular

  • Inside the native loader, when we disable the whole product, use Datadog SDK
    • e.g. The Datadog SDK has been disabled
  • Always refer to the Continuous Profiler as Continuous Profiler
    • e.g. The Continuous Profiler has been disabled
  • Refer to the native tracer as either Instrumentation or Instrumentation component as appropriate
    • e.g. Instrumentation has been disabled or The Instrumentation component failed to initialize
  • Don't refer to the "managed profiler", instead use Datadog.Trace.dll (I hope it's not necessary to refer to the Datadog.Trace.ClrProfiler.Managed.Loader.dll 😅)
    • e.g. Unable to initialize: Datadog.Trace.dll was not yet loaded into the App Domain

Note that we're primarily concerned with the "high level" log messages which are "customer facing". See other details for exceptions

Implementation details

Updated the logs in the native loader and native tracer in line with this guidance. I'm assuming the CP already follows this.

Test coverage

N/A

Other details

Note that internal/technical naming is still valid, so we still have the same distinct components, e.g.

  • Native loader
  • Native tracer
  • Managed tracer loader
  • Managed tracer
  • Libdatadog
  • Continuous Profiler

Additionally, we can still use CorProfiler / ICorProfiler / COR Profiler to refer to the specific runtime components if necessary.

@andrewlock andrewlock requested review from a team as code owners September 4, 2025 11:13
@andrewlock andrewlock added the area:native-library Automatic instrumentation native C++ code (Datadog.Trace.ClrProfiler.Native) label Sep 4, 2025
@andrewlock andrewlock requested a review from a team as a code owner September 4, 2025 11:13
@andrewlock andrewlock added the type:cleanup Minor code clean up label Sep 4, 2025
Copy link
Contributor

@daniel-romano-DD daniel-romano-DD left a comment

Choose a reason for hiding this comment

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

👌

@datadog-datadog-prod-us1
Copy link

datadog-datadog-prod-us1 bot commented Sep 4, 2025

✅ Tests

🎉 All green!

❄️ No new flaky tests detected
🧪 All tests passed

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: 81da5a8 | Docs | Was this helpful? Give us feedback!

Copy link
Member

@tonyredondo tonyredondo left a comment

Choose a reason for hiding this comment

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

LGTM,
Also, I think there's a good opportunity here to change two small nits that I hate about our current native logger:

  1. The date format: 09/04/25 04:02:45.112 PM .... can we move to the managed format: 2025-09-04 16:02:45.723 +02:00, even the tracer loader have a different format: [2025-09-04 16:02:45.289 +02:00|1|dotnet|True] and the native loader: [2025-09-04 16:02:44.924 | debug | PId: 21671 | TId: 145036748] 🤦🏻 😢
  2. Status names: [info] in the native and [INF] in the managed.

Copy link
Contributor

@zacharycmontoya zacharycmontoya left a comment

Choose a reason for hiding this comment

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

Thanks for taking the time to do this! We'll also need to update our own internal support docs with updated log lines, so team members can CTRL+F on the new debug logs

Co-authored-by: Zach Montoya <zach.montoya@datadoghq.com>
@dd-trace-dotnet-ci-bot
Copy link

dd-trace-dotnet-ci-bot bot commented Sep 4, 2025

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing the following branches/commits:

Execution-time benchmarks measure the whole time it takes to execute a program. And are intended to measure the one-off costs. Cases where the execution time results for the PR are worse than latest master results are shown in red. The following thresholds were used for comparing the execution times:

  • Welch test with statistical test for significance of 5%
  • Only results indicating a difference greater than 5% and 5 ms are considered.

Note that these results are based on a single point-in-time result for each branch. For full results, see the dashboard.

Graphs show the p99 interval based on the mean and StdDev of the test run, as well as the mean value of the run (shown as a diamond below the graph).

gantt
    title Execution time (ms) FakeDbCommand (.NET Framework 4.8) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Bailout
    This PR (7467) - mean (72ms)  : 71, 73
     .   : milestone, 72,
    master - mean (77ms)  : 73, 80
     .   : milestone, 77,

    section Baseline
    This PR (7467) - mean (69ms)  : 64, 74
     .   : milestone, 69,
    master - mean (73ms)  : 68, 79
     .   : milestone, 73,

    section CallTarget+Inlining+NGEN
    This PR (7467) - mean (990ms)  : 965, 1015
     .   : milestone, 990,
    master - mean (1,019ms)  : 1000, 1038
     .   : milestone, 1019,

Loading
gantt
    title Execution time (ms) FakeDbCommand (.NET Core 3.1) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Bailout
    This PR (7467) - mean (107ms)  : 106, 108
     .   : milestone, 107,
    master - mean (114ms)  : 110, 118
     .   : milestone, 114,

    section Baseline
    This PR (7467) - mean (106ms)  : 103, 109
     .   : milestone, 106,
    master - mean (113ms)  : 109, 117
     .   : milestone, 113,

    section CallTarget+Inlining+NGEN
    This PR (7467) - mean (699ms)  : 681, 717
     .   : milestone, 699,
    master - mean (703ms)  : 684, 723
     .   : milestone, 703,

Loading
gantt
    title Execution time (ms) FakeDbCommand (.NET 6) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Bailout
    This PR (7467) - mean (94ms)  : 93, 95
     .   : milestone, 94,
    master - mean (94ms)  : 93, 95
     .   : milestone, 94,

    section Baseline
    This PR (7467) - mean (93ms)  : 91, 96
     .   : milestone, 93,
    master - mean (94ms)  : 91, 97
     .   : milestone, 94,

    section CallTarget+Inlining+NGEN
    This PR (7467) - mean (651ms)  : 630, 671
     .   : milestone, 651,
    master - mean (657ms)  : 632, 681
     .   : milestone, 657,

Loading
gantt
    title Execution time (ms) FakeDbCommand (.NET 8) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Bailout
    This PR (7467) - mean (93ms)  : 92, 94
     .   : milestone, 93,
    master - mean (93ms)  : 92, 94
     .   : milestone, 93,

    section Baseline
    This PR (7467) - mean (92ms)  : 90, 94
     .   : milestone, 92,
    master - mean (92ms)  : 90, 94
     .   : milestone, 92,

    section CallTarget+Inlining+NGEN
    This PR (7467) - mean (589ms)  : 579, 599
     .   : milestone, 589,
    master - mean (594ms)  : 584, 605
     .   : milestone, 594,

Loading
gantt
    title Execution time (ms) HttpMessageHandler (.NET Framework 4.8) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Bailout
    This PR (7467) - mean (193ms)  : 189, 198
     .   : milestone, 193,
    master - mean (192ms)  : 187, 197
     .   : milestone, 192,

    section Baseline
    This PR (7467) - mean (189ms)  : 184, 195
     .   : milestone, 189,
    master - mean (190ms)  : 186, 194
     .   : milestone, 190,

    section CallTarget+Inlining+NGEN
    This PR (7467) - mean (1,091ms)  : 1053, 1129
     .   : milestone, 1091,
    master - mean (1,088ms)  : 1060, 1117
     .   : milestone, 1088,

Loading
gantt
    title Execution time (ms) HttpMessageHandler (.NET Core 3.1) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Bailout
    This PR (7467) - mean (276ms)  : 269, 282
     .   : milestone, 276,
    master - mean (274ms)  : 265, 283
     .   : milestone, 274,

    section Baseline
    This PR (7467) - mean (276ms)  : 271, 281
     .   : milestone, 276,
    master - mean (274ms)  : 267, 281
     .   : milestone, 274,

    section CallTarget+Inlining+NGEN
    This PR (7467) - mean (888ms)  : 849, 926
     .   : milestone, 888,
    master - mean (888ms)  : 854, 923
     .   : milestone, 888,

Loading
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Bailout
    This PR (7467) - mean (268ms)  : 264, 272
     .   : milestone, 268,
    master - mean (266ms)  : 261, 272
     .   : milestone, 266,

    section Baseline
    This PR (7467) - mean (269ms)  : 262, 275
     .   : milestone, 269,
    master - mean (265ms)  : 260, 271
     .   : milestone, 265,

    section CallTarget+Inlining+NGEN
    This PR (7467) - mean (870ms)  : 829, 911
     .   : milestone, 870,
    master - mean (867ms)  : 830, 904
     .   : milestone, 867,

Loading
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Bailout
    This PR (7467) - mean (268ms)  : 263, 272
     .   : milestone, 268,
    master - mean (265ms)  : 259, 272
     .   : milestone, 265,

    section Baseline
    This PR (7467) - mean (268ms)  : 261, 274
     .   : milestone, 268,
    master - mean (265ms)  : 259, 270
     .   : milestone, 265,

    section CallTarget+Inlining+NGEN
    This PR (7467) - mean (784ms)  : 753, 815
     .   : milestone, 784,
    master - mean (791ms)  : 766, 816
     .   : milestone, 791,

Loading

@pr-commenter
Copy link

pr-commenter bot commented Sep 4, 2025

Benchmarks

Benchmarks Report for benchmark platform 🐌

Benchmarks for #7467 compared to master:

  • 1 benchmarks are slower, with geometric mean 1.379
  • 5 benchmarks have fewer allocations
  • 5 benchmarks have more 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.ActivityBenchmark - Same speed ✔️ More allocations ⚠️

More allocations ⚠️ in #7467

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.ActivityBenchmark.StartStopWithChild‑net472 6.02 KB 6.08 KB 62 B 1.03%
Benchmarks.Trace.ActivityBenchmark.StartStopWithChild‑netcoreapp3.1 5.64 KB 5.69 KB 45 B 0.80%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StartStopWithChild net6.0 10.4μs 56.6ns 335ns 0 0 0 5.49 KB
master StartStopWithChild netcoreapp3.1 14μs 65.9ns 264ns 0 0 0 5.64 KB
master StartStopWithChild net472 22.1μs 104ns 415ns 0.903 0.113 0 6.02 KB
#7467 StartStopWithChild net6.0 10.8μs 58.4ns 314ns 0 0 0 5.49 KB
#7467 StartStopWithChild netcoreapp3.1 13.2μs 42.5ns 159ns 0 0 0 5.69 KB
#7467 StartStopWithChild net472 22.6μs 118ns 566ns 0.985 0.328 0.109 6.08 KB
Benchmarks.Trace.AgentWriterBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master WriteAndFlushEnrichedTraces net6.0 932μs 120ns 464ns 0 0 0 2.71 KB
master WriteAndFlushEnrichedTraces netcoreapp3.1 1.02ms 107ns 401ns 0 0 0 2.7 KB
master WriteAndFlushEnrichedTraces net472 1.19ms 73ns 283ns 0 0 0 3.31 KB
#7467 WriteAndFlushEnrichedTraces net6.0 929μs 105ns 393ns 0 0 0 2.71 KB
#7467 WriteAndFlushEnrichedTraces netcoreapp3.1 1.05ms 121ns 437ns 0 0 0 2.7 KB
#7467 WriteAndFlushEnrichedTraces net472 1.2ms 80.6ns 312ns 0 0 0 3.31 KB
Benchmarks.Trace.Asm.AppSecBodyBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master AllCycleSimpleBody net6.0 326μs 1.49μs 5.97μs 0 0 0 172.07 KB
master AllCycleSimpleBody netcoreapp3.1 458μs 701ns 2.72μs 0 0 0 174.18 KB
master AllCycleSimpleBody net472 427μs 170ns 659ns 29.2 0 0 194.24 KB
master AllCycleMoreComplexBody net6.0 329μs 622ns 2.33μs 0 0 0 175.58 KB
master AllCycleMoreComplexBody netcoreapp3.1 504μs 1.6μs 6.2μs 0 0 0 177.6 KB
master AllCycleMoreComplexBody net472 433μs 319ns 1.24μs 30.2 0 0 197.76 KB
master ObjectExtractorSimpleBody net6.0 322ns 1.84ns 12.9ns 0 0 0 280 B
master ObjectExtractorSimpleBody netcoreapp3.1 394ns 2.18ns 13.3ns 0 0 0 272 B
master ObjectExtractorSimpleBody net472 303ns 0.0429ns 0.166ns 0.0443 0 0 281 B
master ObjectExtractorMoreComplexBody net6.0 6.21μs 28.4ns 114ns 0 0 0 3.78 KB
master ObjectExtractorMoreComplexBody netcoreapp3.1 7.82μs 4.23ns 16.4ns 0 0 0 3.69 KB
master ObjectExtractorMoreComplexBody net472 6.77μs 1.4ns 5.06ns 0.602 0 0 3.8 KB
#7467 AllCycleSimpleBody net6.0 323μs 1.33μs 5.16μs 0 0 0 172.07 KB
#7467 AllCycleSimpleBody netcoreapp3.1 465μs 443ns 1.72μs 0 0 0 174.18 KB
#7467 AllCycleSimpleBody net472 425μs 159ns 615ns 29.2 0 0 194.24 KB
#7467 AllCycleMoreComplexBody net6.0 336μs 1.13μs 4.39μs 0 0 0 175.58 KB
#7467 AllCycleMoreComplexBody netcoreapp3.1 469μs 1.26μs 4.88μs 0 0 0 177.6 KB
#7467 AllCycleMoreComplexBody net472 433μs 175ns 677ns 30.2 0 0 197.76 KB
#7467 ObjectExtractorSimpleBody net6.0 327ns 1.72ns 8.43ns 0 0 0 280 B
#7467 ObjectExtractorSimpleBody netcoreapp3.1 400ns 2.18ns 12.9ns 0 0 0 272 B
#7467 ObjectExtractorSimpleBody net472 306ns 0.217ns 0.842ns 0.0446 0 0 281 B
#7467 ObjectExtractorMoreComplexBody net6.0 6.22μs 28.2ns 113ns 0 0 0 3.78 KB
#7467 ObjectExtractorMoreComplexBody netcoreapp3.1 7.68μs 37.4ns 163ns 0 0 0 3.69 KB
#7467 ObjectExtractorMoreComplexBody net472 6.78μs 2.35ns 9.12ns 0.577 0 0 3.8 KB
Benchmarks.Trace.Asm.AppSecEncoderBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EncodeArgs net6.0 77.6μs 186ns 721ns 0 0 0 32.4 KB
master EncodeArgs netcoreapp3.1 98.3μs 136ns 508ns 0 0 0 32.4 KB
master EncodeArgs net472 113μs 8.15ns 31.6ns 5.08 0 0 32.51 KB
master EncodeLegacyArgs net6.0 144μs 38ns 147ns 0 0 0 2.15 KB
master EncodeLegacyArgs netcoreapp3.1 193μs 53ns 205ns 0 0 0 2.14 KB
master EncodeLegacyArgs net472 262μs 25.8ns 100ns 0 0 0 2.16 KB
#7467 EncodeArgs net6.0 77.3μs 364ns 1.46μs 0 0 0 32.4 KB
#7467 EncodeArgs netcoreapp3.1 97.3μs 185ns 716ns 0 0 0 32.4 KB
#7467 EncodeArgs net472 110μs 59.3ns 230ns 4.94 0 0 32.51 KB
#7467 EncodeLegacyArgs net6.0 143μs 84.1ns 326ns 0 0 0 2.15 KB
#7467 EncodeLegacyArgs netcoreapp3.1 198μs 197ns 762ns 0 0 0 2.14 KB
#7467 EncodeLegacyArgs net472 261μs 36.7ns 132ns 0 0 0 2.16 KB
Benchmarks.Trace.Asm.AppSecWafBenchmark - Slower ⚠️ Same allocations ✔️

Slower ⚠️ in #7467

Benchmark diff/base Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark‑netcoreapp3.1 1.379 627,923.02 865,638.36

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master RunWafRealisticBenchmark net6.0 404μs 120ns 467ns 0 0 0 4.55 KB
master RunWafRealisticBenchmark netcoreapp3.1 621μs 3.63μs 34.3μs 0 0 0 4.48 KB
master RunWafRealisticBenchmark net472 435μs 169ns 656ns 0 0 0 4.68 KB
master RunWafRealisticBenchmarkWithAttack net6.0 286μs 29.8ns 111ns 0 0 0 2.24 KB
master RunWafRealisticBenchmarkWithAttack netcoreapp3.1 305μs 212ns 820ns 0 0 0 2.22 KB
master RunWafRealisticBenchmarkWithAttack net472 314μs 102ns 394ns 0 0 0 2.29 KB
#7467 RunWafRealisticBenchmark net6.0 395μs 76.8ns 287ns 0 0 0 4.55 KB
#7467 RunWafRealisticBenchmark netcoreapp3.1 863μs 2.51μs 9.4μs 0 0 0 4.48 KB
#7467 RunWafRealisticBenchmark net472 432μs 99.6ns 386ns 0 0 0 4.66 KB
#7467 RunWafRealisticBenchmarkWithAttack net6.0 286μs 61.6ns 230ns 0 0 0 2.24 KB
#7467 RunWafRealisticBenchmarkWithAttack netcoreapp3.1 301μs 52.8ns 197ns 0 0 0 2.22 KB
#7467 RunWafRealisticBenchmarkWithAttack net472 312μs 65ns 252ns 0 0 0 2.29 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 net6.0 60.5μs 28.9ns 104ns 0 0 0 14.52 KB
master SendRequest netcoreapp3.1 70.1μs 240ns 866ns 0 0 0 17.42 KB
master SendRequest net472 0.0222ns 0.00202ns 0.00783ns 0 0 0 0 b
#7467 SendRequest net6.0 61μs 37ns 139ns 0 0 0 14.52 KB
#7467 SendRequest netcoreapp3.1 71μs 90.5ns 339ns 0 0 0 17.42 KB
#7467 SendRequest net472 0.0108ns 0.00281ns 0.0109ns 0 0 0 0 b
Benchmarks.Trace.CharSliceBenchmark - Same speed ✔️ More allocations ⚠️

More allocations ⚠️ in #7467

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool‑netcoreapp3.1 0 b 1 B 1 B

Fewer allocations 🎉 in #7467

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool‑net6.0 3 B 2 B -1 B -33.33%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master OriginalCharSlice net6.0 1.93ms 2.15μs 8.03μs 0 0 0 640 KB
master OriginalCharSlice netcoreapp3.1 2.11ms 10.3μs 41.4μs 0 0 0 640 KB
master OriginalCharSlice net472 2.64ms 378ns 1.41μs 100 0 0 641.95 KB
master OptimizedCharSlice net6.0 1.36ms 369ns 1.43μs 0 0 0 4 B
master OptimizedCharSlice netcoreapp3.1 1.8ms 266ns 1.03μs 0 0 0 1 B
master OptimizedCharSlice net472 1.95ms 486ns 1.88μs 0 0 0 73 B
master OptimizedCharSliceWithPool net6.0 840μs 41.1ns 159ns 0 0 0 3 B
master OptimizedCharSliceWithPool netcoreapp3.1 800μs 50.5ns 195ns 0 0 0 0 b
master OptimizedCharSliceWithPool net472 1.16ms 134ns 520ns 0 0 0 47 B
#7467 OriginalCharSlice net6.0 2.06ms 3.5μs 13.6μs 0 0 0 640.01 KB
#7467 OriginalCharSlice netcoreapp3.1 2.08ms 7.47μs 26.9μs 0 0 0 640 KB
#7467 OriginalCharSlice net472 2.72ms 228ns 853ns 100 0 0 641.95 KB
#7467 OptimizedCharSlice net6.0 1.37ms 444ns 1.72μs 0 0 0 4 B
#7467 OptimizedCharSlice netcoreapp3.1 1.69ms 232ns 897ns 0 0 0 1 B
#7467 OptimizedCharSlice net472 1.91ms 878ns 3.4μs 0 0 0 73 B
#7467 OptimizedCharSliceWithPool net6.0 825μs 111ns 384ns 0 0 0 2 B
#7467 OptimizedCharSliceWithPool netcoreapp3.1 817μs 146ns 564ns 0 0 0 1 B
#7467 OptimizedCharSliceWithPool net472 1.13ms 69.4ns 269ns 0 0 0 47 B
Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master WriteAndFlushEnrichedTraces net6.0 639μs 711ns 2.56μs 0 0 0 41.84 KB
master WriteAndFlushEnrichedTraces netcoreapp3.1 644μs 3.51μs 20.1μs 0 0 0 42.04 KB
master WriteAndFlushEnrichedTraces net472 863μs 2.27μs 8.48μs 8.33 0 0 56.29 KB
#7467 WriteAndFlushEnrichedTraces net6.0 659μs 863ns 3.23μs 0 0 0 41.85 KB
#7467 WriteAndFlushEnrichedTraces netcoreapp3.1 715μs 4.03μs 27μs 0 0 0 41.86 KB
#7467 WriteAndFlushEnrichedTraces net472 881μs 2.26μs 8.76μs 8.33 0 0 56.05 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 net6.0 1.86μs 9.52ns 42.6ns 0 0 0 1.02 KB
master ExecuteNonQuery netcoreapp3.1 2.51μs 8.96ns 33.5ns 0 0 0 1.02 KB
master ExecuteNonQuery net472 2.82μs 3.88ns 14.5ns 0.156 0.0142 0 987 B
#7467 ExecuteNonQuery net6.0 1.83μs 8.84ns 34.2ns 0 0 0 1.02 KB
#7467 ExecuteNonQuery netcoreapp3.1 2.57μs 7.36ns 28.5ns 0 0 0 1.02 KB
#7467 ExecuteNonQuery net472 2.82μs 3.47ns 13.5ns 0.155 0.0141 0 987 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 net6.0 1.69μs 0.738ns 2.86ns 0 0 0 1.03 KB
master CallElasticsearch netcoreapp3.1 2.27μs 10.6ns 41ns 0 0 0 1.03 KB
master CallElasticsearch net472 3.47μs 1.15ns 4.32ns 0.156 0 0 1.04 KB
master CallElasticsearchAsync net6.0 1.89μs 1.86ns 7.21ns 0 0 0 1.01 KB
master CallElasticsearchAsync netcoreapp3.1 2.52μs 1.48ns 5.73ns 0 0 0 1.08 KB
master CallElasticsearchAsync net472 3.77μs 2.4ns 8.97ns 0.169 0 0 1.1 KB
#7467 CallElasticsearch net6.0 1.69μs 7.91ns 31.7ns 0 0 0 1.03 KB
#7467 CallElasticsearch netcoreapp3.1 2.2μs 7.03ns 27.2ns 0 0 0 1.03 KB
#7467 CallElasticsearch net472 3.53μs 2.56ns 9.93ns 0.159 0 0 1.04 KB
#7467 CallElasticsearchAsync net6.0 1.8μs 0.327ns 1.22ns 0 0 0 1.01 KB
#7467 CallElasticsearchAsync netcoreapp3.1 2.33μs 11.9ns 51.7ns 0 0 0 1.08 KB
#7467 CallElasticsearchAsync net472 3.75μs 1.8ns 6.74ns 0.169 0 0 1.1 KB
Benchmarks.Trace.GraphQLBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master ExecuteAsync net6.0 1.82μs 8.22ns 31.8ns 0 0 0 952 B
master ExecuteAsync netcoreapp3.1 2.48μs 4.8ns 18.6ns 0 0 0 952 B
master ExecuteAsync net472 2.43μs 2.8ns 10.8ns 0.134 0 0 915 B
#7467 ExecuteAsync net6.0 1.83μs 2.26ns 8.74ns 0 0 0 952 B
#7467 ExecuteAsync netcoreapp3.1 2.33μs 9.88ns 38.3ns 0 0 0 952 B
#7467 ExecuteAsync net472 2.48μs 5.21ns 20.2ns 0.136 0 0 915 B
Benchmarks.Trace.HttpClientBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendAsync net6.0 6.87μs 6.64ns 25.7ns 0 0 0 2.36 KB
master SendAsync netcoreapp3.1 8.49μs 20.5ns 79.2ns 0 0 0 2.9 KB
master SendAsync net472 12.2μs 4.68ns 17.5ns 0.486 0 0 3.18 KB
#7467 SendAsync net6.0 6.96μs 10.7ns 38.5ns 0 0 0 2.36 KB
#7467 SendAsync netcoreapp3.1 8.34μs 6.22ns 23.3ns 0 0 0 2.9 KB
#7467 SendAsync net472 12.3μs 8.47ns 32.8ns 0.491 0 0 3.18 KB
Benchmarks.Trace.Iast.StringAspectsBenchmark - Same speed ✔️ More allocations ⚠️

More allocations ⚠️ in #7467

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark‑net472 57.34 KB 65.54 KB 8.19 KB 14.29%
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark‑net472 278.53 KB 281.27 KB 2.74 KB 0.99%

Fewer allocations 🎉 in #7467

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark‑netcoreapp3.1 259.06 KB 255.76 KB -3.3 KB -1.27%
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark‑net6.0 44.43 KB 43.78 KB -648 B -1.46%
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark‑netcoreapp3.1 43.86 KB 43.22 KB -640 B -1.46%
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark‑net6.0 276.9 KB 257.47 KB -19.43 KB -7.02%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StringConcatBenchmark net6.0 47.9μs 264ns 1.63μs 0 0 0 44.43 KB
master StringConcatBenchmark netcoreapp3.1 53.6μs 653ns 6.37μs 0 0 0 43.86 KB
master StringConcatBenchmark net472 57μs 150ns 540ns 0 0 0 57.34 KB
master StringConcatAspectBenchmark net6.0 474μs 1.99μs 6.89μs 0 0 0 276.9 KB
master StringConcatAspectBenchmark netcoreapp3.1 507μs 2.51μs 11.2μs 0 0 0 259.06 KB
master StringConcatAspectBenchmark net472 408μs 2.1μs 10.3μs 0 0 0 278.53 KB
#7467 StringConcatBenchmark net6.0 45.2μs 303ns 2.8μs 0 0 0 43.78 KB
#7467 StringConcatBenchmark netcoreapp3.1 49.2μs 258ns 1.53μs 0 0 0 43.22 KB
#7467 StringConcatBenchmark net472 57.3μs 277ns 1.11μs 0 0 0 65.54 KB
#7467 StringConcatAspectBenchmark net6.0 516μs 2.22μs 8.01μs 0 0 0 257.47 KB
#7467 StringConcatAspectBenchmark netcoreapp3.1 495μs 2.12μs 7.95μs 0 0 0 255.76 KB
#7467 StringConcatAspectBenchmark net472 401μs 2.13μs 14.9μs 0 0 0 281.27 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 net6.0 2.65μs 1.12ns 4.35ns 0 0 0 1.7 KB
master EnrichedLog netcoreapp3.1 3.45μs 16.6ns 70.6ns 0 0 0 1.7 KB
master EnrichedLog net472 4μs 2.33ns 9.03ns 0.26 0 0 1.64 KB
#7467 EnrichedLog net6.0 2.62μs 13.6ns 69.6ns 0 0 0 1.7 KB
#7467 EnrichedLog netcoreapp3.1 3.36μs 9.63ns 37.3ns 0 0 0 1.7 KB
#7467 EnrichedLog net472 4.04μs 6.73ns 26.1ns 0.242 0 0 1.64 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 net6.0 124μs 42.7ns 160ns 0 0 0 4.31 KB
master EnrichedLog netcoreapp3.1 128μs 58.2ns 210ns 0 0 0 4.31 KB
master EnrichedLog net472 167μs 79.7ns 298ns 0 0 0 4.52 KB
#7467 EnrichedLog net6.0 122μs 83.7ns 302ns 0 0 0 4.31 KB
#7467 EnrichedLog netcoreapp3.1 127μs 257ns 994ns 0 0 0 4.31 KB
#7467 EnrichedLog net472 167μs 96.9ns 375ns 0 0 0 4.52 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 net6.0 4.8μs 18.7ns 70ns 0 0 0 2.26 KB
master EnrichedLog netcoreapp3.1 6.48μs 27.1ns 105ns 0 0 0 2.26 KB
master EnrichedLog net472 7.56μs 7.68ns 29.8ns 0.301 0 0 2.08 KB
#7467 EnrichedLog net6.0 4.96μs 23.3ns 90.2ns 0 0 0 2.26 KB
#7467 EnrichedLog netcoreapp3.1 6.68μs 10.3ns 39.8ns 0 0 0 2.26 KB
#7467 EnrichedLog net472 7.46μs 3.91ns 14.6ns 0.297 0 0 2.08 KB
Benchmarks.Trace.RedisBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendReceive net6.0 2.03μs 9.52ns 39.2ns 0 0 0 1.2 KB
master SendReceive netcoreapp3.1 2.5μs 11.6ns 47.8ns 0 0 0 1.2 KB
master SendReceive net472 3.18μs 0.991ns 3.43ns 0.189 0 0 1.2 KB
#7467 SendReceive net6.0 1.98μs 10.1ns 48.5ns 0 0 0 1.2 KB
#7467 SendReceive netcoreapp3.1 2.58μs 11.8ns 45.9ns 0 0 0 1.2 KB
#7467 SendReceive net472 3.17μs 2.9ns 10.4ns 0.189 0 0 1.2 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 net6.0 4.05μs 3.08ns 11.9ns 0 0 0 1.58 KB
master EnrichedLog netcoreapp3.1 5.66μs 16.1ns 62.3ns 0 0 0 1.63 KB
master EnrichedLog net472 6.63μs 7.99ns 29.9ns 0.299 0 0 2.03 KB
#7467 EnrichedLog net6.0 4.11μs 3.93ns 14.2ns 0 0 0 1.58 KB
#7467 EnrichedLog netcoreapp3.1 5.56μs 12.8ns 49.6ns 0 0 0 1.63 KB
#7467 EnrichedLog net472 6.74μs 9.1ns 34.1ns 0.303 0 0 2.03 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 net6.0 738ns 1.37ns 5.13ns 0 0 0 576 B
master StartFinishSpan netcoreapp3.1 927ns 3.27ns 12.7ns 0 0 0 576 B
master StartFinishSpan net472 902ns 0.0372ns 0.129ns 0.0901 0 0 578 B
master StartFinishScope net6.0 891ns 0.33ns 1.19ns 0 0 0 696 B
master StartFinishScope netcoreapp3.1 1.13μs 6.12ns 33ns 0 0 0 696 B
master StartFinishScope net472 1.1μs 0.385ns 1.39ns 0.0994 0 0 658 B
#7467 StartFinishSpan net6.0 725ns 3.54ns 15.4ns 0 0 0 576 B
#7467 StartFinishSpan netcoreapp3.1 927ns 4.97ns 27.7ns 0 0 0 576 B
#7467 StartFinishSpan net472 910ns 0.0776ns 0.29ns 0.0874 0 0 578 B
#7467 StartFinishScope net6.0 880ns 4.2ns 16.3ns 0 0 0 696 B
#7467 StartFinishScope netcoreapp3.1 1.12μs 6.02ns 33.5ns 0 0 0 696 B
#7467 StartFinishScope net472 1.11μs 0.283ns 1.02ns 0.1 0 0 658 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 net6.0 1.03μs 5.34ns 25ns 0 0 0 696 B
master RunOnMethodBegin netcoreapp3.1 1.31μs 6.59ns 30.9ns 0 0 0 696 B
master RunOnMethodBegin net472 1.38μs 0.562ns 2.18ns 0.104 0 0 658 B
#7467 RunOnMethodBegin net6.0 1.01μs 3.84ns 13.3ns 0 0 0 696 B
#7467 RunOnMethodBegin netcoreapp3.1 1.34μs 6.6ns 29.5ns 0 0 0 696 B
#7467 RunOnMethodBegin net472 1.38μs 2.09ns 8.09ns 0.103 0 0 658 B

if (!include_process_names.empty() && !Contains(include_process_names, process_name))
{
Log::Info("CorProfiler::Initialize ClrProfiler disabled: ", process_name, " not found in ",
Log::Info("CorProfiler::Initialize Datadog SDK disabled: ", process_name, " not found in ",
Copy link
Member

@lucaspimentel lucaspimentel Sep 4, 2025

Choose a reason for hiding this comment

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

Datadog SDK

"but the auto-instrumentation library is not an SDK!!" :trollface:

Copy link
Member Author

Choose a reason for hiding this comment

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

You're preaching to the choir man, just give me an alternative suggestion 😂 Datadog Library? Or we can just drop SDK entirely - 'Datadog disabled" works too 🤷‍♂️

Copy link
Member

@lucaspimentel lucaspimentel left a comment

Choose a reason for hiding this comment

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

Nice, thanks!

if (process_name == exclude_assembly)
{
Log::Info("CorProfiler::Initialize ClrProfiler disabled: ", process_name," found in default exclude list");
Log::Info("CorProfiler::Initialize Datadog SDK disabled: ", process_name," found in default exclude list");
Copy link
Member

Choose a reason for hiding this comment

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

Unrelated, but why are they called default_exclude_assemblies and exclude_assembly when it's a list of process names? 😅

Copy link
Member Author

Choose a reason for hiding this comment

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

A totally reasonable question 😅 As far as I can tell, it all traces back years ago and was essentially copy pasta. Going to do a bit more cleanup separately

Copy link
Member Author

Choose a reason for hiding this comment

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

Did a PR to fix that (and other minor annoyances) here: #7475

Co-authored-by: Lucas Pimentel <lucas.pimentel@datadoghq.com>
@andrewlock andrewlock merged commit f0e9905 into master Sep 5, 2025
159 of 161 checks passed
@andrewlock andrewlock deleted the andrew/update-native-logs branch September 5, 2025 10:40
@github-actions github-actions bot added this to the vNext-v3 milestone Sep 5, 2025
lucaspimentel added a commit that referenced this pull request Oct 3, 2025
## Summary of changes

- Add performance optimization patterns, testing guidelines, and logging
guidelines to `AGENTS.md`.
- Bonus: Fix noop pipeline path exclusions to properly skip CI for
documentation-only PRs.

## Reason for change

**Documentation:** Document reusable patterns that apply broadly across
the tracer codebase:
- Performance patterns for startup code and hot paths (from PR #7594)
- Testing patterns for testability and isolation (from PR #7594)
- Logging terminology to avoid customer confusion (from PR #7467)

**CI Optimization:** The noop pipeline was not triggering for
documentation-only PRs because it uses `StartsWith()` matching, not glob
patterns. The `**/CLAUDE.md` pattern never matched `.claude/CLAUDE.md`.

## Implementation details

**New documentation sections:**
- Performance Guidelines: Identifies performance-critical code paths
(bootstrap/startup and hot paths)
- Performance Optimization Patterns: Zero-allocation structs, logging
best practices, avoiding params arrays
- Testing Patterns: Abstraction-for-testability with examples
- Logging Guidelines: Consistent customer-facing terminology (Datadog
SDK, Instrumentation, Continuous Profiler, Datadog.Trace.dll)

**Pipeline fixes:**
- Changed `**/CLAUDE.md` glob to `.claude/` prefix (compatible with
`StartsWith()`)
- Added `.devcontainer/`, `.vscode/`, `LICENSE`, `NOTICE` to exclusions

**Other changes:**
- Fixed `.claude/CLAUDE.md` relative path reference
- Improved formatting in Coding Style section

## Test coverage

N/A - documentation and CI configuration only

---------

Co-authored-by: Claude <noreply@anthropic.com>
igoragoli pushed a commit that referenced this pull request Oct 6, 2025
## Summary of changes

- Add performance optimization patterns, testing guidelines, and logging
guidelines to `AGENTS.md`.
- Bonus: Fix noop pipeline path exclusions to properly skip CI for
documentation-only PRs.

## Reason for change

**Documentation:** Document reusable patterns that apply broadly across
the tracer codebase:
- Performance patterns for startup code and hot paths (from PR #7594)
- Testing patterns for testability and isolation (from PR #7594)
- Logging terminology to avoid customer confusion (from PR #7467)

**CI Optimization:** The noop pipeline was not triggering for
documentation-only PRs because it uses `StartsWith()` matching, not glob
patterns. The `**/CLAUDE.md` pattern never matched `.claude/CLAUDE.md`.

## Implementation details

**New documentation sections:**
- Performance Guidelines: Identifies performance-critical code paths
(bootstrap/startup and hot paths)
- Performance Optimization Patterns: Zero-allocation structs, logging
best practices, avoiding params arrays
- Testing Patterns: Abstraction-for-testability with examples
- Logging Guidelines: Consistent customer-facing terminology (Datadog
SDK, Instrumentation, Continuous Profiler, Datadog.Trace.dll)

**Pipeline fixes:**
- Changed `**/CLAUDE.md` glob to `.claude/` prefix (compatible with
`StartsWith()`)
- Added `.devcontainer/`, `.vscode/`, `LICENSE`, `NOTICE` to exclusions

**Other changes:**
- Fixed `.claude/CLAUDE.md` relative path reference
- Improved formatting in Coding Style section

## Test coverage

N/A - documentation and CI configuration only

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:native-library Automatic instrumentation native C++ code (Datadog.Trace.ClrProfiler.Native) type:cleanup Minor code clean up

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants