internal ApplicationInsightsConfiguration(
     TelemetryConfiguration telemetryConfiguration,
     DiagnosticsTelemetryModule diagnosticsTelemetryModule)
 {
     TelemetryConfiguration     = telemetryConfiguration ?? throw new ArgumentNullException(nameof(telemetryConfiguration));
     DiagnosticsTelemetryModule = diagnosticsTelemetryModule ?? throw new ArgumentNullException(nameof(diagnosticsTelemetryModule));
 }
Пример #2
0
        public void Initialize()
        {
            DiagnosticsTelemetryModule dm = new DiagnosticsTelemetryModule();

            TelemetryModules.Instance.Modules.Add(dm);
            publisher = new HeartbeatCustomizer();
        }
Пример #3
0
            public void ReturnsFalseForNullPropertyName()
            {
                // Arrange
                var module = new DiagnosticsTelemetryModule();

                // Act
                var result = DiagnosticsTelemetryModuleExtensions.AddOrSetHeartbeatProperty(module, null, "value", true);

                // Assert
                Assert.False(result);
            }
Пример #4
0
        private static ApplicationInsightsConfiguration InitializeApplicationInsightsConfiguration(
            string instrumentationKey,
            TimeSpan?heartbeatInterval)
        {
            // Note: TelemetryConfiguration.Active is being deprecated
            // https://github.com/microsoft/ApplicationInsights-dotnet/issues/1152
            // We use TelemetryConfiguration.CreateDefault() as opposed to instantiating a new TelemetryConfiguration()
            // to take into account the ApplicationInsights.config file (if detected).
            var telemetryConfiguration = TelemetryConfiguration.CreateDefault();

            if (!string.IsNullOrWhiteSpace(instrumentationKey))
            {
                telemetryConfiguration.InstrumentationKey = instrumentationKey;
            }

            telemetryConfiguration.TelemetryInitializers.Add(new TelemetryContextInitializer());

            // Hook-up the TelemetryModules configured in applicationinsights.config into our own
            // TelemetryConfiguration instance, as this doesn't happen automatically...
            foreach (var telemetryModule in TelemetryModules.Instance.Modules)
            {
                telemetryModule.Initialize(telemetryConfiguration);
            }

            // Construct a TelemetryClient to emit traces so we can track and debug AI initialization.
            var telemetryClient = new TelemetryClient(telemetryConfiguration);

            telemetryClient.TrackTrace(
                $"TelemetryConfiguration initialized using instrumentation key: {instrumentationKey ?? "EMPTY"}.",
                SeverityLevel.Information);

            var diagnosticsTelemetryModule = new DiagnosticsTelemetryModule();

            // Configure heartbeat interval if specified.
            // When not defined, the DiagnosticsTelemetryModule will use its internal defaults (heartbeat enabled, interval of 15 minutes).
            var traceMessage = "DiagnosticsTelemetryModule initialized using default heartbeat interval.";

            if (heartbeatInterval.HasValue)
            {
                diagnosticsTelemetryModule.HeartbeatInterval = heartbeatInterval.Value;
                traceMessage = $"DiagnosticsTelemetryModule initialized using configured heartbeat interval: {heartbeatInterval.Value}.";
            }

            diagnosticsTelemetryModule.Initialize(telemetryConfiguration);

            telemetryClient.TrackTrace(traceMessage, SeverityLevel.Information);

            return(new ApplicationInsightsConfiguration(telemetryConfiguration, diagnosticsTelemetryModule));
        }
