func()

in internal/resources/providers/aws_cis/monitoring/monitoring.go [78:134]


func (p *Provider) AggregateResources(ctx context.Context) (*Resource, error) {
	trails, err := p.Cloudtrail.DescribeTrails(ctx)
	if err != nil {
		return nil, err
	}

	items := make([]MonitoringItem, 0, len(trails))
	for _, info := range trails {
		if info.Trail.CloudWatchLogsLogGroupArn == nil {
			items = append(items, MonitoringItem{
				TrailInfo:          info,
				MetricFilters:      []MetricFilter{},
				MetricTopicBinding: map[string][]string{},
			})
			continue
		}
		logGroup := getLogGroupFromARN(info.Trail.CloudWatchLogsLogGroupArn)
		if logGroup == "" {
			p.Log.Warnf("cloudwatchlogs log group arn has no log group name %s", *info.Trail.CloudWatchLogsLogGroupArn)
			continue
		}
		metrics, err := p.Cloudwatchlogs.DescribeMetricFilters(ctx, info.Trail.HomeRegion, logGroup)
		if err != nil {
			p.Log.Errorf("failed to describe metric filters for cloudwatchlog log group arn %s: %v", *info.Trail.CloudWatchLogsLogGroupArn, err)
			continue
		}

		parsedMetrics := p.parserMetrics(metrics)
		names := filterNamesFromMetrics(metrics)

		if len(names) == 0 {
			items = append(items, MonitoringItem{
				TrailInfo:          info,
				MetricFilters:      parsedMetrics,
				MetricTopicBinding: map[string][]string{},
			})
			continue
		}
		bindings := map[string][]string{}
		for _, name := range names {
			alarms, err := p.Cloudwatch.DescribeAlarms(ctx, info.Trail.HomeRegion, []string{name})
			if err != nil {
				p.Log.Errorf("failed to describe alarms for cloudwatch filter %v: %v", names, err)
				continue
			}
			topics := p.getSubscriptionForAlarms(ctx, info.Trail.HomeRegion, alarms)
			bindings[name] = topics
		}
		items = append(items, MonitoringItem{
			TrailInfo:          info,
			MetricFilters:      parsedMetrics,
			MetricTopicBinding: bindings,
		})
	}

	return &Resource{Items: items}, nil
}