Skip to content

[Debugger] Gate template dumps on the runtime type - #9541

Draft
dudikeleti wants to merge 6 commits into
dudik/fix/debug-5963-dump-root-dictionaryfrom
dudik/di-dump-runtime-type-hardening
Draft

dudikeleti wants to merge 6 commits into
dudik/fix/debug-5963-dump-root-dictionaryfrom
dudik/di-dump-runtime-type-hardening

Conversation

@dudikeleti

@dudikeleti dudikeleti commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #9483: review only the commits after it. This is a draft until #9483 and the redaction-cache PR (dudik/perf/redaction-cache-lock-free) merge; see Other details.

Summary of changes

Log-template dumps (ProbeExpressionParser.Dump.cs) now use the value's runtime type to decide two things:

  • whether the dump may enumerate the value, or call ToString(), Exception.Message or Exception.StackTrace on it;
  • whether the value is redacted.

#9483 did this for dictionaries only. This PR covers lists and arrays, exceptions, ToString() and the null check, and adds runtime-type redaction when the declared type isn't sealed.

Reason for change

  • The declared type isn't the runtime type. The two match only for root locals and arguments (AddLocalAndArgs uses Value.GetType()). A value reached through getmember or an object field keeps its declared type, which can be an interface or a non-sealed type holding a customer implementation. That implementation's enumerator, Message/StackTrace override or ToString() override then ran on the application thread while the log message was rendered.
  • Redaction missed runtime types. A configured redacted type held by a field declared as object, an interface or a base class was dumped field by field.
  • The null check could call customer code. It used Expression.Equal, which binds to a customer operator ==.

Implementation details

Wherever the declared type allows, the decision is made when the expression compiles. A sealed or value type is its own runtime type, so it gets no runtime check.

Root values (DumpExpression) whose declared type isn't sealed. The value is read once, then IsRedactedRuntimeValue(value, declaredType) (from #9483) runs first and renders {redacted} without an evaluation error. It skips the lookup when the runtime type equals the declared type. After that:

Declared type Runtime check
Collection interface Enumerate only when Redaction.IsSupportedCollection(value) accepts the runtime type.
Collection class Every allowlisted collection derives directly from object, so this is decided at compile time. A class on the allowlist enumerates only when value.GetType() == declaredType. Any other class gets the field dump. Arrays are unchanged.
Uri, StackTrace ToString() only when value.GetType() == declaredType.
Exception DumpException (see below). A declared type outside CoreLib skips the runtime check, because no CoreLib type can derive from it.
Anything else Field dump.

A runtime type that is rejected gets the field dump, the same output a root local of that type gets.

DumpException:

  • CoreLib runtime type (checked by comparing the assembly by reference): Type, Message, StackTrace. Two CoreLib types are excluded because their Message formats values that can be customer objects: ReflectionTypeLoadException reads its loader exceptions' Message, and SwitchExpressionException formats the unmatched value.
  • Any other type: Type, <message>, where the message is Exception._message read through a cached FieldInfo, so no override runs. When that field is null, just Type.

Null check: Expression.ReferenceEqual, or !HasValue for Nullable<T>.

Fields (DumpObject):

  • Collection fields check the cheap runtime allowlists first, and the declared-type shape check (IsTypeSupportIndex) runs only after that. Only allowlisted runtime types are enumerated. [Debugger] DEBUG-5963 Dump dictionaries in log templates with key-based redaction #9483's runtime-type redaction is unchanged.
  • ToString() is called only when the runtime type equals the declared type, or when the declared type is a value type.
  • Exception fields: runtime-type redaction, then DumpException.

Removed: IsSafeException. It has no callers left, and its namespace-based rule is what this PR replaces.

Per-evaluation cost

