diff --git a/src/Agent/NewRelic/Agent/Extensions/NewRelic.Agent.Extensions/Api/ITransaction.cs b/src/Agent/NewRelic/Agent/Extensions/NewRelic.Agent.Extensions/Api/ITransaction.cs index ea0f22e041..c8fd50cfaf 100644 --- a/src/Agent/NewRelic/Agent/Extensions/NewRelic.Agent.Extensions/Api/ITransaction.cs +++ b/src/Agent/NewRelic/Agent/Extensions/NewRelic.Agent.Extensions/Api/ITransaction.cs @@ -165,6 +165,10 @@ ISegment StartMessageBrokerSegment(MethodCall methodCall, MessageBrokerDestinati /// /// Detatches the transaction from each non-async active context storage. This is necessary when async tracking needs to continue but /// the primary context(s) the transaction may be stored can continue to persist, such as thread static or thread local storgage. + /// + /// Warning: This method should only be called at the start of the transaction, before any other segments are created. + /// If called partway through the transaction, this can result in "Transaction was garbage collected without ever ending" errors. + /// /// void DetachFromPrimary(); diff --git a/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/AwsSdk/AwsSdkPipelineWrapper.cs b/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/AwsSdk/AwsSdkPipelineWrapper.cs index bc772687c1..e6472ab852 100644 --- a/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/AwsSdk/AwsSdkPipelineWrapper.cs +++ b/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/AwsSdk/AwsSdkPipelineWrapper.cs @@ -30,7 +30,6 @@ public AfterWrappedMethodDelegate BeforeWrappedMethod(InstrumentedMethodCall ins if (isAsync) { transaction.AttachToAsync(); - transaction.DetachFromPrimary(); //Remove from thread-local type storage } // Get the IRequestContext diff --git a/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/Bedrock/InvokeModelAsyncWrapper.cs b/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/Bedrock/InvokeModelAsyncWrapper.cs index 83373045c8..6cf120bd17 100644 --- a/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/Bedrock/InvokeModelAsyncWrapper.cs +++ b/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/Bedrock/InvokeModelAsyncWrapper.cs @@ -40,7 +40,6 @@ public AfterWrappedMethodDelegate BeforeWrappedMethod(InstrumentedMethodCall ins if (instrumentedMethodCall.IsAsync) { transaction.AttachToAsync(); - transaction.DetachFromPrimary(); //Remove from thread-local type storage } dynamic invokeModelRequest = instrumentedMethodCall.MethodCall.MethodArguments[0]; diff --git a/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/Elasticsearch/RequestWrapper.cs b/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/Elasticsearch/RequestWrapper.cs index a74cd6042f..f44c1a7fd7 100644 --- a/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/Elasticsearch/RequestWrapper.cs +++ b/src/Agent/NewRelic/Agent/Extensions/Providers/Wrapper/Elasticsearch/RequestWrapper.cs @@ -45,8 +45,6 @@ public AfterWrappedMethodDelegate BeforeWrappedMethod(InstrumentedMethodCall ins if (isAsync) { transaction.AttachToAsync(); - transaction.DetachFromPrimary(); //Remove from thread-local type storage - var parameterTypeNamesList = instrumentedMethodCall.InstrumentedMethodInfo.Method.ParameterTypeNames.Split(','); if (parameterTypeNamesList[4] == "Elasticsearch.Net.IRequestParameters") {