Search in sources :

Example 1 with ScrapeConfig

use of ai.asserts.aws.cloudwatch.config.ScrapeConfig in project aws-cloudwatch-exporter by asserts.

the class MetricTaskManager method afterPropertiesSet.

public void afterPropertiesSet() {
    ScrapeConfig scrapeConfig = scrapeConfigProvider.getScrapeConfig();
    Set<String> regions = scrapeConfig.getRegions();
    scrapeConfig.getNamespaces().stream().filter(nc -> !CollectionUtils.isEmpty(nc.getMetrics())).flatMap(nc -> nc.getMetrics().stream().map(MetricConfig::getScrapeInterval)).forEach(interval -> regions.forEach(region -> addScrapeTask(scrapeConfig, interval, region)));
    alarmMetricExporter.register(collectorRegistry);
    // After AlarmMetricExporter is register call one time alarm fetcher
    alarmFetcher.sendAlarmsForRegions();
}
Also used : MetricScrapeTask(ai.asserts.aws.exporter.MetricScrapeTask) CollectorRegistry(io.prometheus.client.CollectorRegistry) Getter(lombok.Getter) ScrapeConfigProvider(ai.asserts.aws.cloudwatch.config.ScrapeConfigProvider) Timed(io.micrometer.core.annotation.Timed) AlarmFetcher(ai.asserts.aws.cloudwatch.alarms.AlarmFetcher) AutowireCapableBeanFactory(org.springframework.beans.factory.config.AutowireCapableBeanFactory) Set(java.util.Set) Scheduled(org.springframework.scheduling.annotation.Scheduled) InitializingBean(org.springframework.beans.factory.InitializingBean) ScrapeConfig(ai.asserts.aws.cloudwatch.config.ScrapeConfig) Slf4j(lombok.extern.slf4j.Slf4j) Component(org.springframework.stereotype.Component) AlarmMetricExporter(ai.asserts.aws.cloudwatch.alarms.AlarmMetricExporter) TreeMap(java.util.TreeMap) CollectionUtils(org.springframework.util.CollectionUtils) Map(java.util.Map) ECSServiceDiscoveryExporter(ai.asserts.aws.exporter.ECSServiceDiscoveryExporter) VisibleForTesting(com.google.common.annotations.VisibleForTesting) AllArgsConstructor(lombok.AllArgsConstructor) MetricConfig(ai.asserts.aws.cloudwatch.config.MetricConfig) ExecutorService(java.util.concurrent.ExecutorService) MetricConfig(ai.asserts.aws.cloudwatch.config.MetricConfig) ScrapeConfig(ai.asserts.aws.cloudwatch.config.ScrapeConfig)

Example 2 with ScrapeConfig

use of ai.asserts.aws.cloudwatch.config.ScrapeConfig in project aws-cloudwatch-exporter by asserts.

the class LambdaCapacityExporter method getMetrics.

