Exemplo n.º 1
0
        /// <summary>
        /// Closes the current scope and makes its parent scope active
        /// </summary>
        internal void Close()
        {
            _scopeManager.Close(this);

            if (_finishOnClose)
            {
                Span.Finish();
            }
        }
        /// <summary>
        /// OnMethodEnd callback
        /// </summary>
        /// <typeparam name="TTarget">Type of the target</typeparam>
        /// <typeparam name="TReturn">Type of the return value</typeparam>
        /// <param name="instance">Instance value, aka `this` of the instrumented method.</param>
        /// <param name="returnValue">Task of HttpResponse message instance</param>
        /// <param name="exception">Exception instance in case the original code threw an exception.</param>
        /// <param name="state">Calltarget state value</param>
        /// <returns>A response value, in an async scenario will be T of Task of T</returns>
        public static CallTargetReturn <TReturn> OnMethodEnd <TTarget, TReturn>(TTarget instance, TReturn returnValue, Exception exception, CallTargetState state)
        {
            IntegrationState integrationState = (IntegrationState)state.State;

            if (integrationState.Scope != null)
            {
                // Before returning the control flow we need to restore the parent Scope setted by ScopeFactory.CreateOutboundHttpScope
                // This doesn't affect to OnAsyncMethodEnd async continuation, an ExecutionContext is captured
                // by the inner await.
                IScopeManager scopeManager = ((IDatadogTracer)Tracer.Instance).ScopeManager;
                if (scopeManager.Active == integrationState.Scope)
                {
                    scopeManager.Close(integrationState.Scope);
                }
            }

            return(new CallTargetReturn <TReturn>(returnValue));
        }