Beispiel #1
0
        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);
        }