コード例 #1
0
        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.");
            }
        }
コード例 #2
0
        /// <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.");
            }
        }
コード例 #3
0
 public static IServiceCollection EnableKubernetes(
     this IServiceCollection services,
     TimeSpan?timeout = null,
     IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null,
     Func <bool> detectKubernetes = null)
 {
     return(services.AddApplicationInsightsKubernetesEnricher(timeout, kubernetesServiceCollectionBuilder, detectKubernetes));
 }
コード例 #4
0
 public static void EnableKubernetes(
     this TelemetryConfiguration telemetryConfiguration,
     TimeSpan?timeout = null,
     IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null,
     Func <bool> detectKubernetes = null)
 {
     telemetryConfiguration.AddApplicationInsightsKubernetesEnricher(
         timeout, kubernetesServiceCollectionBuilder, detectKubernetes);
 }
コード例 #5
0
 public static IServiceCollection AddApplicationInsightsKubernetesEnricher(
     this IServiceCollection services,
     Action <AppInsightsForKubernetesOptions> applyOptions,
     IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder,
     Func <bool> detectKubernetes,
     ILogger <IKubernetesServiceCollectionBuilder> logger)
 {
     throw new NotImplementedException();
 }
コード例 #6
0
 /// <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);
 }
コード例 #7
0
 internal static IServiceCollection BuildK8sServiceCollection(
     IServiceCollection services,
     TimeSpan timeout,
     IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null)
 {
     kubernetesServiceCollectionBuilder = kubernetesServiceCollectionBuilder ?? new KubernetesServiceCollectionBuilder();
     Services = kubernetesServiceCollectionBuilder.InjectServices(services, timeout);
     return(Services);
 }
コード例 #8
0
 /// <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);
 }
コード例 #9
0
 /// <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);
 }
コード例 #10
0
        /// <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);
        }
コード例 #11
0
        private static void BuildK8sServiceCollection(
            IServiceCollection services,
            Func <bool> detectKubernetes,
            IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null)
        {
            detectKubernetes = detectKubernetes ?? IsRunningInKubernetes;
            kubernetesServiceCollectionBuilder = kubernetesServiceCollectionBuilder ??
                                                 new KubernetesServiceCollectionBuilder(detectKubernetes);

            kubernetesServiceCollectionBuilder.InjectServices(services);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
 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);
 }
コード例 #14
0
        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);
        }
コード例 #15
0
 /// <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);
     }));
 }
コード例 #16
0
        /// <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;
        }
コード例 #17
0
        /// <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.");
            }
        }
コード例 #18
0
        /// <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);
        }
コード例 #19
0
        /// <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);
        }