public static void AddApplicationInsightsKubernetesEnricher( this TelemetryConfiguration telemetryConfiguration, Action <AppInsightsForKubernetesOptions> applyOptions = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null, Func <bool> detectKubernetes = null, ILogger <IKubernetesServiceCollectionBuilder> logger = null) { IServiceCollection standaloneServiceCollection = new ServiceCollection(); standaloneServiceCollection = standaloneServiceCollection.AddApplicationInsightsKubernetesEnricher( applyOptions, kubernetesServiceCollectionBuilder, detectKubernetes, logger); // Static class can't used as generic types. IServiceProvider serviceProvider = standaloneServiceCollection.BuildServiceProvider(); ITelemetryInitializer k8sTelemetryInitializer = serviceProvider.GetServices <ITelemetryInitializer>() .FirstOrDefault(ti => ti is KubernetesTelemetryInitializer); if (k8sTelemetryInitializer != null) { telemetryConfiguration.TelemetryInitializers.Add(k8sTelemetryInitializer); logger?.LogInformation($"{nameof(KubernetesTelemetryInitializer)} is injected."); } else { logger?.LogError($"Getting ${nameof(KubernetesTelemetryInitializer)} from the service provider failed."); } }
/// <summary> /// Enables Application Insights Kubernetes for a given TelemetryConfiguration. /// </summary> /// <remarks> /// The use of AddApplicationInsightsKubernetesEnricher() on the ServiceCollection is always preferred unless you have more than one TelemetryConfiguration /// instance, or if you are using Application Insights from a non ASP.NET environment, like a console app. /// </remarks> public static void AddApplicationInsightsKubernetesEnricher( this TelemetryConfiguration telemetryConfiguration, TimeSpan?timeout = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null, Func <bool> detectKubernetes = null) { IServiceCollection standaloneServiceCollection = new ServiceCollection(); standaloneServiceCollection = EnableKubernetesImpl(standaloneServiceCollection, detectKubernetes, kubernetesServiceCollectionBuilder, null, timeout); // Static class can't used as generic types. ILogger logger = standaloneServiceCollection.GetLogger <IKubernetesServiceCollectionBuilder>(); IServiceProvider serviceProvider = standaloneServiceCollection.BuildServiceProvider(); ITelemetryInitializer k8sTelemetryInitializer = serviceProvider.GetServices <ITelemetryInitializer>() .FirstOrDefault(ti => ti is KubernetesTelemetryInitializer); if (k8sTelemetryInitializer != null) { telemetryConfiguration.TelemetryInitializers.Add(k8sTelemetryInitializer); } else { logger.LogError($"Getting ${nameof(KubernetesTelemetryInitializer)} from the service provider failed."); } }
public static IServiceCollection EnableKubernetes( this IServiceCollection services, TimeSpan?timeout = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null, Func <bool> detectKubernetes = null) { return(services.AddApplicationInsightsKubernetesEnricher(timeout, kubernetesServiceCollectionBuilder, detectKubernetes)); }
public static void EnableKubernetes( this TelemetryConfiguration telemetryConfiguration, TimeSpan?timeout = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null, Func <bool> detectKubernetes = null) { telemetryConfiguration.AddApplicationInsightsKubernetesEnricher( timeout, kubernetesServiceCollectionBuilder, detectKubernetes); }
public static IServiceCollection AddApplicationInsightsKubernetesEnricher( this IServiceCollection services, Action <AppInsightsForKubernetesOptions> applyOptions, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder, Func <bool> detectKubernetes, ILogger <IKubernetesServiceCollectionBuilder> logger) { throw new NotImplementedException(); }
/// <summary> /// Enable Application Insights Kubernetes for the Default TelemtryConfiguration in the dependency injection system. /// </summary> /// <param name="services"></param> /// <param name="timeout"></param> /// <param name="kubernetesServiceCollectionBuilder"></param> /// <returns></returns> public static IServiceCollection EnableKubernetes( this IServiceCollection services, TimeSpan?timeout = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null) { // Inject of the service shall return immediately. EnableKubernetesImpl(services, timeout, kubernetesServiceCollectionBuilder); return(services); }
internal static IServiceCollection BuildK8sServiceCollection( IServiceCollection services, TimeSpan timeout, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null) { kubernetesServiceCollectionBuilder = kubernetesServiceCollectionBuilder ?? new KubernetesServiceCollectionBuilder(); Services = kubernetesServiceCollectionBuilder.InjectServices(services, timeout); return(Services); }
/// <summary> /// Enables Application Insights for Kubernetes on the Default TelemtryConfiguration in the dependency injection system. /// </summary> /// <param name="services">Collection of service descriptors.</param> /// <param name="timeout">Maximum time to wait for spinning up the container.</param> /// <param name="kubernetesServiceCollectionBuilder">Collection builder.</param> /// <param name="detectKubernetes">Delegate to detect if the current application is running in Kubernetes hosted container.</param> /// <returns>The collection of services descriptors we injected into.</returns> public static IServiceCollection AddApplicationInsightsKubernetesEnricher( this IServiceCollection services, TimeSpan?timeout = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null, Func <bool> detectKubernetes = null) { // Inject of the service shall return immediately. EnableKubernetesImpl(services, detectKubernetes, kubernetesServiceCollectionBuilder, null, timeout); return(services); }
/// <summary> /// Configure the KubernetesTelemetryInitializer and its dependencies. /// </summary> internal static void ConfigureKubernetesTelemetryInitializer(IServiceCollection serviceCollection, Func <bool> detectKubernetes, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder, Action <AppInsightsForKubernetesOptions> applyOptions) { BuildServiceBases(serviceCollection, applyOptions); BuildK8sServiceCollection( serviceCollection, detectKubernetes, kubernetesServiceCollectionBuilder: kubernetesServiceCollectionBuilder); }
/// <summary> /// Enables Application Insights Kubernetes for a given TelemetryConfiguration. /// </summary> /// <param name="telemetryConfiguration">Sets the telemetry configuration to add the telemetry initializer to.</param> /// <param name="applyOptions">Sets a delegate to apply the configuration for the telemetry initializer.</param> /// <param name="kubernetesServiceCollectionBuilder">Sets a service collection builder.</param> /// <param name="detectKubernetes">Sets a delegate to detect if the current application is running in Kubernetes hosted container.</param> public static void AddApplicationInsightsKubernetesEnricher( this TelemetryConfiguration telemetryConfiguration, Action <AppInsightsForKubernetesOptions> applyOptions = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null, Func <bool> detectKubernetes = null) { IServiceCollection standaloneServiceCollection = new ServiceCollection(); ConfigureKubernetesTelemetryInitializer(standaloneServiceCollection, detectKubernetes, kubernetesServiceCollectionBuilder, applyOptions); telemetryConfiguration.AddKubernetesTelemetryInitializer(standaloneServiceCollection); }
private static void BuildK8sServiceCollection( IServiceCollection services, Func <bool> detectKubernetes, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null) { detectKubernetes = detectKubernetes ?? IsRunningInKubernetes; kubernetesServiceCollectionBuilder = kubernetesServiceCollectionBuilder ?? new KubernetesServiceCollectionBuilder(detectKubernetes); kubernetesServiceCollectionBuilder.InjectServices(services); }
private static void BuildK8sServiceCollection( IServiceCollection services, Func <bool> detectKubernetes, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null) { detectKubernetes = detectKubernetes ?? IsRunningInKubernetes; var options = services.BuildServiceProvider().GetRequiredService <IOptions <AppInsightsForKubernetesOptions> >(); kubernetesServiceCollectionBuilder = kubernetesServiceCollectionBuilder ?? new KubernetesServiceCollectionBuilder(detectKubernetes, options); kubernetesServiceCollectionBuilder.InjectServices(services); }
private static IServiceCollection BuildK8sServiceCollection( IServiceCollection services, TimeSpan timeout, Func <bool> detectKubernetes, ILogger <KubernetesServiceCollectionBuilder> logger, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null) { detectKubernetes = detectKubernetes ?? IsRunningInKubernetes; kubernetesServiceCollectionBuilder = kubernetesServiceCollectionBuilder ?? new KubernetesServiceCollectionBuilder(detectKubernetes, logger); services = kubernetesServiceCollectionBuilder.InjectServices(services, timeout); return(services); }
public static IServiceCollection EnableKubernetes( this IServiceCollection services, TimeSpan?timeout = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null) { // Dispatch this on a differnet thread to avoid blocking the main thread. // Mainly used with K8s Readness Probe enabled, where communicating with Server will temperory be blocked. // TODO: Instead of query the server on the start, we should depend on watch services to provide dynamic realtime data. Task.Run(() => { KubernetesModule.EnableKubernetes(services, timeout, kubernetesServiceCollectionBuilder); }); return(services); }
/// <summary> /// Enables Application Insights for Kubernetes on the Default TelemetryConfiguration in the dependency injection system with custom options and debugging components. /// </summary> /// <param name="services">Collection of service descriptors.</param> /// <param name="applyOptions">Action to customize the configuration of Application Insights for Kubernetes.</param> /// <param name="kubernetesServiceCollectionBuilder">Sets the service collection builder for Application Insights for Kubernetes to overwrite the default one.</param> /// <param name="detectKubernetes">Sets a delegate overwrite the default detector of the Kubernetes environment.</param> /// <returns>The service collection for chaining the next operation.</returns> public static IServiceCollection AddApplicationInsightsKubernetesEnricher( this IServiceCollection services, Action <AppInsightsForKubernetesOptions> applyOptions, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder, Func <bool> detectKubernetes) { return(services.Configure <TelemetryConfiguration>((config) => { if (!KubernetesTelemetryInitializerExists(services)) { ConfigureKubernetesTelemetryInitializer(services, detectKubernetes, kubernetesServiceCollectionBuilder, applyOptions); } config.AddKubernetesTelemetryInitializer(services); })); }
/// <summary> /// Enable applicaiton insights for kubernetes. /// </summary> /// <param name="loggerFactory"></param> /// <param name="timeout"></param> public static void EnableKubernetes(IServiceCollection serviceCollection, TimeSpan?timeout = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null) { // 2 minutes maximum to spin up the container. timeout = timeout ?? TimeSpan.FromMinutes(2); IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); ILogger logger = serviceProvider.GetService <ILogger <KubernetesModule> >(); logger.LogInformation(Invariant($"ApplicationInsights.Kubernetes.Version:{SDKVersionUtils.Instance.CurrentSDKVersion}")); try { serviceCollection = BuildK8sServiceCollection(serviceCollection, timeout.Value, kubernetesServiceCollectionBuilder); } catch (Exception ex) { logger.LogError("Failed to fetch ApplicaitonInsights.Kubernetes' version info. Details" + ex.ToString()); } _isInitialized = true; }
/// <summary> /// Enable Application Insights Kubernetes for a given TelemetryConfiguration. /// Note: The use of EnableKubernetes() on the ServiceCollection is always preferred unless you have more than one /// TelemetryConfiguration instances. /// </summary> public static void EnableKubernetes( this TelemetryConfiguration telemetryConfiguration, TimeSpan?timeout = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null) { IServiceCollection standaloneServiceCollection = new ServiceCollection(); standaloneServiceCollection = EnableKubernetesImpl(standaloneServiceCollection, timeout, kubernetesServiceCollectionBuilder); IServiceProvider serviceProvider = standaloneServiceCollection.BuildServiceProvider(); ITelemetryInitializer k8sTelemetryInitializer = serviceProvider.GetServices <ITelemetryInitializer>() .FirstOrDefault(ti => ti is KubernetesTelemetryInitializer); if (k8sTelemetryInitializer != null) { telemetryConfiguration.TelemetryInitializers.Add(k8sTelemetryInitializer); } else { _logger.LogError($"Getting ${nameof(KubernetesTelemetryInitializer)} from the service provider failed."); } }
/// <summary> /// Enables applicaiton insights for kubernetes. /// </summary> private static IServiceCollection EnableKubernetesImpl(IServiceCollection serviceCollection, Func <bool> detectKubernetes, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder, ILogger <KubernetesServiceCollectionBuilder> logger = null, TimeSpan?timeout = null) { logger = logger ?? serviceCollection.GetLogger <KubernetesServiceCollectionBuilder>(); // 2 minutes by default maximum to wait for spinning up the container. timeout = timeout ?? TimeSpan.FromMinutes(2); logger.LogInformation(Invariant($"ApplicationInsights.Kubernetes.Version:{SDKVersionUtils.Instance.CurrentSDKVersion}")); try { serviceCollection = BuildK8sServiceCollection(serviceCollection, timeout.Value, detectKubernetes, logger, kubernetesServiceCollectionBuilder); } catch (Exception ex) { logger.LogError("Failed to fetch ApplicaitonInsights.Kubernetes' info. Details " + ex.ToString()); } return(serviceCollection); }
/// <summary> /// Enable applicaiton insights for kubernetes. /// </summary> private static IServiceCollection EnableKubernetesImpl(IServiceCollection serviceCollection, TimeSpan?timeout = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null) { // 2 minutes by default maximum to wait for spinning up the container. timeout = timeout ?? TimeSpan.FromMinutes(2); // According to the code, adding logging will not overwrite existing logging classes // https://github.com/aspnet/Logging/blob/c821494678a30c323174bea8056f43b93a3ca6f4/src/Microsoft.Extensions.Logging/LoggingServiceCollectionExtensions.cs // Becuase it uses 'TryAdd()' extenion method on service collection. serviceCollection.AddLogging(); _logger.LogInformation(Invariant($"ApplicationInsights.Kubernetes.Version:{SDKVersionUtils.Instance.CurrentSDKVersion}")); try { serviceCollection = BuildK8sServiceCollection(serviceCollection, timeout.Value, kubernetesServiceCollectionBuilder); } catch (Exception ex) { _logger.LogError("Failed to fetch ApplicaitonInsights.Kubernetes' info. Details " + ex.ToString()); } return(serviceCollection); }