private List<MetricFamilySamples> getMetrics() {
    ScrapeConfig scrapeConfig = scrapeConfigProvider.getScrapeConfig();
    Optional<NamespaceConfig> optional = scrapeConfig.getLambdaConfig();
    String availableMetric = metricNameUtil.getLambdaMetric("available_concurrency");
    String requestedMetric = metricNameUtil.getLambdaMetric("requested_concurrency");
    String allocatedMetric = metricNameUtil.getLambdaMetric("allocated_concurrency");
    String reservedMetric = metricNameUtil.getLambdaMetric("reserved_concurrency");
    String timeoutMetric = metricNameUtil.getLambdaMetric("timeout_seconds");
    String memoryLimit = metricNameUtil.getLambdaMetric("memory_limit_mb");
    String accountLimitMetric = metricNameUtil.getLambdaMetric("account_limit");
    Map<String, List<MetricFamilySamples.Sample>> samples = new TreeMap<>();
    optional.ifPresent(lambdaConfig -> functionScraper.getFunctions().forEach((region, functions) -> {
        log.info(" - Getting Lambda account and provisioned concurrency for region {}", region);
        try (LambdaClient lambdaClient = awsClientProvider.getLambdaClient(region)) {
            GetAccountSettingsResponse accountSettings = rateLimiter.doWithRateLimit("LambdaClient/getAccountSettings", ImmutableSortedMap.of(SCRAPE_REGION_LABEL, region, SCRAPE_OPERATION_LABEL, "getAccountSettings", SCRAPE_NAMESPACE_LABEL, "AWS/Lambda"), lambdaClient::getAccountSettings);
            MetricFamilySamples.Sample sample = sampleBuilder.buildSingleSample(accountLimitMetric, ImmutableMap.of("region", region, "cw_namespace", lambda.getNormalizedNamespace(), "type", "concurrent_executions"), accountSettings.accountLimit().concurrentExecutions() * 1.0D);
            samples.computeIfAbsent(accountLimitMetric, k -> new ArrayList<>()).add(sample);
            sample = sampleBuilder.buildSingleSample(accountLimitMetric, ImmutableMap.of("region", region, "cw_namespace", lambda.getNormalizedNamespace(), "type", "unreserved_concurrent_executions"), accountSettings.accountLimit().unreservedConcurrentExecutions() * 1.0D);
            samples.computeIfAbsent(accountLimitMetric, k -> new ArrayList<>()).add(sample);
            Set<Resource> fnResources = resourceTagHelper.getFilteredResources(region, lambdaConfig);
            functions.forEach((functionArn, lambdaFunction) -> {
                GetFunctionConcurrencyResponse fCResponse = rateLimiter.doWithRateLimit("LambdaClient/getFunctionConcurrency", ImmutableSortedMap.of(SCRAPE_REGION_LABEL, region, SCRAPE_OPERATION_LABEL, "getFunctionConcurrency", SCRAPE_NAMESPACE_LABEL, "AWS/Lambda"), () -> lambdaClient.getFunctionConcurrency(GetFunctionConcurrencyRequest.builder().functionName(lambdaFunction.getArn()).build()));
                if (fCResponse.reservedConcurrentExecutions() != null) {
                    MetricFamilySamples.Sample reserved = sampleBuilder.buildSingleSample(reservedMetric, ImmutableMap.of("region", region, "cw_namespace", lambda.getNormalizedNamespace(), "d_function_name", lambdaFunction.getName(), "job", lambdaFunction.getName(), SCRAPE_ACCOUNT_ID_LABEL, lambdaFunction.getAccount()), fCResponse.reservedConcurrentExecutions().doubleValue());
                    samples.computeIfAbsent(reservedMetric, k -> new ArrayList<>()).add(reserved);
                }
                Optional<Resource> fnResourceOpt = fnResources.stream().filter(resource -> functionArn.equals(resource.getArn())).findFirst();
                Map<String, String> labels = new TreeMap<>();
                fnResourceOpt.ifPresent(fnResource -> fnResource.addEnvLabel(labels, metricNameUtil));
                labels.put("region", region);
                labels.put("cw_namespace", lambda.getNormalizedNamespace());
                labels.put("d_function_name", lambdaFunction.getName());
                labels.put("job", lambdaFunction.getName());
                labels.put(SCRAPE_ACCOUNT_ID_LABEL, lambdaFunction.getAccount());
                // Export timeout
                double timeout = lambdaFunction.getTimeoutSeconds() * 1.0D;
                samples.computeIfAbsent(timeoutMetric, k -> new ArrayList<>()).add(sampleBuilder.buildSingleSample(timeoutMetric, labels, timeout));
                samples.computeIfAbsent(memoryLimit, k -> new ArrayList<>()).add(sampleBuilder.buildSingleSample(memoryLimit, labels, lambdaFunction.getMemoryMB() * 1.0D));
                ListProvisionedConcurrencyConfigsRequest request = ListProvisionedConcurrencyConfigsRequest.builder().functionName(lambdaFunction.getName()).build();
                ListProvisionedConcurrencyConfigsResponse response = rateLimiter.doWithRateLimit("LambdaClient/listProvisionedConcurrencyConfigs", ImmutableSortedMap.of(SCRAPE_REGION_LABEL, region, SCRAPE_OPERATION_LABEL, "listProvisionedConcurrencyConfigs", SCRAPE_NAMESPACE_LABEL, "AWS/Lambda"), () -> lambdaClient.listProvisionedConcurrencyConfigs(request));
                if (response.hasProvisionedConcurrencyConfigs()) {
                    response.provisionedConcurrencyConfigs().forEach(config -> {
                        // Capacity is always provisioned at alias or version level
                        String[] parts = config.functionArn().split(":");
                        String level = Character.isDigit(parts[parts.length - 1].charAt(0)) ? "d_executed_version" : "d_resource";
                        labels.put(level, parts[parts.length - 1]);
                        Integer available = config.availableProvisionedConcurrentExecutions();
                        samples.computeIfAbsent(availableMetric, k -> new ArrayList<>()).add(sampleBuilder.buildSingleSample(availableMetric, labels, available.doubleValue()));
                        Integer requested = config.requestedProvisionedConcurrentExecutions();
                        samples.computeIfAbsent(requestedMetric, k -> new ArrayList<>()).add(sampleBuilder.buildSingleSample(requestedMetric, labels, requested.doubleValue()));
                        Integer allocated = config.allocatedProvisionedConcurrentExecutions();
                        samples.computeIfAbsent(allocatedMetric, k -> new ArrayList<>()).add(sampleBuilder.buildSingleSample(allocatedMetric, labels, allocated.doubleValue()));
                    });
                }
            });
        } catch (Exception e) {
            log.error("Failed to get lambda provisioned capacity for region " + region, e);
        }
    }));
    return samples.values().stream().map(sampleBuilder::buildFamily).collect(Collectors.toList());
}
Also used : NamespaceConfig(ai.asserts.aws.cloudwatch.config.NamespaceConfig) NamespaceConfig(ai.asserts.aws.cloudwatch.config.NamespaceConfig) AWSClientProvider(ai.asserts.aws.AWSClientProvider) ScrapeConfigProvider(ai.asserts.aws.cloudwatch.config.ScrapeConfigProvider) ListProvisionedConcurrencyConfigsResponse(software.amazon.awssdk.services.lambda.model.ListProvisionedConcurrencyConfigsResponse) GetFunctionConcurrencyResponse(software.amazon.awssdk.services.lambda.model.GetFunctionConcurrencyResponse) ArrayList(java.util.ArrayList) SCRAPE_REGION_LABEL(ai.asserts.aws.MetricNameUtil.SCRAPE_REGION_LABEL) ScrapeConfig(ai.asserts.aws.cloudwatch.config.ScrapeConfig) LambdaClient(software.amazon.awssdk.services.lambda.LambdaClient) RateLimiter(ai.asserts.aws.RateLimiter) Map(java.util.Map) CWNamespace.lambda(ai.asserts.aws.cloudwatch.model.CWNamespace.lambda) LambdaFunctionScraper(ai.asserts.aws.lambda.LambdaFunctionScraper) ImmutableSortedMap(com.google.common.collect.ImmutableSortedMap) SCRAPE_ACCOUNT_ID_LABEL(ai.asserts.aws.MetricNameUtil.SCRAPE_ACCOUNT_ID_LABEL) SCRAPE_NAMESPACE_LABEL(ai.asserts.aws.MetricNameUtil.SCRAPE_NAMESPACE_LABEL) ImmutableMap(com.google.common.collect.ImmutableMap) GetAccountSettingsResponse(software.amazon.awssdk.services.lambda.model.GetAccountSettingsResponse) GetFunctionConcurrencyRequest(software.amazon.awssdk.services.lambda.model.GetFunctionConcurrencyRequest) Set(java.util.Set) ResourceTagHelper(ai.asserts.aws.resource.ResourceTagHelper) Resource(ai.asserts.aws.resource.Resource) Collectors(java.util.stream.Collectors) MetricNameUtil(ai.asserts.aws.MetricNameUtil) Slf4j(lombok.extern.slf4j.Slf4j) Component(org.springframework.stereotype.Component) List(java.util.List) Collector(io.prometheus.client.Collector) TreeMap(java.util.TreeMap) SCRAPE_OPERATION_LABEL(ai.asserts.aws.MetricNameUtil.SCRAPE_OPERATION_LABEL) Optional(java.util.Optional) ListProvisionedConcurrencyConfigsRequest(software.amazon.awssdk.services.lambda.model.ListProvisionedConcurrencyConfigsRequest) Set(java.util.Set) Optional(java.util.Optional) TreeMap(java.util.TreeMap) ListProvisionedConcurrencyConfigsResponse(software.amazon.awssdk.services.lambda.model.ListProvisionedConcurrencyConfigsResponse) ListProvisionedConcurrencyConfigsRequest(software.amazon.awssdk.services.lambda.model.ListProvisionedConcurrencyConfigsRequest) GetFunctionConcurrencyResponse(software.amazon.awssdk.services.lambda.model.GetFunctionConcurrencyResponse) GetAccountSettingsResponse(software.amazon.awssdk.services.lambda.model.GetAccountSettingsResponse) LambdaClient(software.amazon.awssdk.services.lambda.LambdaClient) ArrayList(java.util.ArrayList) List(java.util.List) Map(java.util.Map) ImmutableSortedMap(com.google.common.collect.ImmutableSortedMap) ImmutableMap(com.google.common.collect.ImmutableMap) TreeMap(java.util.TreeMap) ScrapeConfig(ai.asserts.aws.cloudwatch.config.ScrapeConfig)

