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;
}