Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP2 Dynamic Window (prototype/early draft) #52862

Closed
wants to merge 114 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
803f47d
Big buffer test
CarnaViire Dec 2, 2020
2b8922d
Merge branch 'main' into http2-big-buffer
CarnaViire Mar 23, 2021
93b691b
Clean up
CarnaViire Mar 23, 2021
6a86867
Merge remote-tracking branch 'upstream/main' into http2-big-buffer
CarnaViire Mar 23, 2021
0767cc4
Clean up
CarnaViire Mar 23, 2021
9a3668c
LargeFileBenchmark
antonfirsov Apr 27, 2021
2949234
Merge remote-tracking branch 'CarnaViire/http2-big-buffer' into http/…
antonfirsov Apr 27, 2021
de6274f
use original DefaultInitialWindowSize
antonfirsov Apr 27, 2021
67ee0a5
Merge branch 'main' into http/window-experiments
antonfirsov May 3, 2021
791ad96
ability to disable initial window + trace in tests
antonfirsov May 4, 2021
1a79274
choose remote peer
antonfirsov May 4, 2021
519fbac
Merge branch 'http/window-experiments' of https://github.com/antonfir…
antonfirsov May 4, 2021
ff533a5
fix build
antonfirsov May 4, 2021
81c38e0
trap black magic
antonfirsov May 4, 2021
b60489c
Merge branch 'http/window-experiments' of https://github.com/antonfir…
antonfirsov May 4, 2021
037484a
size of initial connection window is always 65535
antonfirsov May 5, 2021
8578ba7
move window management algorithm to separate class
antonfirsov May 10, 2021
7ed17f7
FakeRtt
antonfirsov May 10, 2021
869577b
move constants around
antonfirsov May 10, 2021
74df445
ping for fake RTT
antonfirsov May 10, 2021
6e931cd
initial attempt for dynamic window
antonfirsov May 10, 2021
f0a2992
disable magic for now
antonfirsov May 10, 2021
623dfe9
InitialStreamWindowSize argument
antonfirsov May 12, 2021
a9591fb
move LargeFileBenchmark
antonfirsov May 13, 2021
acc64c5
Winsock RTT estimation
antonfirsov May 13, 2021
1c655c3
timeout
antonfirsov May 13, 2021
7d46cdb
benchmarks
antonfirsov May 17, 2021
0e4040b
confugrable StreamWindowUpdateRatio & StreamWindowMagicMultiplier
antonfirsov May 17, 2021
e2d002f
separate update ratios
antonfirsov May 17, 2021
1409ad5
Revert "separate update ratios"
antonfirsov May 17, 2021
da86afa
comment out _LargeFileBenchmark
antonfirsov May 17, 2021
8739547
remove some junk code
antonfirsov May 17, 2021
57ade94
remove some junk code
antonfirsov May 18, 2021
dd2e982
Simplify logic around windowSizeIncrement
antonfirsov May 18, 2021
90dce09
Simplify logic around windowSizeIncrement
antonfirsov May 18, 2021
a8bd26a
use content stream in benchmark
antonfirsov May 18, 2021
4e521e5
use Stopwatch instead of DateTime.Now
antonfirsov May 19, 2021
9bef28c
fix tracing
antonfirsov May 19, 2021
aa256aa
better tests
antonfirsov May 19, 2021
48cf3d2
fix EstimateRttAsync in tests
antonfirsov May 19, 2021
ec2d81a
Merge branch 'main' into http/window-experiments
antonfirsov May 28, 2021
cd73395
use PING for RTT estimation
antonfirsov May 28, 2021
9df8166
Merge branch 'main' into http/window-experiments
antonfirsov Jun 1, 2021
b34df9f
_LargeFileBenchmark custom port
antonfirsov Jun 1, 2021
1645b39
test both kestrel & go
antonfirsov Jun 1, 2021
8355c75
try more regular pings
antonfirsov Jun 1, 2021
e503e25
multi stream test + opt-in static RTT
antonfirsov Jun 2, 2021
461291c
Task.Run
antonfirsov Jun 2, 2021
0e17349
recreate request
antonfirsov Jun 2, 2021
869c377
more specific benchmarks
antonfirsov Jun 2, 2021
3ddd788
EnableDynamicHttp2StreamWindowSizing
antonfirsov Jun 2, 2021
d1cd6d8
benchmark stuff
antonfirsov Jun 3, 2021
197d962
more benchmark tweaking
antonfirsov Jun 3, 2021
85e70ca
utilize SETTINGS frame, calc min RTT , initial burst
antonfirsov Jun 3, 2021
3b95797
benchmark tweak
antonfirsov Jun 3, 2021
9e2a68f
if (_staticRtt.HasValue) return
antonfirsov Jun 3, 2021
0a27183
Merge branch 'http/window-experiments' of https://github.com/antonfir…
antonfirsov Jun 3, 2021
03e154f
better filter
antonfirsov Jun 7, 2021
c01860b
trace time to reach 8M window
antonfirsov Jun 7, 2021
72f290b
Merge branch 'http/window-experiments' of https://github.com/antonfir…
antonfirsov Jun 7, 2021
0683044
do not print "reached 8M window" multiple times
antonfirsov Jun 7, 2021
ee375ca
meh
antonfirsov Jun 7, 2021
ca19ab4
SpecificWindow_KiloBytes
antonfirsov Jun 7, 2021
56700dd
cleanup Download_Dynamic_* data
antonfirsov Jun 7, 2021
66914db
repurpose magic factor
antonfirsov Jun 7, 2021
144c47f
TestHandler: bind to custom local endpoint
antonfirsov Jun 10, 2021
d24d332
duo
antonfirsov Jun 10, 2021
13a5322
meh
antonfirsov Jun 10, 2021
fe053df
rrrrr
antonfirsov Jun 10, 2021
763f368
TestRunCount
antonfirsov Jun 10, 2021
fbdfc29
report to csv
antonfirsov Jun 10, 2021
00fb8a9
round elapsedSec
antonfirsov Jun 10, 2021
1b48ac7
PingEx
antonfirsov Jun 10, 2021
5c59fe7
report RTT
antonfirsov Jun 11, 2021
dab35ab
more benchmark cases
antonfirsov Jun 11, 2021
da9656a
more benchmark cases
antonfirsov Jun 11, 2021
a692cf9
Merge branch 'http/window-experiments' of https://github.com/antonfir…
antonfirsov Jun 11, 2021
c48e340
pass 'details'
antonfirsov Jun 11, 2021
3ef586c
have a warmup
antonfirsov Jun 11, 2021
8a349af
split benchmarks because of limit
antonfirsov Jun 11, 2021
4a0d057
benchmark more
antonfirsov Jun 15, 2021
a5c95b7
StreamWindowMagicMultiplier -> StreamWindowThresholdMultiplier
antonfirsov Jun 15, 2021
ed18c5b
remove Stopwatch allocation
antonfirsov Jun 16, 2021
ce1920a
RttEstimator: do not react when there is no active stream
antonfirsov Jun 16, 2021
f30e6b1
handle GoAway
antonfirsov Jun 16, 2021
86e1d68
fix more tests
antonfirsov Jun 18, 2021
ebb80a9
do not send RTT ping when EndStreamFlag is set
antonfirsov Jun 20, 2021
0afed46
Merge branch 'main' into http/window-experiments
antonfirsov Jun 21, 2021
79024f1
send RTT ping when receiving headers
antonfirsov Jun 21, 2021
bf15458
test
antonfirsov Jun 21, 2021
d42194c
fixed a bunch of Inner Loop HTTP2 tests
antonfirsov Jun 21, 2021
6e0dc5e
fix some OuterLoop tests
antonfirsov Jun 21, 2021
b02415f
window scaling tests
antonfirsov Jun 22, 2021
4b9d7f2
Merge branch 'http/window-experiments' into http/dynamic-window-draft
antonfirsov Jun 22, 2021
9a86ec9
comment out _LargeFileBenchmark
antonfirsov Jun 22, 2021
25f7757
fix test
antonfirsov Jun 22, 2021
37ee6f9
remote "static RTT" tests
antonfirsov Jun 22, 2021
145ace9
improve naming
antonfirsov Jun 22, 2021
3776806
fix SendAsync_Unexpected1xxResponses_DropAllInterimResponses
antonfirsov Jun 23, 2021
8b16b7c
multi-stream benchmarks
antonfirsov Jun 23, 2021
511bf56
API
antonfirsov Jun 23, 2021
49841af
RuntimeSettingParser
antonfirsov Jun 23, 2021
b75827c
final API & runtime switches
antonfirsov Jun 23, 2021
5e388f4
fix _LargeFileBenchmark
antonfirsov Jun 23, 2021
1050b15
disable _LargeFileBenchmark for CI
antonfirsov Jun 23, 2021
e03d3a1
InitialHttp2StreamWindowSize argument validation
antonfirsov Jun 24, 2021
857b8ac
more flow control tests
antonfirsov Jun 24, 2021
a3f0dde
refactor
antonfirsov Jun 24, 2021
03d70ca
remove sandboxing
antonfirsov Jun 24, 2021
0f9f065
StreamWindowScaleThresholdMultiplier tests
antonfirsov Jun 24, 2021
0485d63
clean-up tracing
antonfirsov Jun 24, 2021
bd1b177
make Http2StreamWindowManager struct
antonfirsov Jun 24, 2021
201641e
make RttEstimator non-nullable
antonfirsov Jun 24, 2021
071676a
make RttEstimator a struct
antonfirsov Jun 24, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Net.Sockets;
using System.Runtime.InteropServices;