Example 3 with ScrapeConfig

use of ai.asserts.aws.cloudwatch.config.ScrapeConfig in project aws-cloudwatch-exporter by asserts.

the class LambdaEventSourceExporter method getMappings.

private List<MetricFamilySamples> getMappings() {
    Map<String, List<Sample>> samples = new TreeMap<>();
    Map<String, List<EventSourceMappingConfiguration>> byRegion = new TreeMap<>();
    ScrapeConfig scrapeConfig = scrapeConfigProvider.getScrapeConfig();
    scrapeConfig.getLambdaConfig().ifPresent(namespaceConfig -> scrapeConfig.getRegions().forEach(region -> {
        try (LambdaClient client = awsClientProvider.getLambdaClient(region)) {
            // Get all event source mappings
            log.info("Discovering Lambda event source mappings for region={}", region);
            String nextToken = null;
            do {
                ListEventSourceMappingsRequest req = ListEventSourceMappingsRequest.builder().marker(nextToken).build();
                ListEventSourceMappingsResponse response = rateLimiter.doWithRateLimit("LambdaClient/listEventSourceMappings", ImmutableSortedMap.of(SCRAPE_REGION_LABEL, region, SCRAPE_OPERATION_LABEL, "listEventSourceMappings", SCRAPE_NAMESPACE_LABEL, "AWS/Lambda"), () -> client.listEventSourceMappings(req));
                if (response.hasEventSourceMappings()) {
                    byRegion.computeIfAbsent(region, k -> new ArrayList<>()).addAll(response.eventSourceMappings().stream().filter(mapping -> resourceMapper.map(mapping.functionArn()).isPresent()).collect(Collectors.toList()));
                }
                nextToken = response.nextMarker();
            } while (StringUtils.hasText(nextToken));
            Set<Resource> fnResources = resourceTagHelper.getFilteredResources(region, namespaceConfig);
            byRegion.computeIfAbsent(region, k -> new ArrayList<>()).forEach(mappingConfiguration -> {
                Optional<Resource> fnResource = Optional.ofNullable(fnResources.stream().filter(r -> r.getArn().equals(mappingConfiguration.functionArn())).findFirst().orElse(resourceMapper.map(mappingConfiguration.functionArn()).orElse(null)));
                Optional<Resource> eventResourceOpt = resourceMapper.map(mappingConfiguration.eventSourceArn());
                eventResourceOpt.ifPresent(eventResource -> fnResource.ifPresent(fn -> buildSample(region, fn, eventResource, samples)));
            });
        } catch (Exception e) {
            log.info("Failed to discover event source mappings", e);
        }
    }));
    return samples.values().stream().map(sampleBuilder::buildFamily).collect(Collectors.toList());
}
Also used : AWSClientProvider(ai.asserts.aws.AWSClientProvider) ScrapeConfigProvider(ai.asserts.aws.cloudwatch.config.ScrapeConfigProvider) ListEventSourceMappingsResponse(software.amazon.awssdk.services.lambda.model.ListEventSourceMappingsResponse) ResourceMapper(ai.asserts.aws.resource.ResourceMapper) Sample(io.prometheus.client.Collector.MetricFamilySamples.Sample) ArrayList(java.util.ArrayList) SCRAPE_REGION_LABEL(ai.asserts.aws.MetricNameUtil.SCRAPE_REGION_LABEL) ScrapeConfig(ai.asserts.aws.cloudwatch.config.ScrapeConfig) LambdaClient(software.amazon.awssdk.services.lambda.LambdaClient) RateLimiter(ai.asserts.aws.RateLimiter) Map(java.util.Map) CWNamespace.lambda(ai.asserts.aws.cloudwatch.model.CWNamespace.lambda) ImmutableSortedMap(com.google.common.collect.ImmutableSortedMap) SCRAPE_ACCOUNT_ID_LABEL(ai.asserts.aws.MetricNameUtil.SCRAPE_ACCOUNT_ID_LABEL) SCRAPE_NAMESPACE_LABEL(ai.asserts.aws.MetricNameUtil.SCRAPE_NAMESPACE_LABEL) Set(java.util.Set) EventSourceMappingConfiguration(software.amazon.awssdk.services.lambda.model.EventSourceMappingConfiguration) ResourceTagHelper(ai.asserts.aws.resource.ResourceTagHelper) Resource(ai.asserts.aws.resource.Resource) Collectors(java.util.stream.Collectors) String.format(java.lang.String.format) MetricNameUtil(ai.asserts.aws.MetricNameUtil) Slf4j(lombok.extern.slf4j.Slf4j) Component(org.springframework.stereotype.Component) List(java.util.List) Collector(io.prometheus.client.Collector) TreeMap(java.util.TreeMap) SCRAPE_OPERATION_LABEL(ai.asserts.aws.MetricNameUtil.SCRAPE_OPERATION_LABEL) Optional(java.util.Optional) ListEventSourceMappingsRequest(software.amazon.awssdk.services.lambda.model.ListEventSourceMappingsRequest) StringUtils(org.springframework.util.StringUtils) Set(java.util.Set) Optional(java.util.Optional) TreeMap(java.util.TreeMap) ListEventSourceMappingsResponse(software.amazon.awssdk.services.lambda.model.ListEventSourceMappingsResponse) ListEventSourceMappingsRequest(software.amazon.awssdk.services.lambda.model.ListEventSourceMappingsRequest) LambdaClient(software.amazon.awssdk.services.lambda.LambdaClient) ArrayList(java.util.ArrayList) List(java.util.List) ScrapeConfig(ai.asserts.aws.cloudwatch.config.ScrapeConfig)