Path Change compared with #9483
Root value, sealed or value declared type None. Decided at compile time.
Root value, non-sealed declared type +1 GetType() and a reference compare. One Redaction.IsRedactedType lookup, only when the runtime type differs from the declared one.
Root collection interface + Redaction.IsSupportedCollection(value), which is allocation-free.
Root collection class + one GetType() reference compare, or nothing if the class isn't allowlisted.
Root Uri/StackTrace + one GetType() reference compare.
Root exception, non-sealed CoreLib declared type + GetType().Assembly and a reference compare, plus 2 reference compares against the two excluded CoreLib types.
Exception outside CoreLib One cached-FieldInfo read of Exception._message instead of calling Message/StackTrace. Only for exceptions outside CoreLib.
Field dumps Cheaper. IsTypeSupportIndex (namespace StartsWith, GetInterface ×2, GetInterfaces().Any(...), which allocates) now runs only for null values and allowlisted runtime collections, not for every field.
Field ToString() + one GetType() reference compare.
Exception fields Drops the namespace check (IsMicrosoftType). + the assembly compare. Redaction lookup only when the runtime type differs.

There are no new GetInterfaces() calls, LINQ, closures or string building on the evaluation path; the Func lambdas run only at compile time.

The redaction lookup is the existing ConcurrentAdaptiveCache, which takes a lock. dudik/perf/redaction-cache-lock-free makes a cache hit lock-free and allocation-free: 707 ns / 454 B before, 10.9 ns / 0 B after.

Behavior and output changes

  • Customer runtime types behind allowed declared types, for example a List<string> subclass behind IList<string>, a Uri subclass, or a customer Dictionary<,> subclass:
    • Root values: the runtime type's fields are dumped. Before, the customer enumerator or override ran.
    • Fields: the declared type name is shown.
  • Microsoft collections outside the snapshot allowlist (ReadOnlyCollection<T>, Collection<T>, ObservableCollection<T>, immutable collections, ...) behind a collection-typed root value are field-dumped instead of enumerated. Snapshot capture already treats them this way.
  • Collection fields declared IList/IReadOnlyList<> whose runtime type isn't allowlisted show the declared type name instead of being enumerated. If such a runtime type is also configured as redacted, the field shows the declared type name instead of {redacted}; neither shows the content.
  • Redacted runtime types behind non-sealed declared root values render {redacted}. Before, the redacted type's fields were dumped.
  • Exceptions:
    • Root dumps name the runtime type. {@exception} now renders System.InvalidCastException, <message>, <stack> instead of System.Exception, ... (see the Exception snapshot).
    • Exceptions outside CoreLib render Type, <message> without a stack trace. That covers customer exceptions and Microsoft ones outside CoreLib such as XmlException and HttpRequestException.
    • A root local whose declared type is a customer exception renders Type, <message>. Before, it got a field dump, which is usually empty.
    • ReflectionTypeLoadException and SwitchExpressionException render Type, <message>.
    • A null root exception is unchanged and still shows the declared type name.
  • A null root Uri/StackTrace renders null. Before, it raised an evaluation error.
  • Verify snapshots: the generated expressions change in AccessNullableStruct, AccessNullableStructNotNull, Collection, CustomArrayAtIndex, Exception and ToStringNotSupported. Only Exception's rendered result changes.

Test coverage

New tests in DebuggerExpressionLanguageTests:

  • TemplateDump_GetMemberDumpsFieldsOfCustomerRuntimeType: getmember on fields declared List<string>, IList<string>, IReadOnlyList<string>, Dictionary<,> and Uri. They hold customer subclasses whose enumerators and ToString() throw.
  • TemplateDump_FieldsOfCustomerRuntimeTypeDumpDeclaredTypeName: the same values as fields.
  • TemplateDump_GetMemberDumpsAllowedRuntimeType: a List<string> behind IList<string>, an exact Uri, and an XmlException behind a declared XmlException are still dumped.
  • TemplateDump_GetMemberCollectionClassOutsideAllowlistDumpsFields: Collection<string>, whose dump is decided at compile time.
  • TemplateDump_GetMemberExceptionField and TemplateDump_ExceptionFieldsCallMembersOnlyOnCoreLibRuntimeType, over four exceptions:
    • a CoreLib exception;
    • a customer subclass of InvalidOperationException whose Message and StackTrace throw;
    • a customer exception without a message;
    • XmlException, which is outside CoreLib.
  • TemplateDump_CustomerExceptionLocalShowsMessageField.
  • TemplateDump_ReflectionTypeLoadExceptionDoesNotReadLoaderExceptionMessages: as a local, through getmember and as a field.
  • TemplateDump_SwitchExpressionExceptionDoesNotFormatUnmatchedValue, on .NET Core only.
  • TemplateDump_NullCheckDoesNotInvokeEqualityOperator: a root value whose type has a throwing operator ==.
  • In the non-parallel RuntimeTypeRedactionTests class:
    • GetMemberNonSealedField_RedactsConfiguredRuntimeType: an object field holding a redacted type, a redacted List<string> behind IList<string>, a redacted exception behind Exception, and a non-redacted object field.
    • ExceptionField_RedactsConfiguredRuntimeType.