internal static partial class Interop
{
internal static partial class Winsock
{
private const int SioTcpInfo = unchecked((int)3623878695L);

[DllImport(Interop.Libraries.Ws2_32, SetLastError = true, EntryPoint = "WSAIoctl")]
private static extern SocketError WSAIoctl_Blocking(
SafeSocketHandle socketHandle,
[In] int ioControlCode,
[In] ref int inBuffer,
[In] int inBufferSize,
[Out] out _TCP_INFO_v0 outBuffer,
[In] int outBufferSize,
[Out] out int bytesTransferred,
[In] IntPtr overlapped,
[In] IntPtr completionRoutine);

internal static unsafe SocketError GetTcpInfoV0(SafeSocketHandle socketHandle, out _TCP_INFO_v0 tcpInfo)
{
int input = 0;
return WSAIoctl_Blocking(socketHandle, SioTcpInfo, ref input, sizeof(int), out tcpInfo, sizeof(_TCP_INFO_v0), out _, IntPtr.Zero, IntPtr.Zero);
}

internal struct _TCP_INFO_v0
{
internal System.Net.NetworkInformation.TcpState State;
internal uint Mss;
internal ulong ConnectionTimeMs;
internal byte TimestampsEnabled;
internal uint RttUs;
internal uint MinRttUs;
internal uint BytesInFlight;
internal uint Cwnd;
internal uint SndWnd;
internal uint RcvWnd;
internal uint RcvBuf;
internal ulong BytesOut;
internal ulong BytesIn;
internal uint BytesReordered;
internal uint BytesRetrans;
internal uint FastRetrans;
internal uint DupAcksIn;
internal uint TimeoutEpisodes;
internal byte SynRetrans;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,7 @@ internal static partial class HttpHandlerDefaults
public static readonly TimeSpan DefaultPooledConnectionIdleTimeout = TimeSpan.FromMinutes(1);
public static readonly TimeSpan DefaultExpect100ContinueTimeout = TimeSpan.FromSeconds(1);
public static readonly TimeSpan DefaultConnectTimeout = Timeout.InfiniteTimeSpan;
public const int DefaultHttp2MaxStreamWindowSize = 16 * 1024 * 1024;
public const double DefaultHttp2StreamWindowScaleThresholdMultiplier = 1.0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public class Http2LoopbackConnection : GenericLoopbackConnection
private TaskCompletionSource<bool> _ignoredSettingsAckPromise;
private bool _ignoreWindowUpdates;
private TaskCompletionSource<PingFrame> _expectPingFrame;
private bool _autoProcessPingFrames;
private bool _respondToPing;
private readonly TimeSpan _timeout;
private int _lastStreamId;

Expand Down Expand Up @@ -200,9 +202,18 @@ private async Task<Frame> ReadFrameAsync(CancellationToken cancellationToken)

if (_expectPingFrame != null && header.Type == FrameType.Ping)
{
_expectPingFrame.SetResult(PingFrame.ReadFrom(header, data));
_expectPingFrame = null;
return await ReadFrameAsync(cancellationToken).ConfigureAwait(false);
PingFrame pingFrame = PingFrame.ReadFrom(header, data);

// _expectPingFrame is not intended to work with PING ACK:
if (!pingFrame.AckFlag)
{
await ProcessExpectedPingFrame(pingFrame);
return await ReadFrameAsync(cancellationToken).ConfigureAwait(false);
}
else
{
return pingFrame;
}
}

// Construct the correct frame type and return it.
Expand All @@ -224,11 +235,30 @@ private async Task<Frame> ReadFrameAsync(CancellationToken cancellationToken)
return GoAwayFrame.ReadFrom(header, data);
case FrameType.Continuation:
return ContinuationFrame.ReadFrom(header, data);
case FrameType.WindowUpdate:
return WindowUpdateFrame.ReadFrom(header, data);
default:
return header;
}
}

private async Task ProcessExpectedPingFrame(PingFrame pingFrame)
{
_expectPingFrame.SetResult(pingFrame);
if (_respondToPing && !pingFrame.AckFlag)
{
await SendPingAckAsync(pingFrame.Data);
}

_expectPingFrame = null;
_respondToPing = false;

if (_autoProcessPingFrames)
{
_ = ExpectPingFrameAsync(true);
}
}

// Reset and return underlying networking objects.
public (Socket, Stream) ResetNetwork()
{
Expand Down Expand Up @@ -263,15 +293,32 @@ public void IgnoreWindowUpdates()
_ignoreWindowUpdates = true;
}

// Set up loopback server to expect PING frames among other frames.
// Set up loopback server to expect a (non-ACK) PING frame among other frames.
// Once PING frame is read in ReadFrameAsync, the returned task is completed.
// The returned task is canceled in ReadPingAsync if no PING frame has been read so far.
public Task<PingFrame> ExpectPingFrameAsync()
public Task<PingFrame> ExpectPingFrameAsync(bool respond = false)
{
_expectPingFrame ??= new TaskCompletionSource<PingFrame>();
_respondToPing = respond;

return _expectPingFrame.Task;
}

// Recurring variant of ExpectPingFrame().
// Starting from the time of the call, respond to all (non-ACK) PING frames which are received among other frames.
public void SetupAutomaticPingResponse()
{
_autoProcessPingFrames = true;
_ = ExpectPingFrameAsync(true);
}

// Tear down automatic PING responses, but still expect (at most one) PING in flight
public void TearDownAutomaticPingResponse()
{
_respondToPing = false;
_autoProcessPingFrames = false;
}

public async Task ReadRstStreamAsync(int streamId)
{
Frame frame = await ReadFrameAsync(_timeout);
Expand All @@ -292,6 +339,14 @@ public async Task ReadRstStreamAsync(int streamId)
}
}

