Esempio n. 1
0
        public WrapperMap(IEnumerable <IWrapper> wrappers, IDefaultWrapper defaultWrapper, INoOpWrapper noOpWrapper)
        {
            _nonDefaultWrappers = wrappers
                                  .Where(wrapper => wrapper != null)
                                  .Where(wrapper => !(wrapper is IDefaultWrapper) && !(wrapper is INoOpWrapper))
                                  .ToList();

            _nonDefaultWrappers.Add(new AttachToAsyncWrapper());
            _nonDefaultWrappers.Add(new DetachWrapper());
            _nonDefaultWrappers.Add(new CustomSegmentWrapper());
            _nonDefaultWrappers.Add(new IgnoreTransactionWrapper());
            _nonDefaultWrappers.Add(new MultithreadedTrackingWrapper());
            _nonDefaultWrappers.Add(new OtherTransactionWrapper());

            // This allows instrumentation that does nothing other than to track the library version.
            _nonDefaultWrappers.Add(noOpWrapper);

            var defaultWrappers = new List <IDefaultWrapper> {
                defaultWrapper, new DefaultWrapperAsync()
            };

            _defaultWrappers = defaultWrappers;

            _noOpTrackedWrapper = new TrackedWrapper(noOpWrapper);

            if (wrappers.Count() == 0)
            {
                Log.Error("No wrappers were loaded.  The agent will not behave as expected.");
            }

            if (Log.IsFinestEnabled)
            {
                Log.Finest($"WrapperMap has NonDefaultWrappers: {string.Join(", ", _nonDefaultWrappers)}");
            }
        }
        public void BeforeWrappedMethod_SetsNoOpWhenThrowsExceptionTooManyTimes()
        {
            var wrapper        = Mock.Create <IWrapper>();
            var trackedWrapper = new TrackedWrapper(wrapper);

            var wrapperMap = new WrapperMap(new List <IWrapper> {
                wrapper
            }, _defaultWrapper, _noOpWrapper);

            Mock.Arrange(() => wrapper.BeforeWrappedMethod(Arg.IsAny <InstrumentedMethodCall>(), Arg.IsAny <IAgent>(), Arg.IsAny <ITransaction>())).Throws(new Exception());
            Mock.Arrange(() => _configurationService.Configuration.WrapperExceptionLimit).Returns(1);
            Mock.Arrange(() => _noOpWrapper.BeforeWrappedMethod(Arg.IsAny <InstrumentedMethodCall>(), Arg.IsAny <IAgent>(), Arg.IsAny <ITransaction>())).OccursOnce();

            var          type              = typeof(System.Web.HttpApplication);
            const string methodName        = "ExecuteStep";
            const string tracerFactoryName = "NewRelic.Agent.Core.Tracer.Factories.DefaultTracerFactory";
            var          invocationTarget  = new object();
            var          arguments         = new object[2];
            var          argumentSignature = "IExecutionStep,System.Boolean&";
            var          metricName        = string.Empty;

            var method     = new Method(type, methodName, argumentSignature);
            var methodCall = new MethodCall(method, invocationTarget, arguments);
            var info       = new InstrumentedMethodInfo(0, methodCall.Method, tracerFactoryName, false, null, null, false);

            Mock.Arrange(() => wrapper.CanWrap(info)).Returns(new CanWrapResponse(true));

            var wrapperService = new WrapperService(_configurationService, wrapperMap, _agent, _agentHealthReporter, _agentTimerService);

            Assert.Throws <Exception>(() => wrapperService.BeforeWrappedMethod(type, methodName, argumentSignature, invocationTarget, arguments, tracerFactoryName, metricName, EmptyTracerArgs, 0));
            Assert.DoesNotThrow(() => wrapperService.BeforeWrappedMethod(type, methodName, argumentSignature, invocationTarget, arguments, tracerFactoryName, metricName, EmptyTracerArgs, 0));
            Mock.Assert(_noOpWrapper);
        }
        private void HandleBeforeWrappedMethodException(ulong functionId, TrackedWrapper trackedWrapper, InstrumentedMethodCall instrumentedMethodCall, InstrumentedMethodInfo instrumetedMethodInfo)
        {
            trackedWrapper.NoticeFailure();

            if (trackedWrapper.NumberOfConsecutiveFailures >= _maxConsecutiveFailures)
            {
                _agentHealthReporter.ReportWrapperShutdown(trackedWrapper.Wrapper, instrumentedMethodCall.MethodCall.Method);
                _functionIdToWrapper[functionId] = new InstrumentedMethodInfoWrapper(instrumetedMethodInfo, _wrapperMap.GetNoOpWrapper());
            }
        }
        public void BeforeWrappedMethod_DoesNotSetNullOnFirstThrownException()
        {
            var wrapper        = Mock.Create <IWrapper>();
            var trackedWrapper = new TrackedWrapper(wrapper);

            Mock.Arrange(() => wrapper.BeforeWrappedMethod(Arg.IsAny <InstrumentedMethodCall>(), Arg.IsAny <IAgent>(), Arg.IsAny <ITransaction>())).Throws(new Exception());
            Mock.Arrange(() => _wrapperMap.Get(Arg.IsAny <InstrumentedMethodInfo>())).Returns(trackedWrapper);

            var          type              = typeof(Class_WrapperService);
            const string methodName        = "MyMethod";
            const string tracerFactoryName = "MyTracer";
            var          target            = new object();
            var          arguments         = new object[0];

            Assert.Throws <Exception>(() => _wrapperService.BeforeWrappedMethod(type, methodName, string.Empty, target, arguments, tracerFactoryName, null, EmptyTracerArgs, 0));

            Mock.Assert(_wrapperMap);
        }
 public InstrumentedMethodInfoWrapper(InstrumentedMethodInfo instrumentedMethodInfo, TrackedWrapper wrapper)
 {
     this.wrapper = wrapper;
     this.instrumentedMethodInfo = instrumentedMethodInfo;
 }