public async Task Invoke(HttpContext context, IMetricQueriesProvider queriesProvider, IOptions <ExporterOptions> optionsProvider, IMetricQueryExecutor queryExecutor, IMetricsWriter metricsWriter, ILogger <OndemandMetricsEvaluationMiddleware> logger) { var options = optionsProvider.Value; var defaultMode = options.Metrics.Evaluation.Mode; var queries = await queriesProvider.GetAsync(context.RequestAborted); var tasks = queries.Select(q => { if (q.EvaluationMode == MetricsEvaluationMode.Scheduled) { return(Task.CompletedTask); } if (!q.EvaluationMode.HasValue && defaultMode == MetricsEvaluationMode.Scheduled) { return(Task.CompletedTask); } return(Task.Run(async() => { try { logger.LogInformation($"Executing on-demand query '{q.Name}'"); var timeout = q.Timeout.GetValueOrDefault(options.Metrics.Evaluation.Timeout); var result = await queryExecutor.ExecuteAsync(q, timeout, context.RequestAborted); await metricsWriter.WriteAsync(q, result, context.RequestAborted); logger.LogInformation($"Executed on-demand query '{q.Name}'"); } catch (OperationCanceledException) { // Ignore } catch (Exception e) { logger.LogError(e, $"Unable to write metric for query '{q.Name}'"); } }, context.RequestAborted)); }); await Task.WhenAll(tasks); await _next(context); }
public ScheduledMetricsEvaluator( ILogger <ScheduledMetricsEvaluator> logger, IMetricQueryExecutor queryExecutor, IMetricsWriter metricsWriter, IOptions <ExporterOptions> optionsProvider, IBackgroundJobClient jobClient) { _logger = logger; _queryExecutor = queryExecutor; _metricsWriter = metricsWriter; _optionsProvider = optionsProvider; _jobClient = jobClient; }