// Receive a single PING frame and respond with an ACK
public async Task RespondToPingFrameAsync()
{
PingFrame pingFrame = (PingFrame)await ReadFrameAsync(_timeout);
Assert.False(pingFrame.AckFlag, "Unexpected PING ACK");
await SendPingAckAsync(pingFrame.Data);
}

// Wait for the client to close the connection, e.g. after the HttpClient is disposed.
public async Task WaitForClientDisconnectAsync(bool ignoreUnexpectedFrames = false)
{
Expand Down Expand Up @@ -720,9 +775,11 @@ public async Task PingPong()
PingFrame ping = new PingFrame(pingData, FrameFlags.None, 0);
await WriteFrameAsync(ping).ConfigureAwait(false);
PingFrame pingAck = (PingFrame)await ReadFrameAsync(_timeout).ConfigureAwait(false);

if (pingAck == null || pingAck.Type != FrameType.Ping || !pingAck.AckFlag)
{
throw new Exception("Expected PING ACK");
string faultDetails = pingAck == null ? "" : $" frame.Type:{pingAck.Type} frame.AckFlag: {pingAck.AckFlag}";
throw new Exception("Expected PING ACK" + faultDetails);
}

Assert.Equal(pingData, pingAck.Data);
Expand All @@ -732,6 +789,7 @@ public async Task<PingFrame> ReadPingAsync(TimeSpan timeout)
{
_expectPingFrame?.TrySetCanceled();
_expectPingFrame = null;
_respondToPing = false;

Frame frame = await ReadFrameAsync(timeout).ConfigureAwait(false);
Assert.NotNull(frame);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1414,6 +1414,11 @@ await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
{
await server.AcceptConnectionAsync(async connection =>
{
if (connection is Http2LoopbackConnection http2Connection)
{
http2Connection.SetupAutomaticPingResponse(); // Handle RTT PING
}

// Send unexpected 1xx responses.
HttpRequestData requestData = await connection.ReadRequestDataAsync(readBody: false);
await connection.SendResponseAsync(responseStatusCode, isFinal: false);
Expand Down Expand Up @@ -1463,6 +1468,10 @@ await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
await server.AcceptConnectionAsync(async connection =>
{
await connection.ReadRequestDataAsync(readBody: false);
if (connection is Http2LoopbackConnection http2Connection)
{
http2Connection.SetupAutomaticPingResponse(); // Respond to RTT PING
}
// Send multiple 100-Continue responses.
for (int count = 0 ; count < 4; count++)
{
Expand Down Expand Up @@ -1565,6 +1574,11 @@ await server.AcceptConnectionAsync(async connection =>

await connection.SendResponseAsync(HttpStatusCode.OK, headers: new HttpHeaderData[] {new HttpHeaderData("Content-Length", $"{ResponseString.Length}")}, isFinal : false);

if (connection is Http2LoopbackConnection http2Connection)
{
http2Connection.SetupAutomaticPingResponse(); // Respond to RTT PING
}

byte[] body = await connection.ReadRequestBodyAsync();
Assert.Equal(RequestString, Encoding.ASCII.GetString(body));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ protected static HttpClient CreateHttpClient(HttpMessageHandler handler, string
#endif
};

public const int DefaultInitialWindowSize = 65535;

public static readonly bool[] BoolValues = new[] { true, false };

// For use by remote server tests
Expand Down
2 changes: 1 addition & 1 deletion src/libraries/System.Net.Http/ref/System.Net.Http.cs
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ protected override void SerializeToStream(System.IO.Stream stream, System.Net.Tr
public sealed partial class SocketsHttpHandler : System.Net.Http.HttpMessageHandler
{
public SocketsHttpHandler() { }
[System.Runtime.Versioning.UnsupportedOSPlatformGuardAttribute("browser")]
public int InitialHttp2StreamWindowSize { get { throw null; } set { } }
public static bool IsSupported { get { throw null; } }
public bool AllowAutoRedirect { get { throw null; } set { } }
public System.Net.DecompressionMethods AutomaticDecompression { get { throw null; } set { } }
Expand Down
3 changes: 3 additions & 0 deletions src/libraries/System.Net.Http/src/Resources/Strings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,9 @@
<data name="net_http_http2_connection_not_established" xml:space="preserve">
<value>An HTTP/2 connection could not be established because the server did not complete the HTTP/2 handshake.</value>
</data>
<data name="net_http_http2_invalidinitialstreamwindowsize" xml:space="preserve">
<value>The initial HTTP/2 stream window size must be between {0} and {1}.</value>
</data>
<data name="net_MethodNotImplementedException" xml:space="preserve">
<value>This method is not implemented by this class.</value>
</data>
Expand Down
6 changes: 5 additions & 1 deletion src/libraries/System.Net.Http/src/System.Net.Http.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<WindowsRID>win</WindowsRID>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
Expand Down Expand Up @@ -62,6 +62,7 @@
<Compile Include="System\Net\Http\ReadOnlyMemoryContent.cs" />
<Compile Include="System\Net\Http\RequestRetryType.cs" />
<Compile Include="System\Net\Http\SocketsHttpHandler\HttpMessageHandlerStage.cs" />
<Compile Include="System\Net\Http\SocketsHttpHandler\RuntimeSettingParser.cs" />
<Compile Include="System\Net\Http\StreamContent.cs" />
<Compile Include="System\Net\Http\StreamToStreamCopy.cs" />
<Compile Include="System\Net\Http\StringContent.cs" />
Expand Down Expand Up @@ -160,6 +161,7 @@
<Compile Include="System\Net\Http\SocketsHttpHandler\Http2ProtocolException.cs" />
<Compile Include="System\Net\Http\SocketsHttpHandler\Http2Stream.cs" />
<Compile Include="System\Net\Http\SocketsHttpHandler\Http2StreamException.cs" />
<Compile Include="System\Net\Http\SocketsHttpHandler\Http2StreamWindowManager.cs" />
<Compile Include="System\Net\Http\SocketsHttpHandler\Http3Connection.cs" />
<Compile Include="System\Net\Http\SocketsHttpHandler\Http3ConnectionException.cs" />
<Compile Include="System\Net\Http\SocketsHttpHandler\Http3ProtocolException.cs" />
Expand Down Expand Up @@ -416,6 +418,8 @@
Link="Common\Interop\Windows\WinHttp\Interop.winhttp_types.cs" />
<Compile Include="$(CommonPath)\Interop\Windows\WinHttp\Interop.winhttp.cs"
Link="Common\Interop\Windows\WinHttp\Interop.winhttp.cs" />
<Compile Include="$(CommonPath)\Interop\Windows\WinSock\Interop.WSAIoctl.TcpInfo.cs"
Link="Common\Interop\Windows\WinSock\Interop.WSAIoctl.TcpInfo.cs" />
<Compile Include="$(CommonPath)\System\CharArrayHelpers.cs"
Link="Common\System\CharArrayHelpers.cs" />
<Compile Include="$(CommonPath)\System\StringExtensions.cs"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ public bool UseCookies
set => throw new PlatformNotSupportedException();
}

public int InitialHttp2StreamWindowSize
{
get => throw new PlatformNotSupportedException();
set => throw new PlatformNotSupportedException();
}

[AllowNull]
public CookieContainer CookieContainer
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,25 +276,7 @@ private static class Settings

public static readonly bool s_activityPropagationEnabled = GetEnableActivityPropagationValue();

private static bool GetEnableActivityPropagationValue()
{
// First check for the AppContext switch, giving it priority over the environment variable.
if (AppContext.TryGetSwitch(EnableActivityPropagationAppCtxSettingName, out bool enableActivityPropagation))
{
return enableActivityPropagation;
}

// AppContext switch wasn't used. Check the environment variable to determine which handler should be used.
string? envVar = Environment.GetEnvironmentVariable(EnableActivityPropagationEnvironmentVariableSettingName);
if (envVar != null && (envVar.Equals("false", StringComparison.OrdinalIgnoreCase) || envVar.Equals("0")))
{
// Suppress Activity propagation.
return false;
}

// Defaults to enabling Activity propagation.
return true;
}
private static bool GetEnableActivityPropagationValue() => RuntimeSettingParser.QueryRuntimeSettingSwitch(EnableActivityPropagationAppCtxSettingName, EnableActivityPropagationEnvironmentVariableSettingName, true);

public static readonly DiagnosticListener s_diagnosticListener =
new DiagnosticListener(DiagnosticsHandlerLoggingStrings.DiagnosticListenerName);
Expand Down
Loading