Results on this branch:

  • dotnet test tracer/test/Datadog.Trace.Tests/Datadog.Trace.Tests.csproj -c Release -f net10.0 --filter "FullyQualifiedName~Datadog.Trace.Tests.Debugger": 919 passed, 2 skipped.
  • The same with -f net48: 882 passed, 29 skipped.

Other details

  • Depends on:
  • Expect a trivial conflict with the redacted-type member-access PR, which renames ShouldRedactDumpValue to ShouldRedactValue.
  • The collection dump format fix is a separate PR stacked on this one: [Debugger] Fix collection dump separators in log templates #9542.
  • Not covered, possible follow-ups:
    • Two CoreLib Message getters still format customer values: AggregateException (on .NET Core it appends each inner exception's Message) and ArgumentOutOfRangeException (it formats ActualValue). They could take the same _message path, but AggregateException would then lose the inner messages it shows today.
    • BlockingCollection<T> is allowlisted, but it enumerates its backing IProducerConsumerCollection<T>, which can be a customer type. This affects snapshot capture too.
    • ConcurrentBag<T>/ConcurrentQueue<T> enumeration takes locks and copies the collection.
    • Root dumps of value-type collections (List<int>, int[]) already fail to compile before this PR.
    • any/all/filter/index still gate on the declared type. That is being handled in other PRs.
    • Snapshot capture's exception selector still reads Message/StackTrace on any exception type.
    • Redaction.IsRedactedType allocates a delegate per call from a method group. Check whether the cache PR fixes that.

@pr-commenter

pr-commenter Bot commented Oct 27, 2026

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-10-27 20:31:48

Comparing candidate commit 0a8b7fa in PR branch dudik/di-dump-runtime-type-hardening with baseline commit 6d182cd in branch master.

📊 Benchmarking dashboard

Found 0 performance improvements and 0 performance regressions! Performance is the same for 72 metrics, 0 unstable metrics, 11 known flaky benchmarks, 115 flaky benchmarks without significant changes.

Explanation

This is an A/B test comparing a candidate commit's performance against that of a baseline commit. Performance changes are noted in the tables below as:

  • 🟩 = significantly better candidate vs. baseline
  • 🟥 = significantly worse candidate vs. baseline

We compute a confidence interval (CI) over the relative difference of means between metrics from the candidate and baseline commits, considering the baseline as the reference.

If the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD), the change is considered significant.

Feel free to reach out to #apm-benchmarking-platform on Slack if you have any questions.

More details about the CI and significant changes

You can imagine this CI as a range of values that is likely to contain the true difference of means between the candidate and baseline commits.

CIs of the difference of means are often centered around 0%, because often changes are not that big:

---------------------------------(------|---^--------)-------------------------------->
                              -0.6%    0%  0.3%     +1.2%
                                 |          |        |
         lower bound of the CI --'          |        |
sample mean (center of the CI) -------------'        |
         upper bound of the CI ----------------------'

As described above, a change is considered significant if the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD).

For instance, for an execution time metric, this confidence interval indicates a significantly worse performance:

