public void Logging_Binds_AppInsightsOptions()
        {
            var hostBuilder = new HostBuilder()
                              .ConfigureAppConfiguration(c =>
            {
                c.AddInMemoryCollection(new Dictionary <string, string>
                {
                    { "APPINSIGHTS_INSTRUMENTATIONKEY", "some_key" },
                    { "APPLICATIONINSIGHTS_CONNECTION_STRING", "InstrumentationKey=some_other_key" },
                    { ConfigurationPath.Combine(_loggingPath, "ApplicationInsights", "SamplingSettings", "IsEnabled"), "false" },
                    { ConfigurationPath.Combine(_loggingPath, "ApplicationInsights", "SnapshotConfiguration", "IsEnabled"), "false" }
                });
            })
                              .ConfigureDefaultTestWebScriptHost();

            using (IHost host = hostBuilder.Build())
            {
                ApplicationInsightsLoggerOptions appInsightsOptions = host.Services.GetService <IOptions <ApplicationInsightsLoggerOptions> >().Value;

                Assert.Equal("some_key", appInsightsOptions.InstrumentationKey);
                Assert.Equal("InstrumentationKey=some_other_key", appInsightsOptions.ConnectionString);
                Assert.Null(appInsightsOptions.SamplingSettings);
                Assert.False(appInsightsOptions.SnapshotConfiguration.IsEnabled);
            }
        }
        public void Configure_SnapshotDisabled_ByDefault()
        {
            IConfiguration config = new ConfigurationBuilder().Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config), _environment);

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.Null(options.SnapshotConfiguration);
        }
        public void Configure_SnapshotEnabled_ByDefault()
        {
            IConfiguration config = new ConfigurationBuilder().Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config));

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.True(options.SnapshotConfiguration.IsEnabled);
        }
        public void Configure_SamplingEnabled_ByDefault()
        {
            IConfiguration config = new ConfigurationBuilder().Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config), _environment);

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.Equal(5, options.SamplingSettings.MaxTelemetryItemsPerSecond);
        }
        public void Configure_QuickPulse_NullByDefault()
        {
            IConfiguration config = new ConfigurationBuilder().Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config), _environment);

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.Null(options.QuickPulseAuthenticationApiKey);
        }
        public void Configure_QuickPulse()
        {
            IConfiguration config = new ConfigurationBuilder().Build();

            _environment.SetEnvironmentVariable(EnvironmentSettingNames.AppInsightsQuickPulseAuthApiKey, "SOME_API_KEY");

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config), _environment);

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.Equal("SOME_API_KEY", options.QuickPulseAuthenticationApiKey);
        }
        public void Configure_SamplingDisabled_CreatesNullSettings()
        {
            IConfiguration config = new ConfigurationBuilder()
                                    .AddInMemoryCollection(new Dictionary <string, string>
            {
                { $"{SamplingSettings}:IsEnabled", "false" }
            })
                                    .Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config), _environment);

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.Null(options.SamplingSettings);
        }
        public void Configure_Snapshot_Sets_SnapshotsPerTenMinutesLimit()
        {
            IConfiguration config = new ConfigurationBuilder()
                                    .AddInMemoryCollection(new Dictionary <string, string>
            {
                { $"{SnapshotConfiguration}:SnapshotsPerTenMinutesLimit", "10" },
            })
                                    .Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config), _environment);

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.Equal(10, options.SnapshotConfiguration.SnapshotsPerTenMinutesLimit);
        }
        public void Configure_SamplingEnabled_CreatesDefaultSettings()
        {
            IConfiguration config = new ConfigurationBuilder()
                                    .AddInMemoryCollection(new Dictionary <string, string>
            {
                { $"{SamplingSettings}:IsEnabled", "true" }
            })
                                    .Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config));

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.Equal(5, options.SamplingSettings.MaxTelemetryItemsPerSecond);
        }
        public void Configure_SnapshotDisabled_SetsIsEnabledFalse()
        {
            IConfiguration config = new ConfigurationBuilder()
                                    .AddInMemoryCollection(new Dictionary <string, string>
            {
                { $"{SnapshotConfiguration}:IsEnabled", "false" }
            })
                                    .Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config));

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.False(options.SnapshotConfiguration.IsEnabled);
        }
        public void Configure_SnapshotEnabled_CreatesDefaultSettings()
        {
            IConfiguration config = new ConfigurationBuilder()
                                    .AddInMemoryCollection(new Dictionary <string, string>
            {
                { $"{SnapshotConfiguration}:IsEnabled", "true" }
            })
                                    .Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config), _environment);

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.True(options.SnapshotConfiguration.IsEnabled);
        }
        public void Configure_Sampling_Sets_MaxTelemetryItemsPerSecond()
        {
            IConfiguration config = new ConfigurationBuilder()
                                    .AddInMemoryCollection(new Dictionary <string, string>
            {
                { $"{SamplingSettings}:MaxTelemetryItemsPerSecond", "25" },
            })
                                    .Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config), _environment);

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.Equal(25, options.SamplingSettings.MaxTelemetryItemsPerSecond);
        }
        public void Configure_SamplingDisabled_IgnoresOtherSettings()
        {
            IConfiguration config = new ConfigurationBuilder()
                                    .AddInMemoryCollection(new Dictionary <string, string>
            {
                { $"{SamplingSettings}:MaxTelemetryItemsPerSecond", "25" },
                { $"{SamplingSettings}:IsEnabled", "false" }
            })
                                    .Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config));

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.Null(options.SamplingSettings);
        }
