public void Initialize(ITelemetry telemetry)
        {
            IK8sEnvironment k8sEnv = _k8sEnvironment;

            if (k8sEnv != null)
            {
                _logger.LogTrace("Application Insights for Kubernetes telemetry initializer is invoked.", k8sEnv.PodName);
                try
                {
                    InitializeTelemetry(telemetry, k8sEnv);
                }
#pragma warning disable CA1031 // Do not catch general exception types
                catch (Exception ex)
                {
                    _logger.LogError(ex.ToString());
                }
#pragma warning restore CA1031 // Do not catch general exception types
            }
            else
            {
                _logger.LogTrace("Application Insights for Kubernetes telemetry initializer is used but the content has not ready yet.");

                if (_isK8sQueryTimeout)
                {
                    if (!_isK8sQueryTimeoutReported)
                    {
                        _isK8sQueryTimeoutReported = true;
                        _logger.LogError("Query Kubernetes Environment timeout.");
                    }
                }
            }

            telemetry.Context.GetInternalContext().SdkVersion = _sdkVersionUtils.CurrentSDKVersion;
        }
Example #2
0
 public KubernetesTelemetryInitializer(
     IK8sEnvironment k8sEnv,
     ILogger <KubernetesTelemetryInitializer> logger)
 {
     _logger             = logger;
     this.K8sEnvironment = Arguments.IsNotNull(k8sEnv, nameof(k8sEnv));
 }
Example #3
0
#pragma warning disable CA2222 // Do not decrease inherited member visibility
        internal KubernetesTelemetryInitializer(
#pragma warning restore CA2222 // Do not decrease inherited member visibility
            ILoggerFactory loggerFactory,
            IK8sEnvironment env)
        {
            this.logger         = loggerFactory?.CreateLogger <KubernetesTelemetryInitializer>();
            this.K8sEnvironment = env ?? Kubernetes.K8sEnvironment.CreateAsync(
                TimeSpan.FromMinutes(2), loggerFactory).ConfigureAwait(false).GetAwaiter().GetResult();
        }
Example #4
0
        public void Initialize(ITelemetry telemetry)
        {
            IK8sEnvironment k8sEnv = _k8sEnvironment;

            if (k8sEnv != null)
            {
                _logger.LogTrace("Application Insights for Kubernetes telemetry initializer is invoked.", k8sEnv.PodName);
                try
                {
#if NETSTANDARD2_0
                    Stopwatch cpuWatch     = Stopwatch.StartNew();
                    TimeSpan  startCPUTime = Process.GetCurrentProcess().TotalProcessorTime;
#endif
                    // Setting the container name to role name
                    if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
                    {
                        telemetry.Context.Cloud.RoleName = k8sEnv.ContainerName;
                    }

                    if (telemetry is ISupportProperties propertySetter)
                    {
#if NETSTANDARD2_0
                        SetCustomDimensions(propertySetter, cpuWatch, startCPUTime);
#else
                        SetCustomDimensions(propertySetter);
#endif
                    }
                    else
                    {
                        _logger.LogTrace("This telemetry object doesn't implement ISupportProperties.");
                    }
                    _logger.LogTrace("Finish telemetry initializer.");
                }
#pragma warning disable CA1031 // Do not catch general exception types
                catch (Exception ex)
                {
                    _logger.LogError(ex.ToString());
                }
#pragma warning restore CA1031 // Do not catch general exception types
            }
            else
            {
                _logger.LogTrace("Application Insights for Kubernetes telemetry initializer is used but the content has not ready yet.");

                if (_isK8sQueryTimeout)
                {
                    if (!_isK8sQueryTimeoutReported)
                    {
                        _isK8sQueryTimeoutReported = true;
                        _logger.LogError("Query Kubernetes Environment timeout.");
                    }
                }
            }

            telemetry.Context.GetInternalContext().SdkVersion = _sdkVersionUtils.CurrentSDKVersion;
        }
Example #5
0
        public KubernetesTelemetryInitializer(
            IK8sEnvironmentFactory k8sEnvFactory,
            TimeSpan timeout,
            SDKVersionUtils sdkVersionUtils,
            ILogger <KubernetesTelemetryInitializer> logger)
        {
            _k8sEnvironment  = null;
            _logger          = logger;
            _sdkVersionUtils = Arguments.IsNotNull(sdkVersionUtils, nameof(sdkVersionUtils));
            _timeoutAt       = DateTime.Now.Add(Arguments.IsNotNull(timeout, nameof(timeout)));
            _k8sEnvFactory   = Arguments.IsNotNull(k8sEnvFactory, nameof(k8sEnvFactory));

            var _forget = SetK8sEnvironment();
        }
Example #6
0
        private async Task SetK8sEnvironment()
        {
            Task <IK8sEnvironment> createK8sEnvTask = _k8sEnvFactory.CreateAsync(_timeoutAt);
            await Task.WhenAny(
                createK8sEnvTask,
                Task.Delay(_timeoutAt - DateTime.Now)).ConfigureAwait(false);

            if (createK8sEnvTask.IsCompleted)
            {
                _k8sEnvironment = createK8sEnvTask.Result;
            }
            else
            {
                _isK8sQueryTimeout = true;
                _k8sEnvironment    = null;
            }
        }
        private void InitializeTelemetry(ITelemetry telemetry, IK8sEnvironment k8sEnv)
        {
            // Setting the container name to role name
            if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
            {
                telemetry.Context.Cloud.RoleName = k8sEnv.ContainerName;
            }

            if (telemetry is ISupportProperties propertySetter)
            {
                SetCustomDimensions(propertySetter);
            }
            else
            {
                _logger.LogTrace("This telemetry object doesn't implement ISupportProperties.");
            }
            _logger.LogTrace("Finish telemetry initializer.");
        }
        private async Task SetK8sEnvironment()
        {
            Task <IK8sEnvironment> createK8sEnvTask = _k8sEnvFactory.CreateAsync(_timeoutAt);
            await Task.WhenAny(
                createK8sEnvTask,
                Task.Delay(_timeoutAt - DateTime.Now)).ConfigureAwait(false);

            if (createK8sEnvTask.IsCompleted)
            {
                _logger.LogDebug("Application Insights for Kubernetes environment initialized.");
                _k8sEnvironment = createK8sEnvTask.Result;
            }
            else
            {
                _isK8sQueryTimeout = true;
                _k8sEnvironment    = null;
                _logger.LogError("Application Insights for Kubernetes environment initialization timed out.");
            }
        }
        public KubernetesTelemetryInitializer(
            IK8sEnvironmentFactory k8sEnvFactory,
            IOptions <AppInsightsForKubernetesOptions> options,
            SDKVersionUtils sdkVersionUtils,
            ITelemetryKeyCache telemetryKeyCache)
        {
            _k8sEnvironment = null;

            // Options can't be null.
            Debug.Assert(options != null, "Options can't be null.");
            _options = Arguments.IsNotNull(options?.Value, nameof(options));

            _logger.LogDebug(@"Initialize Application Insights for Kubernetes telemetry initializer with Options:
{0}", JsonConvert.SerializeObject(_options));

            _telemetryKeyCache = telemetryKeyCache ?? throw new ArgumentNullException(nameof(telemetryKeyCache));
            _sdkVersionUtils   = Arguments.IsNotNull(sdkVersionUtils, nameof(sdkVersionUtils));
            _timeoutAt         = DateTime.Now.Add(_options.InitializationTimeout);
            _k8sEnvFactory     = Arguments.IsNotNull(k8sEnvFactory, nameof(k8sEnvFactory));

            _ = SetK8sEnvironment();
        }