Example 4 with ScrapeConfig

use of ai.asserts.aws.cloudwatch.config.ScrapeConfig in project aws-cloudwatch-exporter by asserts.

the class LambdaLogMetricScrapeTask method scrapeLogEvents.

private Map<FunctionLogScrapeConfig, FilteredLogEvent> scrapeLogEvents() {
    Map<FunctionLogScrapeConfig, FilteredLogEvent> map = new HashMap<>();
    ScrapeConfig scrapeConfig = scrapeConfigProvider.getScrapeConfig();
    scrapeConfig.getLambdaConfig().ifPresent(nc -> {
        log.info("BEGIN lambda log scrape for region {}", region);
        if (!CollectionUtils.isEmpty(nc.getLogs()) && lambdaFunctionScraper.getFunctions().containsKey(region)) {
            try (CloudWatchLogsClient cloudWatchLogsClient = awsClientProvider.getCloudWatchLogsClient(region)) {
                lambdaFunctionScraper.getFunctions().get(region).forEach((arn, functionConfig) -> nc.getLogs().stream().filter(logScrapeConfig -> logScrapeConfig.shouldScrapeLogsFor(functionConfig.getName())).findFirst().ifPresent(logScrapeConfig -> {
                    sleep(scrapeConfig.getLogScrapeDelaySeconds() * 1000);
                    Optional<FilteredLogEvent> logEventOpt = logEventScraper.findLogEvent(cloudWatchLogsClient, functionConfig, logScrapeConfig);
                    logEventOpt.ifPresent(logEvent -> map.put(new FunctionLogScrapeConfig(functionConfig, logScrapeConfig), logEvent));
                }));
            } catch (Exception e) {
                log.error("Failed to scrape lambda logs", e);
            }
        } else {
            log.info("No functions found for region {}", region);
        }
        log.info("END lambda log scrape for region {}", region);
    });
    return map;
}
Also used : Setter(lombok.Setter) Getter(lombok.Getter) AWSClientProvider(ai.asserts.aws.AWSClientProvider) ScrapeConfigProvider(ai.asserts.aws.cloudwatch.config.ScrapeConfigProvider) Autowired(org.springframework.beans.factory.annotation.Autowired) HashMap(java.util.HashMap) LogEventMetricEmitter(ai.asserts.aws.lambda.LogEventMetricEmitter) ArrayList(java.util.ArrayList) ScrapeConfig(ai.asserts.aws.cloudwatch.config.ScrapeConfig) LogScrapeConfig(ai.asserts.aws.cloudwatch.config.LogScrapeConfig) CloudWatchLogsClient(software.amazon.awssdk.services.cloudwatchlogs.CloudWatchLogsClient) Map(java.util.Map) LambdaFunctionScraper(ai.asserts.aws.lambda.LambdaFunctionScraper) FilteredLogEvent(software.amazon.awssdk.services.cloudwatchlogs.model.FilteredLogEvent) LogEventScraper(ai.asserts.aws.lambda.LogEventScraper) GAUGE(io.prometheus.client.Collector.Type.GAUGE) LambdaFunction(ai.asserts.aws.lambda.LambdaFunction) EqualsAndHashCode(lombok.EqualsAndHashCode) Slf4j(lombok.extern.slf4j.Slf4j) List(java.util.List) Collector(io.prometheus.client.Collector) Builder(lombok.Builder) CollectionUtils(org.springframework.util.CollectionUtils) Optional(java.util.Optional) Collections(java.util.Collections) CloudWatchLogsClient(software.amazon.awssdk.services.cloudwatchlogs.CloudWatchLogsClient) Optional(java.util.Optional) HashMap(java.util.HashMap) FilteredLogEvent(software.amazon.awssdk.services.cloudwatchlogs.model.FilteredLogEvent) ScrapeConfig(ai.asserts.aws.cloudwatch.config.ScrapeConfig) LogScrapeConfig(ai.asserts.aws.cloudwatch.config.LogScrapeConfig)

