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);
        }
Ejemplo n.º 2
0
 public ScheduledMetricsInitializer(
     IMetricQueriesProvider queriesProvider,
     IOptions <ExporterOptions> optionsProvider,
     IBackgroundJobClient jobClient,
     ILogger <ScheduledMetricsInitializer> logger,
     MetricsSchedulerInitializedHealthCheck healthCheck)
 {
     _queriesProvider = queriesProvider;
     _optionsProvider = optionsProvider;
     _jobClient       = jobClient;
     _logger          = logger;
     _healthCheck     = healthCheck;
 }