Пример #5
0
            public void ReturnsTrueAndAddsPayloadWhenNotAddedYet(string propertyName, string propertyValue, bool isHealthy)
            {
                // Arrange
                var module = new DiagnosticsTelemetryModule();

                // Act
                var result = DiagnosticsTelemetryModuleExtensions.AddOrSetHeartbeatProperty(
                    module,
                    propertyName,
                    propertyValue,
                    isHealthy);

                // Assert
                Assert.True(result);

                VerifyHeartbeatPropertyPayload(module, propertyName, propertyValue, isHealthy);
            }
        /// <summary>
        /// Tries to add or set a heartbeat property.
        /// </summary>
        /// <param name="module">The <see cref="DiagnosticsTelemetryModule"/>.</param>
        /// <param name="propertyName">Name of the heartbeat value to add.</param>
        /// <param name="propertyValue">Current value of the heartbeat value to add.</param>
        /// <param name="isHealthy">Flag indicating whether or not the property represents a healthy value.</param>
        /// <returns><c>True</c> if the property was set; otherwise <c>False</c>.</returns>
        public static bool AddOrSetHeartbeatProperty(
            this DiagnosticsTelemetryModule module,
            string propertyName,
            string propertyValue,
            bool isHealthy)
        {
            if (module == null)
            {
                throw new ArgumentNullException(nameof(module));
            }

            var propertySet = module.AddHeartbeatProperty(propertyName, propertyValue, isHealthy);

            if (!propertySet)
            {
                return(module.SetHeartbeatProperty(propertyName, propertyValue, isHealthy));
            }

            return(propertySet);
        }
