private static void SetupTelemetryConfiguration()

in src/Microsoft.Azure.WebJobs.Logging.ApplicationInsights/Extensions/ApplicationInsightsServiceCollectionExtensions.cs [300:421]


        private static void SetupTelemetryConfiguration(
            TelemetryConfiguration configuration,
            ApplicationInsightsLoggerOptions options,
            ITelemetryChannel channel,
            IEnumerable<ITelemetryInitializer> telemetryInitializers,
            IEnumerable<ITelemetryModule> telemetryModules,
            IApplicationIdProvider applicationIdProvider,
            LoggerFilterOptions filterOptions,
            IRoleInstanceProvider roleInstanceProvider,
            QuickPulseInitializationScheduler delayer,
            Action<TelemetryConfiguration> additionalTelemetryConfig)
        {
            if (options.ConnectionString != null)
            {
                configuration.ConnectionString = options.ConnectionString;
            }
            else if (options.InstrumentationKey != null)
            {
                configuration.InstrumentationKey = options.InstrumentationKey;
            }

            // Default is connection string based ingestion
            if (options.TokenCredentialOptions?.CreateTokenCredential() is TokenCredential credential)
            {
                configuration.SetAzureTokenCredential(credential);
            }

            configuration.TelemetryChannel = channel;

            foreach (ITelemetryInitializer initializer in telemetryInitializers)
            {
                if (!(initializer is NullTelemetryInitializer))
                {
                    configuration.TelemetryInitializers.Add(initializer);
                }
            }

            (channel as ServerTelemetryChannel)?.Initialize(configuration);

            QuickPulseTelemetryModule quickPulseModule = null;
            foreach (ITelemetryModule module in telemetryModules)
            {
                if (module is QuickPulseTelemetryModule telemetryModule)
                {
                    quickPulseModule = telemetryModule;
                    if (options.LiveMetricsAuthenticationApiKey != null)
                    {
                        quickPulseModule.AuthenticationApiKey = options.LiveMetricsAuthenticationApiKey;
                    }

                    quickPulseModule.ServerId = roleInstanceProvider?.GetRoleInstanceName();

                    // QuickPulse can have a startup performance hit, so delay its initialization.
                    delayer.ScheduleInitialization(() => module.Initialize(configuration), options.LiveMetricsInitializationDelay);
                }
                else if (module != null)
                {
                    module.Initialize(configuration);
                }
            }

            // Metrics extractor must be added before filtering and adaptive sampling telemetry processor to account for all the data.
            if (options.EnableAutocollectedMetricsExtractor)
            {
                configuration.TelemetryProcessorChainBuilder
                    .Use((next) => new AutocollectedMetricsExtractor(next));
            }

            QuickPulseTelemetryProcessor quickPulseProcessor = null;
            configuration.TelemetryProcessorChainBuilder
                .Use((next) => new OperationFilteringTelemetryProcessor(next));

            if (options.EnableLiveMetrics)
            {
                configuration.TelemetryProcessorChainBuilder.Use((next) =>
                {
                    quickPulseProcessor = new QuickPulseTelemetryProcessor(next);
                    return quickPulseProcessor;
                });
            }

            // No need to "late filter" as the logs will already be filtered before they are sent to the Logger.
            if (filterOptions != null)
            {
                configuration.TelemetryProcessorChainBuilder.Use((next) => new FilteringTelemetryProcessor(filterOptions, next));
            }

            if (options.SamplingSettings != null)
            {
                configuration.TelemetryProcessorChainBuilder.Use((next) =>
                {
                    if (options.EnableAdaptiveSamplingDelay)
                    {
                        return new DelayedSamplingProcessor(next, options);
                    }
                    else
                    {
                        return TelemetryProcessorFactory.CreateAdaptiveSamplingProcessor(options, next);
                    }
                });
            }

            additionalTelemetryConfig?.Invoke(configuration);

            if (options.SnapshotConfiguration != null)
            {
                configuration.TelemetryProcessorChainBuilder.UseSnapshotCollector(options.SnapshotConfiguration);
            }

            configuration.TelemetryProcessorChainBuilder.Build();
            quickPulseModule?.RegisterTelemetryProcessor(quickPulseProcessor);

            foreach (ITelemetryProcessor processor in configuration.TelemetryProcessors)
            {
                if (processor is ITelemetryModule module)
                {
                    module.Initialize(configuration);
                }
            }

            configuration.ApplicationIdProvider = applicationIdProvider;
        }