Example 5 with ScrapeConfig

use of ai.asserts.aws.cloudwatch.config.ScrapeConfig in project aws-cloudwatch-exporter by asserts.

the class LambdaLogMetricScrapeTask method collect.

public List<MetricFamilySamples> collect() {
    List<Collector.MetricFamilySamples.Sample> samples = new ArrayList<>();
    ScrapeConfig scrapeConfig = scrapeConfigProvider.getScrapeConfig();
    scrapeConfig.getLambdaConfig().ifPresent(namespaceConfig -> {
        Map<FunctionLogScrapeConfig, FilteredLogEvent> copy = this.cache;
        copy.forEach((config, event) -> logEventMetricEmitter.getSample(namespaceConfig, config, event).ifPresent(samples::add));
    });
    return Collections.singletonList(new MetricFamilySamples("aws_lambda_logs", GAUGE, "", samples));
}
Also used : Collector(io.prometheus.client.Collector) ArrayList(java.util.ArrayList) FilteredLogEvent(software.amazon.awssdk.services.cloudwatchlogs.model.FilteredLogEvent) ScrapeConfig(ai.asserts.aws.cloudwatch.config.ScrapeConfig) LogScrapeConfig(ai.asserts.aws.cloudwatch.config.LogScrapeConfig)

Aggregations

