private static void ScheduleResourcesScraping(MetricsDeclaration metricsDeclaration, MetricSinkWriter metricSinkWriter, AzureMonitorClientFactory azureMonitorClientFactory, IAzureScrapingPrometheusMetricsCollector azureScrapingPrometheusMetricsCollector, IMemoryCache resourceMetricDefinitionMemoryCache, IScrapingMutex scrapingTaskMutex, IConfiguration configuration, IOptions <AzureMonitorIntegrationConfiguration> azureMonitorIntegrationConfiguration, IOptions <AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory, ILogger <Startup> logger, IServiceCollection services) { var jobName = GenerateResourceScrapingJobName(metricsDeclaration, logger); services.AddScheduler(builder => { builder.AddJob(jobServices => new ResourcesScrapingJob(jobName, metricsDeclaration, jobServices.GetService <ResourceDiscoveryRepository>(), metricSinkWriter, jobServices.GetService <MetricScraperFactory>(), azureMonitorClientFactory, azureScrapingPrometheusMetricsCollector, resourceMetricDefinitionMemoryCache, scrapingTaskMutex, configuration, azureMonitorIntegrationConfiguration, azureMonitorLoggingConfiguration, loggerFactory, jobServices.GetService <ILogger <ResourcesScrapingJob> >()), schedulerOptions => { schedulerOptions.CronSchedule = metricsDeclaration.Metrics[0].Scraping.Schedule; schedulerOptions.RunImmediately = true; }, jobName: jobName); builder.AddUnobservedTaskExceptionHandler(s => { return ((_, exceptionEventArgs) => { var exceptionLogger = s.GetService <ILogger <BackgroundJobMonitor> >(); BackgroundJobMonitor.HandleException(jobName, exceptionEventArgs, exceptionLogger); }); }); }); logger.LogInformation("Scheduled scraping job {JobName}.", jobName); }
/// <summary> /// Inject configuration /// </summary> public static IServiceCollection AddBackgroundJobs(this IServiceCollection services) { services.AddScheduler(builder => { var jobName = "Azure Subscription Discovery"; builder.AddJob <AzureSubscriptionDiscoveryBackgroundJob>( jobServices => { return(new AzureSubscriptionDiscoveryBackgroundJob(jobName, jobServices.GetRequiredService <IAzureResourceRepository>(), jobServices.GetRequiredService <IPrometheusMetricsCollector>(), jobServices.GetRequiredService <ILogger <AzureSubscriptionDiscoveryBackgroundJob> >())); }, schedulerOptions => { schedulerOptions.CronSchedule = "0 * * * *"; schedulerOptions.RunImmediately = true; }, jobName: jobName); builder.AddUnobservedTaskExceptionHandler(s => { return ((_, exceptionEventArgs) => { var exceptionLogger = s.GetService <ILogger <BackgroundJobMonitor> >(); BackgroundJobMonitor.HandleException(jobName, exceptionEventArgs, exceptionLogger); }); }); }); services.AddScheduler(builder => { var jobName = "Azure Resource Group Discovery"; builder.AddJob <AzureResourceGroupsDiscoveryBackgroundJob>( jobServices => { return(new AzureResourceGroupsDiscoveryBackgroundJob(jobName, jobServices.GetRequiredService <IAzureResourceRepository>(), jobServices.GetRequiredService <IPrometheusMetricsCollector>(), jobServices.GetRequiredService <ILogger <AzureResourceGroupsDiscoveryBackgroundJob> >())); }, schedulerOptions => { schedulerOptions.CronSchedule = "*/15 * * * *"; schedulerOptions.RunImmediately = true; }, jobName: jobName); builder.AddUnobservedTaskExceptionHandler(s => { return ((_, exceptionEventArgs) => { var exceptionLogger = s.GetService <ILogger <BackgroundJobMonitor> >(); BackgroundJobMonitor.HandleException(jobName, exceptionEventArgs, exceptionLogger); }); }); }); return(services); }