using MareSynchronosServices.Discord; using MareSynchronosShared.Data; using MareSynchronosShared.Metrics; using Microsoft.EntityFrameworkCore; using Prometheus; using MareSynchronosShared.Utils; using Grpc.Net.Client.Configuration; using MareSynchronosShared.Protos; using MareSynchronosShared.Services; using Grpc.Net.ClientFactory; using Microsoft.Extensions.Options; using Microsoft.Extensions.DependencyInjection; namespace MareSynchronosServices; public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { var mareConfig = Configuration.GetSection("MareSynchronos"); services.AddDbContextPool(options => { options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"), builder => { builder.MigrationsHistoryTable("_efmigrationshistory", "public"); }).UseSnakeCaseNamingConvention(); options.EnableThreadSafetyChecks(false); }, Configuration.GetValue(nameof(MareConfigurationBase.DbContextPoolSize), 1024)); services.AddSingleton(m => new MareMetrics(m.GetService>(), new List { }, new List { })); var noRetryConfig = new MethodConfig { Names = { MethodName.Default }, RetryPolicy = null }; services.AddGrpcClient(c => { c.Address = new Uri(mareConfig.GetValue(nameof(ServicesConfiguration.MainServerGrpcAddress))); }).ConfigureChannel(c => { c.ServiceConfig = new ServiceConfig { MethodConfigs = { noRetryConfig } }; c.HttpHandler = new SocketsHttpHandler() { EnableMultipleHttp2Connections = true }; }); services.AddGrpcClient("MainServer", c => { c.Address = new Uri(mareConfig.GetValue(nameof(ServicesConfiguration.MainServerGrpcAddress))); }).ConfigureChannel(c => { c.ServiceConfig = new ServiceConfig { MethodConfigs = { noRetryConfig } }; c.HttpHandler = new SocketsHttpHandler() { EnableMultipleHttp2Connections = true }; }); services.Configure(Configuration.GetRequiredSection("MareSynchronos")); services.Configure(Configuration.GetRequiredSection("MareSynchronos")); services.Configure(Configuration.GetRequiredSection("MareSynchronos")); services.AddSingleton(Configuration); services.AddSingleton(); services.AddHostedService(); services.AddSingleton, MareConfigurationServiceServer>(); services.AddSingleton>(c => new MareConfigurationServiceClient( c.GetService>>(), c.GetService>(), c.GetService(), "MainServer")); services.AddSingleton>(c => new MareConfigurationServiceClient( c.GetService>>(), c.GetService>(), c.GetService(), "MainServer")); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { var config = app.ApplicationServices.GetRequiredService>(); var metricServer = new KestrelMetricServer(config.GetValueOrDefault(nameof(MareConfigurationBase.MetricsPort), 4982)); metricServer.Start(); } }