ScrapeConfig (ai.asserts.aws.cloudwatch.config.ScrapeConfig)33 ScrapeConfigProvider (ai.asserts.aws.cloudwatch.config.ScrapeConfigProvider)19 AWSClientProvider (ai.asserts.aws.AWSClientProvider)17 RateLimiter (ai.asserts.aws.RateLimiter)16 Resource (ai.asserts.aws.resource.Resource)13 TreeMap (java.util.TreeMap)12 ArrayList (java.util.ArrayList)11 Map (java.util.Map)11 Set (java.util.Set)10 Slf4j (lombok.extern.slf4j.Slf4j)10 NamespaceConfig (ai.asserts.aws.cloudwatch.config.NamespaceConfig)9 ImmutableSortedMap (com.google.common.collect.ImmutableSortedMap)9 BeforeEach (org.junit.jupiter.api.BeforeEach)9 Component (org.springframework.stereotype.Component)9 SCRAPE_NAMESPACE_LABEL (ai.asserts.aws.MetricNameUtil.SCRAPE_NAMESPACE_LABEL)8 SCRAPE_OPERATION_LABEL (ai.asserts.aws.MetricNameUtil.SCRAPE_OPERATION_LABEL)8 SCRAPE_REGION_LABEL (ai.asserts.aws.MetricNameUtil.SCRAPE_REGION_LABEL)8 ResourceMapper (ai.asserts.aws.resource.ResourceMapper)8 List (java.util.List)8 Optional (java.util.Optional)8