/
Program.cs
125 lines (109 loc) · 5.58 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using App.Metrics;
using App.Metrics.AspNetCore;
using App.Metrics.Formatters;
using App.Metrics.Formatters.Prometheus;
using Exceptionless.Core;
using Exceptionless.Core.Configuration;
using Exceptionless.Core.Extensions;
using Exceptionless.Insulation.Configuration;
using Exceptionless.Web.Utility;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
using Serilog.Sinks.Exceptionless;
namespace Exceptionless.Web {
public class Program {
public static async Task<int> Main(string[] args) {
try {
await CreateHostBuilder(args).Build().RunAsync();
return 0;
} catch (Exception ex) {
Log.Fatal(ex, "Job host terminated unexpectedly");
return 1;
} finally {
Log.CloseAndFlush();
await ExceptionlessClient.Default.ProcessQueueAsync();
if (Debugger.IsAttached)
Console.ReadKey();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) {
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_")
.AddEnvironmentVariables("ASPNETCORE_")
.AddCommandLine(args)
.Build();
return CreateHostBuilder(config, environment);
}
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;
}
private static void ConfigureMetricsReporting(IWebHostBuilder builder, MetricOptions options) {
if (String.Equals(options.Provider, "prometheus")) {
var metrics = AppMetrics.CreateDefaultBuilder()
.OutputMetrics.AsPrometheusPlainText()
.OutputMetrics.AsPrometheusProtobuf()
.Build();
builder.ConfigureMetrics(metrics).UseMetrics(o => {
o.EndpointOptions = endpointsOptions => {
endpointsOptions.MetricsTextEndpointOutputFormatter = metrics.OutputMetricsFormatters.GetType<MetricsPrometheusTextOutputFormatter>();
endpointsOptions.MetricsEndpointOutputFormatter = metrics.OutputMetricsFormatters.GetType<MetricsPrometheusProtobufOutputFormatter>();
};
});
} else if (!String.Equals(options.Provider, "statsd")) {
builder.UseMetrics();
}
}
}
}