示例#14
0
        public void Setup()
        {
            _configuration = TelemetryConfiguration.CreateDefault();
            _configuration.InstrumentationKey = "";
            _configuration.TelemetryInitializers.Add(new HttpDependenciesParsingTelemetryInitializer());

            _telemetryClient = new TelemetryClient(_configuration);

            _module.Initialize(_configuration);

            var loggerOptions = new ApplicationInsightsLoggerOptions();

            var applicationInsightsLoggerProvider = new ApplicationInsightsLoggerProvider(Options.Create(_configuration),
                                                                                          Options.Create(loggerOptions));

            ILoggerFactory factory = new LoggerFactory();

            factory.AddProvider(applicationInsightsLoggerProvider);

            LogContext.ConfigureCurrentLogContext(factory);
        }
示例#15
0
        public void TestLoggerIncludingEventIdCreatesTraceTelemetryWithEventIdOnLoggedError()
        {
            TelemetryClient client = CommonMocks.MockTelemetryClient((t) =>
            {
                Assert.IsType <TraceTelemetry>(t);
                var traceTelemetry = (TraceTelemetry)t;
                Assert.Equal("This is an error", traceTelemetry.Message);
                Assert.Equal(SeverityLevel.Error, traceTelemetry.SeverityLevel);
                Assert.Equal("test-category", traceTelemetry.Properties["CategoryName"]);

                Assert.Equal("22", traceTelemetry.Properties["EventId"]);
                Assert.Equal("TestEvent", traceTelemetry.Properties["EventName"]);
            });
            var options = new ApplicationInsightsLoggerOptions {
                IncludeEventId = true
            };

            ILogger logger = new ApplicationInsightsLogger("test-category", client, (s, l) => { return(true); }, options);

            logger.LogError(new EventId(22, "TestEvent"), "This is an error");
        }
示例#16
0
        public void TestLoggerIncludingEventIdCreatesTraceTelemetryWithoutEventNameOnLoggedInfo()
        {
            TelemetryClient client = CommonMocks.MockTelemetryClient((t) =>
            {
                Assert.IsType <TraceTelemetry>(t);
                var traceTelemetry = (TraceTelemetry)t;
                Assert.Equal("This is an information", traceTelemetry.Message);
                Assert.Equal(SeverityLevel.Information, traceTelemetry.SeverityLevel);
                Assert.Equal("test-category", traceTelemetry.Properties["CategoryName"]);

                Assert.Equal("100", traceTelemetry.Properties["EventId"]);
                Assert.False(traceTelemetry.Properties.ContainsKey("EventName"));
            });
            var options = new ApplicationInsightsLoggerOptions {
                IncludeEventId = true
            };

            ILogger logger = new ApplicationInsightsLogger("test-category", client, (s, l) => { return(true); }, options);

            logger.LogInformation(new EventId(100, string.Empty), "This is an information");
        }
示例#17
0
        public void TestLoggerIncludingEventIdCreatesExceptionWithoutEventNameTelemetryOnLoggedError()
        {
            TelemetryClient client = CommonMocks.MockTelemetryClient((t) =>
            {
                Assert.IsType <ExceptionTelemetry>(t);
                var exceptionTelemetry = (ExceptionTelemetry)t;
                Assert.Equal(SeverityLevel.Error, exceptionTelemetry.SeverityLevel);
                Assert.Equal("test-category", exceptionTelemetry.Properties["CategoryName"]);
                Assert.Equal("System.Exception: This is an error", exceptionTelemetry.Properties["Exception"]);
                Assert.Equal("Error: This is an error", exceptionTelemetry.Message);

                Assert.Equal("100", exceptionTelemetry.Properties["EventId"]);
                Assert.False(exceptionTelemetry.Properties.ContainsKey("EventName"));
            });
            var options = new ApplicationInsightsLoggerOptions {
                IncludeEventId = true
            };

            ILogger logger    = new ApplicationInsightsLogger("test-category", client, (s, l) => { return(true); }, options);
            var     exception = new Exception("This is an error");

            logger.LogError(new EventId(100, string.Empty), exception, "Error: " + exception.Message);
        }
示例#18
0
        public void Configure_SamplingExcludedIncludedTypes_AppliesSettings()
        {
            string excludedTypes = "Dependency;Event";
            string includedTypes = "PageView;Trace";

            IConfiguration config = new ConfigurationBuilder()
                                    .AddInMemoryCollection(new Dictionary <string, string>
            {
                { $"{SamplingSettings}:MaxTelemetryItemsPerSecond", "25" },
                { $"{SamplingSettings}:IsEnabled", "true" },
                { $"{SamplingSettings}:ExcludedTypes", excludedTypes },
                { $"{SamplingSettings}:IncludedTypes", includedTypes },
            })
                                    .Build();

            ApplicationInsightsLoggerOptionsSetup setup = new ApplicationInsightsLoggerOptionsSetup(new MockLoggerConfiguration(config), _environment);

            ApplicationInsightsLoggerOptions options = new ApplicationInsightsLoggerOptions();

            setup.Configure(options);

            Assert.Equal(excludedTypes, options.SamplingExcludedTypes);
            Assert.Equal(includedTypes, options.SamplingIncludedTypes);
        }
示例#19
0
        public void TestLoggerIncludingEventIdCreatesExceptionWithEventIdTelemetryOnLoggedErrorWithParameters()
        {
            TelemetryClient client = CommonMocks.MockTelemetryClient((t) =>
            {
                Assert.IsType <ExceptionTelemetry>(t);
                var exceptionTelemetry = (ExceptionTelemetry)t;
                Assert.Equal(SeverityLevel.Error, exceptionTelemetry.SeverityLevel);
                Assert.Equal("test-category", exceptionTelemetry.Properties["CategoryName"]);
                Assert.Equal("System.Exception: This is an error", exceptionTelemetry.Properties["Exception"]);
                Assert.Equal("Error: ERROR This is an error", exceptionTelemetry.Message);

                Assert.Equal("22", exceptionTelemetry.Properties["EventId"]);
                Assert.Equal("ERROR", exceptionTelemetry.Properties["EventName"]);
                Assert.Equal("This is an error", exceptionTelemetry.Properties["Message"]);
            });
            var options = new ApplicationInsightsLoggerOptions {
                IncludeEventId = true
            };

            ILogger logger    = new ApplicationInsightsLogger("test-category", client, (s, l) => { return(true); }, options);
            var     exception = new Exception("This is an error");

            logger.LogError(new EventId(22, "TestEvent"), exception, "Error: {EventName} {Message}", "ERROR", exception.Message);
        }
示例#20
0
        public void ApplicationInsightsLoggerOptions_Format()
        {
            var options = new ApplicationInsightsLoggerOptions
            {
                SamplingSettings = new SamplingPercentageEstimatorSettings()
                {
                    EvaluationInterval                = TimeSpan.FromHours(1),
                    InitialSamplingPercentage         = 0.1,
                    MaxSamplingPercentage             = 0.1,
                    MaxTelemetryItemsPerSecond        = 42,
                    MinSamplingPercentage             = 0.1,
                    MovingAverageRatio                = 1.0,
                    SamplingPercentageDecreaseTimeout = TimeSpan.FromSeconds(1),
                    SamplingPercentageIncreaseTimeout = TimeSpan.FromSeconds(1)
                },
                SnapshotConfiguration = new SnapshotCollectorConfiguration()
                {
                    AgentEndpoint                 = "123",
                    FailedRequestLimit            = 42,
                    IsEnabled                     = false,
                    IsEnabledInDeveloperMode      = false,
                    IsEnabledWhenProfiling        = false,
                    IsLowPrioritySnapshotUploader = false,
                    MaximumCollectionPlanSize     = 42,
                    MaximumSnapshotsRequired      = 42,
                    ProblemCounterResetInterval   = TimeSpan.FromMinutes(42),
                    ProvideAnonymousTelemetry     = false,
                    ReconnectInterval             = TimeSpan.FromMinutes(42),
                    ShadowCopyFolder              = "123",
                    SnapshotInLowPriorityThread   = false,
                    SnapshotsPerDayLimit          = 42,
                    SnapshotsPerTenMinutesLimit   = 42,
                    TempFolder                    = "123",
                    ThresholdForSnapshotting      = 42,
                    UploaderProxy                 = "123"
                },
                HttpAutoCollectionOptions = new HttpAutoCollectionOptions()
                {
                    EnableResponseHeaderInjection           = false,
                    EnableW3CDistributedTracing             = false,
                    EnableHttpTriggerExtendedInfoCollection = true
                }
            };

            var deserializedOptions = JsonConvert.DeserializeObject <ApplicationInsightsLoggerOptions>(options.Format());

            Assert.Equal(options.HttpAutoCollectionOptions.EnableHttpTriggerExtendedInfoCollection, deserializedOptions.HttpAutoCollectionOptions.EnableHttpTriggerExtendedInfoCollection);
            Assert.Equal(options.HttpAutoCollectionOptions.EnableW3CDistributedTracing, deserializedOptions.HttpAutoCollectionOptions.EnableW3CDistributedTracing);
            Assert.Equal(options.HttpAutoCollectionOptions.EnableResponseHeaderInjection, deserializedOptions.HttpAutoCollectionOptions.EnableResponseHeaderInjection);

            Assert.Equal(options.SamplingSettings.EvaluationInterval, deserializedOptions.SamplingSettings.EvaluationInterval);
            Assert.Equal(options.SamplingSettings.InitialSamplingPercentage, deserializedOptions.SamplingSettings.InitialSamplingPercentage);
            Assert.Equal(options.SamplingSettings.MaxSamplingPercentage, deserializedOptions.SamplingSettings.MaxSamplingPercentage);
            Assert.Equal(options.SamplingSettings.MaxTelemetryItemsPerSecond, deserializedOptions.SamplingSettings.MaxTelemetryItemsPerSecond);
            Assert.Equal(options.SamplingSettings.MinSamplingPercentage, deserializedOptions.SamplingSettings.MinSamplingPercentage);
            Assert.Equal(options.SamplingSettings.MovingAverageRatio, deserializedOptions.SamplingSettings.MovingAverageRatio);
            Assert.Equal(options.SamplingSettings.SamplingPercentageDecreaseTimeout, deserializedOptions.SamplingSettings.SamplingPercentageDecreaseTimeout);
            Assert.Equal(options.SamplingSettings.SamplingPercentageIncreaseTimeout, deserializedOptions.SamplingSettings.SamplingPercentageIncreaseTimeout);


            Assert.Equal(options.SnapshotConfiguration.FailedRequestLimit, deserializedOptions.SnapshotConfiguration.FailedRequestLimit);
            Assert.Equal(options.SnapshotConfiguration.IsEnabled, deserializedOptions.SnapshotConfiguration.IsEnabled);
            Assert.Equal(options.SnapshotConfiguration.IsEnabledInDeveloperMode, deserializedOptions.SnapshotConfiguration.IsEnabledInDeveloperMode);
            Assert.Equal(options.SnapshotConfiguration.IsEnabledWhenProfiling, deserializedOptions.SnapshotConfiguration.IsEnabledWhenProfiling);
            Assert.Equal(options.SnapshotConfiguration.IsLowPrioritySnapshotUploader, deserializedOptions.SnapshotConfiguration.IsLowPrioritySnapshotUploader);
            Assert.Equal(options.SnapshotConfiguration.MaximumCollectionPlanSize, deserializedOptions.SnapshotConfiguration.MaximumCollectionPlanSize);
            Assert.Equal(options.SnapshotConfiguration.MaximumSnapshotsRequired, deserializedOptions.SnapshotConfiguration.MaximumSnapshotsRequired);
            Assert.Equal(options.SnapshotConfiguration.ProblemCounterResetInterval, deserializedOptions.SnapshotConfiguration.ProblemCounterResetInterval);
            Assert.Equal(options.SnapshotConfiguration.ProvideAnonymousTelemetry, deserializedOptions.SnapshotConfiguration.ProvideAnonymousTelemetry);
            Assert.Equal(options.SnapshotConfiguration.ReconnectInterval, deserializedOptions.SnapshotConfiguration.ReconnectInterval);
            Assert.Equal(options.SnapshotConfiguration.ShadowCopyFolder, deserializedOptions.SnapshotConfiguration.ShadowCopyFolder);
            Assert.Equal(options.SnapshotConfiguration.SnapshotInLowPriorityThread, deserializedOptions.SnapshotConfiguration.SnapshotInLowPriorityThread);
            Assert.Equal(options.SnapshotConfiguration.SnapshotsPerDayLimit, deserializedOptions.SnapshotConfiguration.SnapshotsPerDayLimit);
            Assert.Equal(options.SnapshotConfiguration.SnapshotsPerTenMinutesLimit, deserializedOptions.SnapshotConfiguration.SnapshotsPerTenMinutesLimit);
            Assert.Equal(options.SnapshotConfiguration.TempFolder, deserializedOptions.SnapshotConfiguration.TempFolder);
            Assert.Equal(options.SnapshotConfiguration.ThresholdForSnapshotting, deserializedOptions.SnapshotConfiguration.ThresholdForSnapshotting);
        }
示例#21
0
        public static IServiceCollection AddApplicationInsights(this IServiceCollection services)
        {
            // Bind to the configuration section registered with
            services.AddOptions <ApplicationInsightsLoggerOptions>()
            .Configure <ILoggerProviderConfiguration <ApplicationInsightsLoggerProvider> >((options, config) =>
            {
                config.Configuration?.Bind(options);
            });

            services.AddSingleton <ITelemetryInitializer, HttpDependenciesParsingTelemetryInitializer>();
            services.AddSingleton <ITelemetryInitializer, WebJobsRoleEnvironmentTelemetryInitializer>();
            services.AddSingleton <ITelemetryInitializer, WebJobsTelemetryInitializer>();
            services.AddSingleton <ITelemetryInitializer, WebJobsSanitizingInitializer>();
            services.AddSingleton <ITelemetryModule, QuickPulseTelemetryModule>();

            services.AddSingleton <IApplicationIdProvider, ApplicationInsightsApplicationIdProvider>();

            services.AddSingleton <ITelemetryModule, DependencyTrackingTelemetryModule>(provider =>
            {
                var dependencyCollector = new DependencyTrackingTelemetryModule();
                var excludedDomains     = dependencyCollector.ExcludeComponentCorrelationHttpHeadersOnDomains;
                excludedDomains.Add("core.windows.net");
                excludedDomains.Add("core.chinacloudapi.cn");
                excludedDomains.Add("core.cloudapi.de");
                excludedDomains.Add("core.usgovcloudapi.net");
                excludedDomains.Add("localhost");
                excludedDomains.Add("127.0.0.1");

                var includedActivities = dependencyCollector.IncludeDiagnosticSourceActivities;
                includedActivities.Add("Microsoft.Azure.ServiceBus");

                return(dependencyCollector);
            });
            services.AddSingleton <ITelemetryModule, AppServicesHeartbeatTelemetryModule>();

            services.AddSingleton <ITelemetryChannel, ServerTelemetryChannel>();
            services.AddSingleton <TelemetryConfiguration>(provider =>
            {
                ApplicationInsightsLoggerOptions options = provider.GetService <IOptions <ApplicationInsightsLoggerOptions> >().Value;
                LoggerFilterOptions filterOptions        = CreateFilterOptions(provider.GetService <IOptions <LoggerFilterOptions> >().Value);

                ITelemetryChannel channel     = provider.GetService <ITelemetryChannel>();
                TelemetryConfiguration config = TelemetryConfiguration.CreateDefault();

                IApplicationIdProvider appIdProvider = provider.GetService <IApplicationIdProvider>();

                SetupTelemetryConfiguration(
                    config,
                    options.InstrumentationKey,
                    options.SamplingSettings,
                    options.SnapshotConfiguration,
                    channel,
                    provider.GetServices <ITelemetryInitializer>(),
                    provider.GetServices <ITelemetryModule>(),
                    appIdProvider,
                    filterOptions);

                return(config);
            });

            services.AddSingleton <TelemetryClient>(provider =>
            {
                TelemetryConfiguration configuration = provider.GetService <TelemetryConfiguration>();
                TelemetryClient client = new TelemetryClient(configuration);

                string assemblyVersion = GetAssemblyFileVersion(typeof(JobHost).Assembly);
                client.Context.GetInternalContext().SdkVersion = $"webjobs: {assemblyVersion}";

                return(client);
            });

            services.AddSingleton <ILoggerProvider, ApplicationInsightsLoggerProvider>();

            return(services);
        }
示例#22
0
        public static IServiceCollection AddApplicationInsights(this IServiceCollection services)
        {
            services.TryAddSingleton <ISdkVersionProvider, WebJobsSdkVersionProvider>();

            // Bind to the configuration section registered with
            services.AddOptions <ApplicationInsightsLoggerOptions>()
            .Configure <ILoggerProviderConfiguration <ApplicationInsightsLoggerProvider> >((options, config) =>
            {
                config.Configuration?.Bind(options);
            });

            services.AddSingleton <ITelemetryInitializer, HttpDependenciesParsingTelemetryInitializer>();
            services.AddSingleton <ITelemetryInitializer, WebJobsRoleEnvironmentTelemetryInitializer>();
            services.AddSingleton <ITelemetryInitializer, WebJobsTelemetryInitializer>();
            services.AddSingleton <ITelemetryInitializer, WebJobsSanitizingInitializer>();
            services.AddSingleton <ITelemetryModule, QuickPulseTelemetryModule>();

            services.AddSingleton <IApplicationIdProvider, ApplicationInsightsApplicationIdProvider>();

            services.AddSingleton <ITelemetryModule, DependencyTrackingTelemetryModule>(provider =>
            {
                var dependencyCollector = new DependencyTrackingTelemetryModule();
                var excludedDomains     = dependencyCollector.ExcludeComponentCorrelationHttpHeadersOnDomains;
                excludedDomains.Add("core.windows.net");
                excludedDomains.Add("core.chinacloudapi.cn");
                excludedDomains.Add("core.cloudapi.de");
                excludedDomains.Add("core.usgovcloudapi.net");
                excludedDomains.Add("localhost");
                excludedDomains.Add("127.0.0.1");

                var includedActivities = dependencyCollector.IncludeDiagnosticSourceActivities;
                includedActivities.Add("Microsoft.Azure.ServiceBus");

                return(dependencyCollector);
            });
            services.AddSingleton <ITelemetryModule, AppServicesHeartbeatTelemetryModule>();

            services.AddSingleton <ITelemetryChannel, ServerTelemetryChannel>();
            services.AddSingleton <TelemetryConfiguration>(provider =>
            {
                ApplicationInsightsLoggerOptions options = provider.GetService <IOptions <ApplicationInsightsLoggerOptions> >().Value;
                LoggerFilterOptions filterOptions        = CreateFilterOptions(provider.GetService <IOptions <LoggerFilterOptions> >().Value);

                ITelemetryChannel channel     = provider.GetService <ITelemetryChannel>();
                TelemetryConfiguration config = TelemetryConfiguration.CreateDefault();

                IApplicationIdProvider appIdProvider = provider.GetService <IApplicationIdProvider>();

                // Because of https://github.com/Microsoft/ApplicationInsights-dotnet-server/issues/943
                // we have to touch (and create) Active configuration before initializing telemetry modules
                // Active configuration is used to report AppInsights heartbeats
                // role environment telemetry initializer is needed to correlate heartbeats to particular host

                var activeConfig = TelemetryConfiguration.Active;
                if (!string.IsNullOrEmpty(options.InstrumentationKey) &&
                    string.IsNullOrEmpty(activeConfig.InstrumentationKey))
                {
                    activeConfig.InstrumentationKey = options.InstrumentationKey;
                }

                if (!activeConfig.TelemetryInitializers.OfType <WebJobsRoleEnvironmentTelemetryInitializer>().Any())
                {
                    activeConfig.TelemetryInitializers.Add(
                        new WebJobsRoleEnvironmentTelemetryInitializer());
                }

                SetupTelemetryConfiguration(
                    config,
                    options,
                    channel,
                    provider.GetServices <ITelemetryInitializer>(),
                    provider.GetServices <ITelemetryModule>(),
                    appIdProvider,
                    filterOptions);

                return(config);
            });

            services.AddSingleton <TelemetryClient>(provider =>
            {
                TelemetryConfiguration configuration = provider.GetService <TelemetryConfiguration>();
                TelemetryClient client = new TelemetryClient(configuration);

                ISdkVersionProvider versionProvider            = provider.GetService <ISdkVersionProvider>();
                client.Context.GetInternalContext().SdkVersion = versionProvider?.GetSdkVersion();

                return(client);
            });

            services.AddSingleton <ILoggerProvider, ApplicationInsightsLoggerProvider>();

            return(services);
        }
示例#23
0
        private static void SetupTelemetryConfiguration(
            TelemetryConfiguration configuration,
            ApplicationInsightsLoggerOptions options,
            ITelemetryChannel channel,
            IEnumerable <ITelemetryInitializer> telemetryInitializers,
            IEnumerable <ITelemetryModule> telemetryModules,
            IApplicationIdProvider applicationIdProvider,
            LoggerFilterOptions filterOptions)
        {
            if (options.InstrumentationKey != null)
            {
                configuration.InstrumentationKey = options.InstrumentationKey;
            }

            configuration.TelemetryChannel = channel;

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

            (channel as ServerTelemetryChannel)?.Initialize(configuration);

            QuickPulseTelemetryModule quickPulseModule = null;

            foreach (ITelemetryModule module in telemetryModules)
            {
                if (module is QuickPulseTelemetryModule telemetryModule)
                {
                    quickPulseModule = telemetryModule;
                    if (options.QuickPulseAuthenticationApiKey != null)
                    {
                        quickPulseModule.AuthenticationApiKey = options.QuickPulseAuthenticationApiKey;
                    }
                }

                module.Initialize(configuration);
            }

            QuickPulseTelemetryProcessor quickPulseProcessor = null;

            configuration.TelemetryProcessorChainBuilder
            .Use((next) => new OperationFilteringTelemetryProcessor(next))
            .Use((next) =>
            {
                quickPulseProcessor = new QuickPulseTelemetryProcessor(next);
                return(quickPulseProcessor);
            })
            .Use((next) => new FilteringTelemetryProcessor(filterOptions, next));

            if (options.SamplingSettings != null)
            {
                configuration.TelemetryProcessorChainBuilder.Use((next) =>
                                                                 new AdaptiveSamplingTelemetryProcessor(options.SamplingSettings, null, next));
            }

            if (options.SnapshotConfiguration != null)
            {
                configuration.TelemetryProcessorChainBuilder.UseSnapshotCollector(options.SnapshotConfiguration);
            }

            configuration.TelemetryProcessorChainBuilder.Build();
            quickPulseModule?.RegisterTelemetryProcessor(quickPulseProcessor);

            foreach (ITelemetryProcessor processor in configuration.TelemetryProcessors)
            {
                if (processor is ITelemetryModule module)
                {
                    module.Initialize(configuration);
                }
            }

            configuration.ApplicationIdProvider = applicationIdProvider;
        }
        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            return(Host.CreateDefaultBuilder(args)
                   .UseWindowsService()
                   .ConfigureAppConfiguration(cfg =>
            {
                cfg.SetBasePath(AppDomain.CurrentDomain.BaseDirectory);
            })
                   .ConfigureLogging((context, builder) =>
            {
                builder.AddConsole();
                builder.SetMinimumLevel(LogLevel.Trace);
            })
                   .ConfigureServices((hostContext, services) =>
            {
                var hostConfig = hostContext.Configuration;
                var module = new DependencyTrackingTelemetryModule();
                module.IncludeDiagnosticSourceActivities.Add("MassTransit");

                TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
                configuration.InstrumentationKey = "<your instrumentation key>";
                configuration.TelemetryInitializers.Add(new HttpDependenciesParsingTelemetryInitializer());

                module.Initialize(configuration);

                var loggerOptions = new ApplicationInsightsLoggerOptions();
                var applicationInsightsLoggerProvider = new ApplicationInsightsLoggerProvider(Options.Create(configuration),
                                                                                              Options.Create(loggerOptions));
                ILoggerFactory factory = new LoggerFactory();
                factory.AddProvider(applicationInsightsLoggerProvider);
                LogContext.ConfigureCurrentLogContext(factory);

                services.AddMassTransit(x =>
                {
                    x.AddConsumersFromNamespaceContaining <SubmitOrderConsumer>();
                    x.AddBus(context => Bus.Factory.CreateUsingAzureServiceBus(
                                 configurator =>
                    {
                        var host =
                            configurator.Host(hostConfig["AzureServiceBusConnectionString"],
                                              h => { });

                        configurator.ReceiveEndpoint("submit-order", e =>
                        {
                            e.Consumer <SubmitOrderConsumer>();
                        });

                        configurator.ReceiveEndpoint("order-observer", e =>
                        {
                            e.Consumer <OrderSubmittedConsumer>();
                        });

                        configurator.ReceiveEndpoint("order-state", e =>
                        {
                            var machine = new OrderStateMachine();
                            var repository = new InMemorySagaRepository <OrderState>();

                            e.StateMachineSaga(machine, repository);

                            EndpointConvention.Map <OrderProcessed>(e.InputAddress);
                        });

                        configurator.ReceiveEndpoint("execute-process-order", e =>
                        {
                            e.ExecuteActivityHost <ProcessOrderActivity, ProcessOrderArguments>();

                            EndpointConvention.Map <ProcessOrderArguments>(e.InputAddress);
                        });
                    }));
                });

                services.AddHostedService <WindowsService>();
            }));
        }
        private static void SetupTelemetryConfiguration(
            TelemetryConfiguration configuration,
            ApplicationInsightsLoggerOptions options,
            ITelemetryChannel channel,
            IEnumerable <ITelemetryInitializer> telemetryInitializers,
            IEnumerable <ITelemetryModule> telemetryModules,
            IApplicationIdProvider applicationIdProvider,
            LoggerFilterOptions filterOptions)
        {
            if (options.InstrumentationKey != null)
            {
                configuration.InstrumentationKey = options.InstrumentationKey;
            }

            if (options.HttpAutoCollectionOptions.EnableW3CDistributedTracing)
            {
                // W3C distributed tracing is enabled by the feature flag inside ApplicationInsights SDK
                // W3COperationCorrelationTelemetryInitializer will go away once W3C is implemented
                // in the DiagnosticSource (.NET)
                configuration.TelemetryInitializers.Add(new W3COperationCorrelationTelemetryInitializer());
            }

            configuration.TelemetryChannel = channel;

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

            (channel as ServerTelemetryChannel)?.Initialize(configuration);

            QuickPulseTelemetryModule quickPulseModule = null;

            foreach (ITelemetryModule module in telemetryModules)
            {
                if (module is QuickPulseTelemetryModule telemetryModule)
                {
                    quickPulseModule = telemetryModule;
                    if (options.QuickPulseAuthenticationApiKey != null)
                    {
                        quickPulseModule.AuthenticationApiKey = options.QuickPulseAuthenticationApiKey;
                    }
                }

                module.Initialize(configuration);
            }

            QuickPulseTelemetryProcessor quickPulseProcessor = null;

            configuration.TelemetryProcessorChainBuilder
            .Use((next) => new OperationFilteringTelemetryProcessor(next))
            .Use((next) =>
            {
                quickPulseProcessor = new QuickPulseTelemetryProcessor(next);
                return(quickPulseProcessor);
            })
            .Use((next) => new FilteringTelemetryProcessor(filterOptions, next));

            if (options.SamplingSettings != null)
            {
                configuration.TelemetryProcessorChainBuilder.Use((next) =>
                                                                 new AdaptiveSamplingTelemetryProcessor(options.SamplingSettings, null, next));
            }

            if (options.SnapshotConfiguration != null)
            {
                configuration.TelemetryProcessorChainBuilder.UseSnapshotCollector(options.SnapshotConfiguration);
            }

            configuration.TelemetryProcessorChainBuilder.Build();
            quickPulseModule?.RegisterTelemetryProcessor(quickPulseProcessor);

            foreach (ITelemetryProcessor processor in configuration.TelemetryProcessors)
            {
                if (processor is ITelemetryModule module)
                {
                    module.Initialize(configuration);
                }
            }

            configuration.ApplicationIdProvider = applicationIdProvider;
        }
        public static IServiceCollection AddApplicationInsights(this IServiceCollection services)
        {
            services.TryAddSingleton <ISdkVersionProvider, WebJobsSdkVersionProvider>();

            // Bind to the configuration section registered with
            services.AddOptions <ApplicationInsightsLoggerOptions>()
            .Configure <ILoggerProviderConfiguration <ApplicationInsightsLoggerProvider> >((options, config) =>
            {
                config.Configuration?.Bind(options);
            });

            services.AddSingleton <ITelemetryInitializer, HttpDependenciesParsingTelemetryInitializer>();
            services.AddSingleton <ITelemetryInitializer, WebJobsRoleEnvironmentTelemetryInitializer>();
            services.AddSingleton <ITelemetryInitializer, WebJobsSanitizingInitializer>();
            services.AddSingleton <ITelemetryInitializer, WebJobsTelemetryInitializer>();

            services.AddSingleton <ITelemetryModule, QuickPulseTelemetryModule>();

            services.AddSingleton <ITelemetryModule>(provider =>
            {
                ApplicationInsightsLoggerOptions options = provider.GetService <IOptions <ApplicationInsightsLoggerOptions> >().Value;
                if (options.EnablePerformanceCountersCollection)
                {
                    return(new PerformanceCollectorModule());
                }

                return(NullTelemetryModule.Instance);
            });

            services.AddSingleton <IApplicationIdProvider, ApplicationInsightsApplicationIdProvider>();

            services.AddSingleton <ITelemetryModule, DependencyTrackingTelemetryModule>(provider =>
            {
                var options = provider.GetService <IOptions <ApplicationInsightsLoggerOptions> >().Value;

                var dependencyCollector = new DependencyTrackingTelemetryModule();
                var excludedDomains     = dependencyCollector.ExcludeComponentCorrelationHttpHeadersOnDomains;
                excludedDomains.Add("core.windows.net");
                excludedDomains.Add("core.chinacloudapi.cn");
                excludedDomains.Add("core.cloudapi.de");
                excludedDomains.Add("core.usgovcloudapi.net");
                excludedDomains.Add("localhost");
                excludedDomains.Add("127.0.0.1");

                var includedActivities = dependencyCollector.IncludeDiagnosticSourceActivities;
                includedActivities.Add("Microsoft.Azure.ServiceBus");

                dependencyCollector.EnableW3CHeadersInjection = options.HttpAutoCollectionOptions.EnableW3CDistributedTracing;
                return(dependencyCollector);
            });

            services.AddSingleton <ITelemetryModule>(provider =>
            {
                var options = provider.GetService <IOptions <ApplicationInsightsLoggerOptions> >().Value;
                if (options.HttpAutoCollectionOptions.EnableHttpTriggerExtendedInfoCollection)
                {
                    var appIdProvider = provider.GetService <IApplicationIdProvider>();

                    return(new RequestTrackingTelemetryModule(appIdProvider)
                    {
                        CollectionOptions = new RequestCollectionOptions
                        {
                            TrackExceptions = false, // webjobs/functions track exceptions themselves
                            EnableW3CDistributedTracing = options.HttpAutoCollectionOptions.EnableW3CDistributedTracing,
                            InjectResponseHeaders = options.HttpAutoCollectionOptions.EnableResponseHeaderInjection
                        }
                    });
                }

                return(NullTelemetryModule.Instance);
            });

            services.AddSingleton <ITelemetryModule, AppServicesHeartbeatTelemetryModule>();

            services.AddSingleton <ITelemetryChannel, ServerTelemetryChannel>();
            services.AddSingleton <TelemetryConfiguration>(provider =>
            {
                ApplicationInsightsLoggerOptions options = provider.GetService <IOptions <ApplicationInsightsLoggerOptions> >().Value;
                LoggerFilterOptions filterOptions        = CreateFilterOptions(provider.GetService <IOptions <LoggerFilterOptions> >().Value);

                ITelemetryChannel channel     = provider.GetService <ITelemetryChannel>();
                TelemetryConfiguration config = TelemetryConfiguration.CreateDefault();

                IApplicationIdProvider appIdProvider   = provider.GetService <IApplicationIdProvider>();
                ISdkVersionProvider sdkVersionProvider = provider.GetService <ISdkVersionProvider>();
                // Because of https://github.com/Microsoft/ApplicationInsights-dotnet-server/issues/943
                // we have to touch (and create) Active configuration before initializing telemetry modules
                // Active configuration is used to report AppInsights heartbeats
                // role environment telemetry initializer is needed to correlate heartbeats to particular host

                var activeConfig = TelemetryConfiguration.Active;
                if (!string.IsNullOrEmpty(options.InstrumentationKey) &&
                    string.IsNullOrEmpty(activeConfig.InstrumentationKey))
                {
                    activeConfig.InstrumentationKey = options.InstrumentationKey;
                }

                if (!activeConfig.TelemetryInitializers.OfType <WebJobsRoleEnvironmentTelemetryInitializer>().Any())
                {
                    activeConfig.TelemetryInitializers.Add(new WebJobsRoleEnvironmentTelemetryInitializer());
                    activeConfig.TelemetryInitializers.Add(new WebJobsTelemetryInitializer(sdkVersionProvider));
                    if (options.HttpAutoCollectionOptions.EnableW3CDistributedTracing)
                    {
                        // W3C distributed tracing is enabled by the feature flag inside ApplicationInsights SDK
                        // W3COperationCorrelationTelemetryInitializer will go away once W3C is implemented
                        // in the DiagnosticSource (.NET)

                        TelemetryConfiguration.Active.TelemetryInitializers.Add(new W3COperationCorrelationTelemetryInitializer());
                    }
                }

                SetupTelemetryConfiguration(
                    config,
                    options,
                    channel,
                    provider.GetServices <ITelemetryInitializer>(),
                    provider.GetServices <ITelemetryModule>(),
                    appIdProvider,
                    filterOptions);

                return(config);
            });

            services.AddSingleton <TelemetryClient>(provider =>
            {
                TelemetryConfiguration configuration = provider.GetService <TelemetryConfiguration>();
                TelemetryClient client = new TelemetryClient(configuration);

                ISdkVersionProvider versionProvider            = provider.GetService <ISdkVersionProvider>();
                client.Context.GetInternalContext().SdkVersion = versionProvider?.GetSdkVersion();

                return(client);
            }
                                                    );

            services.AddSingleton <ILoggerProvider, ApplicationInsightsLoggerProvider>();

            return(services);
        }