/// <inheritdoc /> public TestAgentComponents( IApmLogger logger = null, IConfiguration configuration = null, IPayloadSender payloadSender = null, ICurrentExecutionSegmentsContainer currentExecutionSegmentsContainer = null, ICentralConfigurationFetcher centralConfigurationFetcher = null, IApmServerInfo apmServerInfo = null ) : base( logger ?? new NoopLogger(), configuration ?? new MockConfiguration(logger ?? new NoopLogger()), payloadSender ?? new MockPayloadSender(), new FakeMetricsCollector(), currentExecutionSegmentsContainer, centralConfigurationFetcher ?? new NoopCentralConfigurationFetcher(), apmServerInfo ?? MockApmServerInfo.Version710 ) { }
internal AgentComponents( IApmLogger logger, IConfigurationReader configurationReader, IPayloadSender payloadSender, IMetricsCollector metricsCollector, ICurrentExecutionSegmentsContainer currentExecutionSegmentsContainer, ICentralConfigurationFetcher centralConfigurationFetcher, IApmServerInfo apmServerInfo, BreakdownMetricsProvider breakdownMetricsProvider = null ) { try { var tempLogger = logger ?? ConsoleLogger.LoggerOrDefault(configurationReader?.LogLevel); ConfigurationReader = configurationReader ?? new EnvironmentConfigurationReader(tempLogger); Logger = logger ?? ConsoleLogger.LoggerOrDefault(ConfigurationReader.LogLevel); Service = Service.GetDefaultService(ConfigurationReader, Logger); var systemInfoHelper = new SystemInfoHelper(Logger); var system = systemInfoHelper.GetSystemInfo(ConfigurationReader.HostName); ConfigurationStore = new ConfigurationStore(new ConfigurationSnapshotFromReader(ConfigurationReader, "local"), Logger); ApmServerInfo = apmServerInfo ?? new ApmServerInfo(); PayloadSender = payloadSender ?? new PayloadSenderV2(Logger, ConfigurationStore.CurrentSnapshot, Service, system, ApmServerInfo, isEnabled: ConfigurationReader.Enabled); if (ConfigurationReader.Enabled) { breakdownMetricsProvider ??= new BreakdownMetricsProvider(Logger); } HttpTraceConfiguration = new HttpTraceConfiguration(); SubscribedListeners = new HashSet <Type>(); // initialize the tracer before central configuration or metric collection is started TracerInternal = new Tracer(Logger, Service, PayloadSender, ConfigurationStore, currentExecutionSegmentsContainer ?? new CurrentExecutionSegmentsContainer(), ApmServerInfo, breakdownMetricsProvider); if (ConfigurationReader.Enabled) { CentralConfigurationFetcher = centralConfigurationFetcher ?? new CentralConfigurationFetcher(Logger, ConfigurationStore, Service); MetricsCollector = metricsCollector ?? new MetricsCollector(Logger, PayloadSender, ConfigurationStore, breakdownMetricsProvider); MetricsCollector.StartCollecting(); } else { Logger.Info()?.Log("The Elastic APM .NET Agent is disabled - the agent won't capture traces and metrics."); } TracerInternal = new Tracer(Logger, Service, PayloadSender, ConfigurationStore, currentExecutionSegmentsContainer ?? new CurrentExecutionSegmentsContainer(), ApmServerInfo, breakdownMetricsProvider); if (ConfigurationReader.EnableOpenTelemetryBridge) { #if NET5_0 || NET6_0 if (ApmServerInfo.Version >= new ElasticVersion(7, 16, 0, string.Empty)) { new OpenTelemetry.ElasticActivityListener(this, TracerInternal); } else { Logger.Warning()?.Log("OpenTelemetry (Activity) bridge is only supported with APM Server 7.16.0 or newer - bridge won't be enabled.."); } #else Logger.Warning()?.Log("OpenTelemetry (Activity) bridge is only supported on .NET5 or newer - bridge won't be enabled."); #endif } } catch (Exception e) { Logger.Error()?.LogException(e, "Failed initializing agent."); } }
internal AgentComponents( IApmLogger logger, IConfigurationReader configurationReader, IPayloadSender payloadSender, IMetricsCollector metricsCollector, ICurrentExecutionSegmentsContainer currentExecutionSegmentsContainer, ICentralConfigurationFetcher centralConfigurationFetcher, IApmServerInfo apmServerInfo, BreakdownMetricsProvider breakdownMetricsProvider = null ) { try { var tempLogger = logger ?? ConsoleLogger.LoggerOrDefault(configurationReader?.LogLevel); ConfigurationReader = configurationReader ?? new EnvironmentConfigurationReader(tempLogger); Logger = logger ?? ConsoleLogger.LoggerOrDefault(ConfigurationReader.LogLevel); Service = Service.GetDefaultService(ConfigurationReader, Logger); var systemInfoHelper = new SystemInfoHelper(Logger); var system = systemInfoHelper.GetSystemInfo(ConfigurationReader.HostName); ConfigurationStore = new ConfigurationStore(new ConfigurationSnapshotFromReader(ConfigurationReader, "local"), Logger); ApmServerInfo = apmServerInfo ?? new ApmServerInfo(); // Called by PayloadSenderV2 after the ServerInfo is fetched Action <bool, IApmServerInfo> serverInfoCallback = null; #if NET5_0 || NET6_0 ElasticActivityListener activityListener = null; if (ConfigurationReader.EnableOpenTelemetryBridge) { activityListener = new OpenTelemetry.ElasticActivityListener(this); serverInfoCallback = (success, serverInfo) => { if (success) { if (serverInfo.Version >= new ElasticVersion(7, 16, 0, string.Empty)) { Logger.Info() ?.Log("APM Server version ready - OpenTelemetry (Activity) bridge is active. Current Server version: {version}", serverInfo.Version.ToString()); } else { Logger.Warning() ?.Log( "OpenTelemetry (Activity) bridge is only supported with APM Server 7.16.0 or newer - bridge won't be enabled. Current Server version: {version}", serverInfo.Version.ToString()); activityListener?.Dispose(); } } else { Logger.Warning() ?.Log( "Unable to read server version - OpenTelemetry (Activity) bridge is only supported with APM Server 7.16.0 or newer. " + "The bridge remains active, but due to unknown server version it may not work as expected."); } }; } #endif PayloadSender = payloadSender ?? new PayloadSenderV2(Logger, ConfigurationStore.CurrentSnapshot, Service, system, ApmServerInfo, isEnabled: ConfigurationReader.Enabled, serverInfoCallback: serverInfoCallback); if (ConfigurationReader.Enabled) { breakdownMetricsProvider ??= new BreakdownMetricsProvider(Logger); } HttpTraceConfiguration = new HttpTraceConfiguration(); SubscribedListeners = new HashSet <Type>(); // initialize the tracer before central configuration or metric collection is started TracerInternal = new Tracer(Logger, Service, PayloadSender, ConfigurationStore, currentExecutionSegmentsContainer ?? new CurrentExecutionSegmentsContainer(), ApmServerInfo, breakdownMetricsProvider); #if NET5_0 || NET6_0 if (ConfigurationReader.EnableOpenTelemetryBridge) { // If the server version is not known yet, we enable the listener - and then the callback will do the version check once we have the version if (ApmServerInfo.Version == null || ApmServerInfo?.Version == new ElasticVersion(0, 0, 0, null)) { activityListener?.Start(TracerInternal); } // Otherwise do a version check else if (ApmServerInfo.Version >= new ElasticVersion(7, 16, 0, string.Empty)) { Logger.Info() ?.Log("Starting OpenTelemetry (Activity) bridge"); activityListener?.Start(TracerInternal); } else { Logger.Warning() ?.Log( "OpenTelemetry (Activity) bridge is only supported with APM Server 7.16.0 or newer - bridge won't be enabled. Current Server version: {version}", ApmServerInfo.Version.ToString()); activityListener?.Dispose(); } } #endif if (ConfigurationReader.Enabled) { CentralConfigurationFetcher = centralConfigurationFetcher ?? new CentralConfigurationFetcher(Logger, ConfigurationStore, Service); MetricsCollector = metricsCollector ?? new MetricsCollector(Logger, PayloadSender, ConfigurationStore, breakdownMetricsProvider); MetricsCollector.StartCollecting(); } else { Logger.Info()?.Log("The Elastic APM .NET Agent is disabled - the agent won't capture traces and metrics."); } } catch (Exception e) { Logger.Error()?.LogException(e, "Failed initializing agent."); } }