// Copyright Epic Games, Inc. All Rights Reserved. using System.Reflection; using EpicGames.Core; using EpicGames.Horde; using EpicGames.Horde.Utilities; using JobDriver.Execution; using JobDriver.Utility; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Trace; namespace JobDriver { /// /// Application class for the job driver /// public static class DriverApp { /// /// Main entry point /// public static async Task Main(string[] args) { CommandLineArguments arguments = new CommandLineArguments(args); // Create the services IServiceCollection services = new ServiceCollection(); RegisterServices(services); // Run the host await using ServiceProvider serviceProvider = services.BuildServiceProvider(); int exitCode = await CommandHost.RunAsync(arguments, serviceProvider, null); // JobDriver execution is often short-lived so ensure any outstanding traces are flushed TracerProvider? tracerProvider = serviceProvider.GetService(); tracerProvider?.ForceFlush(5000); return exitCode; } /// /// Helper method to register services for this app /// /// public static void RegisterServices(IServiceCollection services) { // Read the driver config IConfiguration configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: false) .AddJsonFile("appsettings.Epic.json", optional: true) .AddEnvironmentVariables() .Build(); // Register the services services.AddOptions().Configure(options => configuration.GetSection("Driver").Bind(options)).ValidateDataAnnotations(); services.AddLogging(builder => builder.AddEpicDefault()); // Read any OpenTelemetry settings as an env var, so we can bootstrap it during dependency injection setup // Passing it as an argument is too late in startup OpenTelemetrySettings openTelemetrySettings = new(); string? otelSettingsJson = Environment.GetEnvironmentVariable("UE_HORDE_OTEL_SETTINGS"); if (otelSettingsJson != null) { try { openTelemetrySettings = OpenTelemetrySettingsExtensions.Deserialize(otelSettingsJson, true); } catch (Exception e) { Console.WriteLine("Unable to enable OpenTelemetry: " + e.Message); } } OpenTelemetryHelper.Configure(services, openTelemetrySettings); services.AddHorde(options => options.AllowAuthPrompt = false); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddCommandsFromAssembly(Assembly.GetExecutingAssembly()); } } }