----------------------------------------|---------|---(---------^---------)---------->
                                       0%        1%  1.3%      2.2%      3.1%
                                                  |   |         |         |
       significant impact threshold --------------'   |         |         |
                      lower bound of CI --------------'         |         |
       sample mean (center of the CI) --------------------------'         |
                      upper bound of CI ----------------------------------'

Known flaky benchmarks

These benchmarks are marked as flaky and will not trigger a failure. Modify FLAKY_BENCHMARKS_REGEX to control which benchmarks are marked as flaky.

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleMoreComplexBody net472

  • 🟩 throughput [+4131.140op/s; +4686.714op/s] or [+6.511%; +7.386%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody net472

  • 🟩 throughput [+48348.190op/s; +62787.821op/s] or [+7.460%; +9.688%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorMoreComplexBody net472

  • 🟩 throughput [+4055.507op/s; +4326.388op/s] or [+5.762%; +6.147%]

scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest netcoreapp3.1

  • unstable execution_time [-94.964ms; -9.593ms] or [-20.897%; -2.111%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • unstable execution_time [+17.558ms; +90.134ms] or [+3.189%; +16.372%]
  • unstable throughput [-38.809op/s; +22.903op/s] or [-6.439%; +3.800%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch net472

  • 🟩 throughput [+24102.035op/s; +26470.496op/s] or [+8.733%; +9.591%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net472

  • 🟩 throughput [+16426.576op/s; +19096.849op/s] or [+6.085%; +7.075%]

scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark netcoreapp3.1

  • 🟩 allocated_mem [-18.031KB; -18.011KB] or [-6.549%; -6.542%]

scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark netcoreapp3.1

  • unstable execution_time [-1.719µs; +4.755µs] or [-3.235%; +8.948%]

scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore net6.0

  • unstable execution_time [+20.297ms; +80.292ms] or [+4.507%; +17.830%]

scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore netcoreapp3.1

  • 🟥 throughput [-16704725.277op/s; -16283958.310op/s] or [-6.833%; -6.661%]

Known flaky benchmarks without significant changes:

  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled netcoreapp3.1
  • scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild net472
  • scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild net6.0
  • scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild netcoreapp3.1
  • scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net472
  • scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net6.0
  • scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleMoreComplexBody net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleMoreComplexBody netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorMoreComplexBody net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorMoreComplexBody netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorSimpleBody net472
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorSimpleBody net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorSimpleBody netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeArgs net472
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeArgs net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeArgs netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs net472
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark net472
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack net472
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack netcoreapp3.1
  • scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net472
  • scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net6.0
  • scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net6.0
  • scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces netcoreapp3.1
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice net6.0
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice netcoreapp3.1
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net6.0
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool netcoreapp3.1
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net6.0
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice netcoreapp3.1
  • scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch net6.0
  • scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch netcoreapp3.1
  • scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net6.0
  • scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync netcoreapp3.1
  • scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync net472
  • scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync net6.0
  • scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync netcoreapp3.1
  • scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog net472
  • scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog net6.0
  • scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog netcoreapp3.1
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark net472
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark net6.0
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark net472
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark net6.0
  • scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog net472
  • scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog net6.0
  • scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog netcoreapp3.1
  • scenario:Benchmarks.Trace.RedisBenchmark.SendReceive net472
  • scenario:Benchmarks.Trace.RedisBenchmark.SendReceive net6.0
  • scenario:Benchmarks.Trace.RedisBenchmark.SendReceive netcoreapp3.1
  • scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog net472
  • scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog net6.0
  • scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog netcoreapp3.1
  • scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishScope net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishScope net6.0
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishScope netcoreapp3.1
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan net6.0
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan netcoreapp3.1
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes net6.0
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes netcoreapp3.1
  • scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin net472
  • scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin net6.0
  • scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin netcoreapp3.1

@dd-trace-dotnet-ci-bot

Copy link
Copy Markdown

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (9541) and master.

✅ No regressions detected

📄 View the full report (charts + all metrics) →

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant