Пример #1
0
        public static IHostBuilder CreateHostBuilder(IConfiguration config, string environment)
        {
            Console.Title = "Exceptionless Web";

            var options = AppOptions.ReadFromConfiguration(config);

            var loggerConfig = new LoggerConfiguration().ReadFrom.Configuration(config);

            if (!String.IsNullOrEmpty(options.ExceptionlessApiKey))
            {
                loggerConfig.WriteTo.Sink(new ExceptionlessSink(), LogEventLevel.Verbose);
            }

            Log.Logger = loggerConfig.CreateLogger();
            var configDictionary = config.ToDictionary("Serilog");

            Log.Information("Bootstrapping Exceptionless Web in {AppMode} mode ({InformationalVersion}) on {MachineName} with settings {@Settings}", environment, options.InformationalVersion, Environment.MachineName, configDictionary);

            bool useApplicationInsights = !String.IsNullOrEmpty(options.ApplicationInsightsKey);
            var  builder = Host.CreateDefaultBuilder()
                           .UseEnvironment(environment)
                           .ConfigureWebHostDefaults(webBuilder => {
                webBuilder
                .UseConfiguration(config)
                .ConfigureKestrel(c => {
                    c.AddServerHeader = false;
                    // c.AllowSynchronousIO = false; // TODO: Investigate issue with JSON Serialization.

                    if (options.MaximumEventPostSize > 0)
                    {
                        c.Limits.MaxRequestBodySize = options.MaximumEventPostSize;
                    }
                })
                .UseStartup <Startup>();

                if (String.IsNullOrEmpty(webBuilder.GetSetting(WebHostDefaults.ContentRootKey)))
                {
                    webBuilder.UseContentRoot(Directory.GetCurrentDirectory());
                }

                var metricOptions = MetricOptions.ReadFromConfiguration(config);
                if (!String.IsNullOrEmpty(metricOptions.Provider))
                {
                    ConfigureMetricsReporting(webBuilder, metricOptions);
                }
            })
                           .UseSerilog()
                           .ConfigureServices((ctx, services) => {
                services.AddSingleton(config);
                services.AddHttpContextAccessor();

                if (useApplicationInsights)
                {
                    services.AddSingleton <ITelemetryInitializer, ExceptionlessTelemetryInitializer>();
                    services.AddApplicationInsightsTelemetry(options.ApplicationInsightsKey);
                }
            });

            return(builder);
        }
