/// <summary> /// Creates an instance of the <see cref="AgentManager"/> class./> /// </summary> /// <remarks> /// The agent should be constructed as early as possible in order to perform /// initialization of the logging system. /// </remarks> private AgentManager() { _container = AgentServices.GetContainer(); AgentServices.RegisterServices(_container); // Resolve IConfigurationService (so that it starts listening to config changes) before loading newrelic.config _container.Resolve <IConfigurationService>(); var config = ConfigurationLoader.Initialize(); LoggerBootstrapper.ConfigureLogger(config.LogConfig); AssertAgentEnabled(config); EventBus <KillAgentEvent> .Subscribe(OnShutdownAgent); //Initialize the extensions loader with extensions folder based on the the install path ExtensionsLoader.Initialize(AgentInstallConfiguration.InstallPathExtensionsDirectory); // Resolve all services once we've ensured that the agent is enabled // The AgentApiImplementation needs to be resolved before the WrapperService, because // resolving the WrapperService triggers an agent connect but it doesn't instantiate // the CustomEventAggregator, so we need to resolve the AgentApiImplementation to // get the CustomEventAggregator instantiated before the connect process is triggered. // If that doesn't happen the CustomEventAggregator will not start its harvest timer // when the agent connect response comes back. The agent DI, startup, and connect // process really needs to be refactored so that it's more explicit in its behavior. var agentApi = _container.Resolve <IAgentApi>(); _wrapperService = _container.Resolve <IWrapperService>(); //We need to attempt to auto start the agent once all services have resolved _container.Resolve <IConnectionManager>().AttemptAutoStart(); AgentServices.StartServices(_container); // Setup the internal API first so that AgentApi can use it. InternalApi.SetAgentApiImplementation(agentApi); AgentApi.SetSupportabilityMetricCounters(_container.Resolve <IApiSupportabilityMetricCounters>()); Initialize(); _isInitialized = true; }