/// <summary> /// Injects Kubernetes related service into the service collection. /// </summary> /// <param name="serviceCollection">The service collector to inject the services into.</param> /// <param name="timeout">Maximum time to wait for spinning up the container.</param> /// <returns>Returns the service collector with services injected.</returns> public IServiceCollection InjectServices(IServiceCollection serviceCollection, TimeSpan timeout) { if (_isRunningInKubernetes()) { IServiceCollection services = serviceCollection ?? new ServiceCollection(); InjectCommonServices(services); InjectChangableServices(services); // Inject the telemetry initializer. services.AddSingleton <ITelemetryInitializer>(provider => { KubernetesTelemetryInitializer initializer = new KubernetesTelemetryInitializer( provider.GetRequiredService <IK8sEnvironmentFactory>(), timeout, SDKVersionUtils.Instance, provider.GetRequiredService <ILogger <KubernetesTelemetryInitializer> >() ); _logger.LogDebug("Application Insights Kubernetes injected the service successfully."); return(initializer); }); return(services); } else { _logger.LogWarning("Application is not running inside a Kubernetes cluster."); return(serviceCollection); } }
/// <summary> /// Gets the KubernetesTelemetryInitializer from the service collection and adds it into a TelemetryConfiguration instance. /// </summary> private static void AddKubernetesTelemetryInitializer(this TelemetryConfiguration telemetryConfiguration, IServiceCollection serviceCollection) { KubernetesTelemetryInitializer kubernetesTelemetryInitializer = null; if (KubernetesTelemetryInitializerExists(serviceCollection)) { IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); kubernetesTelemetryInitializer = serviceProvider.GetServices <ITelemetryInitializer>() .FirstOrDefault(ti => ti.GetType() == typeof(KubernetesTelemetryInitializer)) as KubernetesTelemetryInitializer; telemetryConfiguration.TelemetryInitializers.Add(kubernetesTelemetryInitializer); _logger.LogTrace("KubernetesTelemetryInitializer has been injected into telemetry configuration #{0}.", telemetryConfiguration.GetHashCode()); _logger.LogInformation("KubernetesTelemetryInitializer is injected."); } else { _logger.LogError("No KubernetesTelemetryInitializer to append to TelemetryConfiguration."); } }