Пример #2
0
        public static AppOptions ReadFromConfiguration(IConfiguration config)
        {
            var options = new AppOptions();

            options.BaseURL                = config.GetValue <string>(nameof(options.BaseURL))?.TrimEnd('/');
            options.InternalProjectId      = config.GetValue(nameof(options.InternalProjectId), "54b56e480ef9605a88a13153");
            options.ExceptionlessApiKey    = config.GetValue <string>(nameof(options.ExceptionlessApiKey));
            options.ExceptionlessServerUrl = config.GetValue <string>(nameof(options.ExceptionlessServerUrl));

            options.AppMode            = config.GetValue(nameof(options.AppMode), AppMode.Production);
            options.AppScope           = config.GetValue(nameof(options.AppScope), options.AppMode.ToScope());
            options.RunJobsInProcess   = config.GetValue(nameof(options.RunJobsInProcess), options.AppMode == AppMode.Development);
            options.JobsIterationLimit = config.GetValue(nameof(options.JobsIterationLimit), -1);
            options.BotThrottleLimit   = config.GetValue(nameof(options.BotThrottleLimit), 25).NormalizeValue();

            options.ApiThrottleLimit        = config.GetValue(nameof(options.ApiThrottleLimit), options.AppMode == AppMode.Development ? Int32.MaxValue : 3500).NormalizeValue();
            options.EnableArchive           = config.GetValue(nameof(options.EnableArchive), true);
            options.EnableSampleData        = config.GetValue(nameof(options.EnableSampleData), options.AppMode != AppMode.Development);
            options.EventSubmissionDisabled = config.GetValue(nameof(options.EventSubmissionDisabled), false);
            options.DisabledPipelineActions = config.GetValueList(nameof(options.DisabledPipelineActions));
            options.DisabledPlugins         = config.GetValueList(nameof(options.DisabledPlugins));
            options.MaximumEventPostSize    = config.GetValue(nameof(options.MaximumEventPostSize), 200000).NormalizeValue();
            options.MaximumRetentionDays    = config.GetValue(nameof(options.MaximumRetentionDays), 180).NormalizeValue();

            options.GoogleGeocodingApiKey = config.GetValue <string>(nameof(options.GoogleGeocodingApiKey));
            options.MaxMindGeoIpKey       = config.GetValue <string>(nameof(options.MaxMindGeoIpKey));

            options.BulkBatchSize = config.GetValue(nameof(options.BulkBatchSize), 1000);

            options.EnableRepositoryNotifications = config.GetValue(nameof(options.EnableRepositoryNotifications), true);
            options.EnableWebSockets = config.GetValue(nameof(options.EnableWebSockets), true);

            try {
                var versionInfo = FileVersionInfo.GetVersionInfo(typeof(AppOptions).Assembly.Location);
                options.Version = versionInfo.FileVersion;
                options.InformationalVersion = versionInfo.ProductVersion;
            }
            catch { }

            options.CacheOptions         = CacheOptions.ReadFromConfiguration(config, options);
            options.MessageBusOptions    = MessageBusOptions.ReadFromConfiguration(config, options);
            options.MetricOptions        = MetricOptions.ReadFromConfiguration(config);
            options.QueueOptions         = QueueOptions.ReadFromConfiguration(config, options);
            options.StorageOptions       = StorageOptions.ReadFromConfiguration(config, options);
            options.EmailOptions         = EmailOptions.ReadFromConfiguration(config, options);
            options.ElasticsearchOptions = ElasticsearchOptions.ReadFromConfiguration(config, options);
            options.IntercomOptions      = IntercomOptions.ReadFromConfiguration(config);
            options.SlackOptions         = SlackOptions.ReadFromConfiguration(config);
            options.StripeOptions        = StripeOptions.ReadFromConfiguration(config);
            options.AuthOptions          = AuthOptions.ReadFromConfiguration(config);

            return(options);
        }
        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            var jobOptions = new JobRunnerOptions(args);

            Console.Title = jobOptions.JobName != null ? $"Exceptionless {jobOptions.JobName} Job" : "Exceptionless Jobs";

            string environment = Environment.GetEnvironmentVariable("EX_AppMode");

            if (String.IsNullOrWhiteSpace(environment))
            {
                environment = "Production";
            }

            string currentDirectory = Directory.GetCurrentDirectory();
            var    config           = new ConfigurationBuilder()
                                      .SetBasePath(currentDirectory)
                                      .AddYamlFile("appsettings.yml", optional: true, reloadOnChange: true)
                                      .AddYamlFile($"appsettings.{environment}.yml", optional: true, reloadOnChange: true)
                                      .AddEnvironmentVariables("EX_")
                                      .AddCommandLine(args)
                                      .Build();

            var options = AppOptions.ReadFromConfiguration(config);

            var loggerConfig = new LoggerConfiguration().ReadFrom.Configuration(config);

            if (!String.IsNullOrEmpty(options.ExceptionlessApiKey))
            {
                loggerConfig.WriteTo.Sink(new ExceptionlessSink(), LogEventLevel.Verbose);
            }

            var serilogLogger = loggerConfig.CreateLogger();

            _logger = new SerilogLoggerFactory(serilogLogger).CreateLogger <Program>();

            var configDictionary = config.ToDictionary("Serilog");

            _logger.LogInformation("Bootstrapping Exceptionless {JobName} job(s) in {AppMode} mode ({InformationalVersion}) on {MachineName} with settings {@Settings}", jobOptions.JobName ?? "All", environment, options.InformationalVersion, Environment.MachineName, configDictionary);

            bool useApplicationInsights = !String.IsNullOrEmpty(options.ApplicationInsightsKey);

            var builder = WebHost.CreateDefaultBuilder(args)
                          .UseEnvironment(environment)
                          .UseConfiguration(config)
                          .UseDefaultServiceProvider((ctx, o) => {
                o.ValidateScopes = ctx.HostingEnvironment.IsDevelopment();
            })
                          .ConfigureKestrel(c => {
                c.AddServerHeader = false;
                //c.AllowSynchronousIO = false; // TODO: Investigate issue with JSON Serialization.
            })
                          .UseSerilog(serilogLogger, true)
                          .ConfigureServices((ctx, services) => {
                services.AddHttpContextAccessor();

                AddJobs(services, jobOptions);

                if (useApplicationInsights)
                {
                    services.AddApplicationInsightsTelemetry();
                }

                Bootstrapper.RegisterServices(services);
                var serviceProvider = services.BuildServiceProvider();
                Insulation.Bootstrapper.RegisterServices(serviceProvider, services, options, true);

                services.PostConfigure <HostFilteringOptions>(o => {
                    if (o.AllowedHosts == null || o.AllowedHosts.Count == 0)
                    {
                        // "AllowedHosts": "localhost;127.0.0.1;[::1]"
                        var hosts = ctx.Configuration["AllowedHosts"]?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                        // Fall back to "*" to disable.
                        o.AllowedHosts = (hosts?.Length > 0 ? hosts : new[] { "*" });
                    }
                });

                services.AddSingleton <IOptionsChangeTokenSource <HostFilteringOptions> >(new ConfigurationChangeTokenSource <HostFilteringOptions>(ctx.Configuration));
                services.AddTransient <IStartupFilter, HostFilteringStartupFilter>();
            })
                          .Configure(app => {
                Bootstrapper.LogConfiguration(app.ApplicationServices, options, _logger);

                if (!String.IsNullOrEmpty(options.ExceptionlessApiKey) && !String.IsNullOrEmpty(options.ExceptionlessServerUrl))
                {
                    app.UseExceptionless(ExceptionlessClient.Default);
                }

                app.UseHealthChecks("/health", new HealthCheckOptions {
                    Predicate = hcr => !String.IsNullOrEmpty(jobOptions.JobName) ? hcr.Tags.Contains(jobOptions.JobName) : hcr.Tags.Contains("AllJobs")
                });

                app.UseHealthChecks("/ready", new HealthCheckOptions {
                    Predicate = hcr => hcr.Tags.Contains("Critical")
                });

                app.UseWaitForStartupActionsBeforeServingRequests();
                app.Use((context, func) => context.Response.WriteAsync($"Running Job: {jobOptions.JobName}"));
            });

            if (String.IsNullOrEmpty(builder.GetSetting(WebHostDefaults.ContentRootKey)))
            {
                builder.UseContentRoot(Directory.GetCurrentDirectory());
            }

            if (useApplicationInsights)
            {
                builder.UseApplicationInsights(options.ApplicationInsightsKey);
            }

            var metricOptions = MetricOptions.ReadFromConfiguration(config);

            if (!String.IsNullOrEmpty(metricOptions.Provider))
            {
                ConfigureMetricsReporting(builder, metricOptions);
            }

            return(builder);
        }
Пример #4
0
        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            var jobOptions = new JobRunnerOptions(args);

            Console.Title = jobOptions.JobName != null ? $"Exceptionless {jobOptions.JobName} Job" : "Exceptionless Jobs";

            string environment = Environment.GetEnvironmentVariable("EX_AppMode");

            if (String.IsNullOrWhiteSpace(environment))
            {
                environment = "Production";
            }

            var config = new ConfigurationBuilder()
                         .SetBasePath(Directory.GetCurrentDirectory())
                         .AddYamlFile("appsettings.yml", optional: true, reloadOnChange: true)
                         .AddYamlFile($"appsettings.{environment}.yml", optional: true, reloadOnChange: true)
                         .AddEnvironmentVariables("EX_")
                         .AddEnvironmentVariables("ASPNETCORE_")
                         .AddCommandLine(args)
                         .Build();

            var options = AppOptions.ReadFromConfiguration(config);

            var loggerConfig = new LoggerConfiguration().ReadFrom.Configuration(config);

            if (!String.IsNullOrEmpty(options.ExceptionlessApiKey))
            {
                loggerConfig.WriteTo.Sink(new ExceptionlessSink(), LogEventLevel.Verbose);
            }

            Log.Logger = loggerConfig.CreateLogger();
            var configDictionary = config.ToDictionary("Serilog");

            Log.Information("Bootstrapping Exceptionless {JobName} job(s) in {AppMode} mode ({InformationalVersion}) on {MachineName} with settings {@Settings}", jobOptions.JobName ?? "All", environment, options.InformationalVersion, Environment.MachineName, configDictionary);

            bool useApplicationInsights = !String.IsNullOrEmpty(options.ApplicationInsightsKey);

            var builder = Host.CreateDefaultBuilder()
                          .UseEnvironment(environment)
                          .UseSerilog()
                          .ConfigureWebHostDefaults(webBuilder => {
                webBuilder
                .UseConfiguration(config)
                .Configure(app => {
                    app.UseSerilogRequestLogging(o => o.GetLevel = (context, duration, ex) => {
                        if (ex != null || context.Response.StatusCode > 499)
                        {
                            return(LogEventLevel.Error);
                        }

                        return(duration < 1000 && context.Response.StatusCode < 400 ? LogEventLevel.Debug : LogEventLevel.Information);
                    });
                })
                .Configure(app => {
                    Bootstrapper.LogConfiguration(app.ApplicationServices, options, app.ApplicationServices.GetService <ILogger <Program> >());

                    if (!String.IsNullOrEmpty(options.ExceptionlessApiKey) && !String.IsNullOrEmpty(options.ExceptionlessServerUrl))
                    {
                        app.UseExceptionless(ExceptionlessClient.Default);
                    }

                    app.UseHealthChecks("/health", new HealthCheckOptions {
                        Predicate = hcr => !String.IsNullOrEmpty(jobOptions.JobName) ? hcr.Tags.Contains(jobOptions.JobName) : hcr.Tags.Contains("AllJobs")
                    });

                    app.UseHealthChecks("/ready", new HealthCheckOptions {
                        Predicate = hcr => hcr.Tags.Contains("Critical")
                    });

                    app.UseWaitForStartupActionsBeforeServingRequests();
                    app.Use((context, func) => context.Response.WriteAsync($"Running Job: {jobOptions.JobName}"));
                });

                var metricOptions = MetricOptions.ReadFromConfiguration(config);
                if (!String.IsNullOrEmpty(metricOptions.Provider))
                {
                    ConfigureMetricsReporting(webBuilder, metricOptions);
                }
            })
                          .ConfigureServices((ctx, services) => {
                AddJobs(services, jobOptions);
                services.AddAppOptions(options);

                if (useApplicationInsights)
                {
                    services.AddApplicationInsightsTelemetry(options.ApplicationInsightsKey);
                }

                Bootstrapper.RegisterServices(services);
                Insulation.Bootstrapper.RegisterServices(services, options, true);
            });

            return(builder);
        }
Пример #5
0
        public static IWebHostBuilder CreateWebHostBuilder(IConfiguration config, string environment)
        {
            Console.Title = "Exceptionless Web";

            var options = AppOptions.ReadFromConfiguration(config);

            var loggerConfig = new LoggerConfiguration().ReadFrom.Configuration(config);

            if (!String.IsNullOrEmpty(options.ExceptionlessApiKey))
            {
                loggerConfig.WriteTo.Sink(new ExceptionlessSink(), LogEventLevel.Verbose);
            }

            var serilogLogger = loggerConfig.CreateLogger();

            _logger = new SerilogLoggerFactory(serilogLogger).CreateLogger <Program>();

            var configDictionary = config.ToDictionary("Serilog");

            _logger.LogInformation("Bootstrapping Exceptionless Web in {AppMode} mode ({InformationalVersion}) on {MachineName} with settings {@Settings}", environment, options.InformationalVersion, Environment.MachineName, configDictionary);

            bool useApplicationInsights = !String.IsNullOrEmpty(options.ApplicationInsightsKey);

            var builder = WebHost.CreateDefaultBuilder()
                          .UseEnvironment(environment)
                          .UseConfiguration(config)
                          .UseDefaultServiceProvider((ctx, o) => {
                o.ValidateScopes = ctx.HostingEnvironment.IsDevelopment();
            })
                          .ConfigureKestrel(c => {
                c.AddServerHeader = false;
                // c.AllowSynchronousIO = false; // TODO: Investigate issue with JSON Serialization.

                if (options.MaximumEventPostSize > 0)
                {
                    c.Limits.MaxRequestBodySize = options.MaximumEventPostSize;
                }
            })
                          .UseSerilog(serilogLogger, true)
                          .ConfigureServices((ctx, services) => {
                services.AddSingleton(config);
                services.AddHttpContextAccessor();

                if (useApplicationInsights)
                {
                    services.AddSingleton <ITelemetryInitializer, ExceptionlessTelemetryInitializer>();
                    services.AddApplicationInsightsTelemetry();
                }

                services.PostConfigure <HostFilteringOptions>(o => {
                    if (o.AllowedHosts == null || o.AllowedHosts.Count == 0)
                    {
                        // "AllowedHosts": "localhost;127.0.0.1;[::1]"
                        var hosts = ctx.Configuration["AllowedHosts"]?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                        // Fall back to "*" to disable.
                        o.AllowedHosts = (hosts?.Length > 0 ? hosts : new[] { "*" });
                    }
                });

                services.AddSingleton <IOptionsChangeTokenSource <HostFilteringOptions> >(new ConfigurationChangeTokenSource <HostFilteringOptions>(ctx.Configuration));
                services.AddTransient <IStartupFilter, HostFilteringStartupFilter>();
            })
                          .UseStartup <Startup>();

            if (String.IsNullOrEmpty(builder.GetSetting(WebHostDefaults.ContentRootKey)))
            {
                builder.UseContentRoot(Directory.GetCurrentDirectory());
            }

            if (useApplicationInsights)
            {
                builder.UseApplicationInsights(options.ApplicationInsightsKey);
            }

            var metricOptions = MetricOptions.ReadFromConfiguration(config);

            if (!String.IsNullOrEmpty(metricOptions.Provider))
            {
                ConfigureMetricsReporting(builder, metricOptions);
            }

            return(builder);
        }