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); }
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); }
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); }
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); }