Пример #7
0
            private void VerifyHeartbeatPropertyPayload(
                DiagnosticsTelemetryModule module,
                string propertyName,
                string propertyValue,
                bool isHealthy)
            {
                // Verify payload settings using reflection
                var heartbeatPropertyManager = typeof(DiagnosticsTelemetryModule)
                                               .GetField("HeartbeatProvider", BindingFlags.NonPublic | BindingFlags.Instance)
                                               .GetValue(module) as IHeartbeatPropertyManager;

                var heartbeatProperties = heartbeatPropertyManager
                                          .GetType()
                                          .GetField("heartbeatProperties", BindingFlags.NonPublic | BindingFlags.Instance)
                                          .GetValue(heartbeatPropertyManager); // returns ConcurrentDictionary<string, HeartbeatPropertyPayload>

                var propertyNames = heartbeatProperties
                                    .GetType()
                                    .GetProperty("Keys", BindingFlags.Public | BindingFlags.Instance)
                                    .GetValue(heartbeatProperties) as ICollection <string>;

                Assert.Contains(propertyNames, i => i.Equals(propertyName));

                var propertyPayload = heartbeatProperties
                                      .GetType()
                                      .GetProperty("Item", BindingFlags.Public | BindingFlags.Instance)
                                      .GetValue(heartbeatProperties, new object[] { propertyName }); // returns internal type HeartbeatPropertyPayload

                var payloadValue = propertyPayload
                                   .GetType()
                                   .GetProperty("PayloadValue", BindingFlags.Public | BindingFlags.Instance)
                                   .GetValue(propertyPayload) as string;

                var payloadIsHealthy = (bool)propertyPayload
                                       .GetType()
                                       .GetProperty("IsHealthy", BindingFlags.Public | BindingFlags.Instance)
                                       .GetValue(propertyPayload);

                Assert.Equal(propertyValue, payloadValue);
                Assert.Equal(isHealthy, payloadIsHealthy);
            }
        /// <inheritdoc />
        public void Configure(TelemetryConfiguration configuration)
        {
            try
            {
                if (this.applicationInsightsServiceOptions.InstrumentationKey != null)
                {
                    configuration.InstrumentationKey = this.applicationInsightsServiceOptions.InstrumentationKey;
                }

                if (this.telemetryModuleConfigurators.Any())
                {
                    foreach (ITelemetryModuleConfigurator telemetryModuleConfigurator in this.telemetryModuleConfigurators)
                    {
                        ITelemetryModule telemetryModule = this.modules.FirstOrDefault((module) => module.GetType() == telemetryModuleConfigurator.TelemetryModuleType);
                        if (telemetryModule != null)
                        {
                            telemetryModuleConfigurator.Configure(telemetryModule, this.applicationInsightsServiceOptions);
                        }
                        else
                        {
#if AI_ASPNETCORE_WEB
                            AspNetCoreEventSource.Instance.UnableToFindModuleToConfigure(telemetryModuleConfigurator.TelemetryModuleType.ToString());
#else
                            WorkerServiceEventSource.Instance.UnableToFindModuleToConfigure(telemetryModuleConfigurator.TelemetryModuleType.ToString());
#endif
                        }
                    }
                }

                if (this.telemetryProcessorFactories.Any())
                {
                    foreach (ITelemetryProcessorFactory processorFactory in this.telemetryProcessorFactories)
                    {
                        configuration.DefaultTelemetrySink.TelemetryProcessorChainBuilder.Use(processorFactory.Create);
                    }
                }

                // Fallback to default channel (InMemoryChannel) created by base sdk if no channel is found in DI
                configuration.TelemetryChannel = this.telemetryChannel ?? configuration.TelemetryChannel;
                (configuration.TelemetryChannel as ITelemetryModule)?.Initialize(configuration);

                this.AddAutoCollectedMetricExtractor(configuration);
                this.AddQuickPulse(configuration);
                this.AddSampling(configuration);
                this.DisableHeartBeatIfConfigured();

                configuration.DefaultTelemetrySink.TelemetryProcessorChainBuilder.Build();
                configuration.TelemetryProcessorChainBuilder.Build();

                if (this.applicationInsightsServiceOptions.DeveloperMode != null)
                {
                    configuration.TelemetryChannel.DeveloperMode = this.applicationInsightsServiceOptions.DeveloperMode;
                }

                if (this.applicationInsightsServiceOptions.EndpointAddress != null)
                {
                    configuration.TelemetryChannel.EndpointAddress = this.applicationInsightsServiceOptions.EndpointAddress;
                }

                // Need to set connection string before calling Initialize() on the Modules and Processors.
                if (this.applicationInsightsServiceOptions.ConnectionString != null)
                {
                    configuration.ConnectionString = this.applicationInsightsServiceOptions.ConnectionString;
                }

                foreach (ITelemetryInitializer initializer in this.initializers)
                {
                    configuration.TelemetryInitializers.Add(initializer);
                }

                // Find the DiagnosticsTelemetryModule, this is needed to initialize AzureInstanceMetadataTelemetryModule and AppServicesHeartbeatTelemetryModule.
                DiagnosticsTelemetryModule diagModule =
                    (this.applicationInsightsServiceOptions.EnableDiagnosticsTelemetryModule && this.applicationInsightsServiceOptions.EnableHeartbeat)
                    ? this.modules.OfType <DiagnosticsTelemetryModule>().FirstOrDefault()
                    : null;

                // Checks ApplicationInsightsServiceOptions and disable TelemetryModules if explicitly disabled.
                foreach (ITelemetryModule module in this.modules)
                {
                    // If any of the modules are disabled explicitly using aioptions,
                    // do not initialize them and dispose if disposable.
                    // The option of not adding a module to DI if disabled
                    // cannot be done to maintain backward compatibility.
                    // So this approach of adding all modules to DI, but selectively
                    // disable those modules which user has disabled is chosen.

                    if (module is DiagnosticsTelemetryModule)
                    {
                        if (!this.applicationInsightsServiceOptions.EnableDiagnosticsTelemetryModule)
                        {
                            DisposeIfDisposable(module);
                            continue;
                        }
                    }

                    // DependencyTrackingTelemetryModule
                    if (module is DependencyTrackingTelemetryModule)
                    {
                        if (!this.applicationInsightsServiceOptions.EnableDependencyTrackingTelemetryModule)
                        {
                            DisposeIfDisposable(module);
                            continue;
                        }
                    }

#if AI_ASPNETCORE_WEB
                    // RequestTrackingTelemetryModule
                    if (module is RequestTrackingTelemetryModule)
                    {
                        if (!this.applicationInsightsServiceOptions.EnableRequestTrackingTelemetryModule)
                        {
                            DisposeIfDisposable(module);
                            continue;
                        }
                    }
#endif

#if NETSTANDARD2_0
                    // EventCounterCollectionModule
                    if (module is EventCounterCollectionModule)
                    {
                        if (!this.applicationInsightsServiceOptions.EnableEventCounterCollectionModule)
                        {
                            DisposeIfDisposable(module);
                            continue;
                        }
                    }
#endif

                    // PerformanceCollectorModule
                    if (module is PerformanceCollectorModule)
                    {
                        if (!this.applicationInsightsServiceOptions.EnablePerformanceCounterCollectionModule)
                        {
                            DisposeIfDisposable(module);
                            continue;
                        }
                    }

                    // AppServicesHeartbeatTelemetryModule
                    if (module is AppServicesHeartbeatTelemetryModule appServicesHeartbeatTelemetryModule)
                    {
                        if (!this.applicationInsightsServiceOptions.EnableAppServicesHeartbeatTelemetryModule)
                        {
                            DisposeIfDisposable(module);
                            continue;
                        }
                        else if (diagModule != null)
                        {
                            // diagModule is set to Null above if (applicationInsightsServiceOptions.EnableDiagnosticsTelemetryModule || this.applicationInsightsServiceOptions.EnableHeartbeat) == false.
                            appServicesHeartbeatTelemetryModule.HeartbeatPropertyManager = diagModule;
                        }
                    }

                    // AzureInstanceMetadataTelemetryModule
                    if (module is AzureInstanceMetadataTelemetryModule azureInstanceMetadataTelemetryModule)
                    {
                        if (!this.applicationInsightsServiceOptions.EnableAzureInstanceMetadataTelemetryModule)
                        {
                            DisposeIfDisposable(module);
                            continue;
                        }
                        else if (diagModule != null)
                        {
                            // diagModule is set to Null above if (applicationInsightsServiceOptions.EnableDiagnosticsTelemetryModule || this.applicationInsightsServiceOptions.EnableHeartbeat) == false.
                            azureInstanceMetadataTelemetryModule.HeartbeatPropertyManager = diagModule;
                        }
                    }

                    // QuickPulseTelemetryModule
                    if (module is QuickPulseTelemetryModule)
                    {
                        if (!this.applicationInsightsServiceOptions.EnableQuickPulseMetricStream)
                        {
                            DisposeIfDisposable(module);
                            continue;
                        }
                    }

                    try
                    {
                        module.Initialize(configuration);
                    }
                    catch (Exception ex)
                    {
#if AI_ASPNETCORE_WEB
                        AspNetCoreEventSource.Instance.TelemetryModuleInitialziationSetupFailure(module.GetType().FullName, ex.ToInvariantString());
#else
                        WorkerServiceEventSource.Instance.TelemetryModuleInitialziationSetupFailure(module.GetType().FullName, ex.ToInvariantString());
#endif
                    }
                }

                foreach (ITelemetryProcessor processor in configuration.TelemetryProcessors)
                {
                    ITelemetryModule module = processor as ITelemetryModule;
                    if (module != null)
                    {
                        module.Initialize(configuration);
                    }
                }

                // Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule depends on this nullable configuration to support Correlation.
                configuration.ApplicationIdProvider = this.applicationIdProvider;

#if AI_ASPNETCORE_WEB
                AspNetCoreEventSource.Instance.LogInformational("Successfully configured TelemetryConfiguration.");
#else
                WorkerServiceEventSource.Instance.LogInformational("Successfully configured TelemetryConfiguration.");
#endif
            }
            catch (Exception ex)
            {
#if AI_ASPNETCORE_WEB
                AspNetCoreEventSource.Instance.TelemetryConfigurationSetupFailure(ex.ToInvariantString());
#else
                WorkerServiceEventSource.Instance.TelemetryConfigurationSetupFailure(ex.ToInvariantString());
#endif
            }
        }