private async Task <IList <Alarm> > BuildIndexAlarms(ResourceAndThresholdsPair <DynamoResourceConfig, TableDescription> resourceConfig,
                                                             PopulatedServiceAlarms <DynamoResourceConfig, TableDescription> service,
                                                             AlertingGroupParameters groupParameters,
                                                             TableDescription parentTableDescription)
        {
            // called twice
            var mergedConfig = service.Options.OverrideWith(resourceConfig.Definition.Options);

            var result = new List <Alarm>();

            var gsiSet = parentTableDescription.GlobalSecondaryIndexes;

            var mergedValuesByAlarmName = service.Values
                                          .OverrideWith(resourceConfig.Definition.Values);

            var defaults = _defaultAlarms.DynamoDbGsiRead;

            if (mergedConfig.MonitorWrites ?? DynamoResourceConfig.MonitorWritesDefault)
            {
                defaults = defaults.Concat(_defaultAlarms.DynamoDbGsiWrite).ToArray();
            }

            foreach (var gsi in gsiSet)
            {
                foreach (var alarm in defaults)
                {
                    var values = mergedValuesByAlarmName.GetValueOrDefault(alarm.Name) ?? new AlarmValues();
                    var configuredThreshold = alarm.Threshold.CopyWith(value: values.Threshold);
                    var dimensions          = _gsiProvider.GetDimensions(gsi, parentTableDescription, alarm.DimensionNames);

                    if (mergedConfig.ThresholdIsAbsolute ?? DynamoResourceConfig.ThresholdIsAbsoluteDefault)
                    {
                        configuredThreshold.ThresholdType = ThresholdType.Absolute;
                    }

                    var threshold = await ThresholdCalculator.ExpandThreshold(_gsiProvider,
                                                                              gsi,
                                                                              mergedConfig,
                                                                              configuredThreshold);

                    var built = alarm.CopyWith(threshold, values);

                    var model = new Alarm
                    {
                        AlarmName          = $"{resourceConfig.Resource.Name}-{gsi.IndexName}-{alarm.Name}-{groupParameters.AlarmNameSuffix}",
                        AlarmDescription   = groupParameters.DefaultAlarmDescription(resourceConfig.Definition),
                        ResourceIdentifier = resourceConfig.Resource.Name,
                        Dimensions         = dimensions,
                        AlarmDefinition    = built
                    };

                    result.Add(model);
                }
            }

            return(result);
        }
        private async Task <List <Alarm> > BuildAlarmsForQueue(
            IList <AlarmDefinition> defaults,
            ResourceThresholds <SqsResourceConfig> resource,
            PopulatedServiceAlarms <SqsResourceConfig, QueueDataV2> service,
            AlertingGroupParameters groupParameters,
            QueueDataV2 queue)
        {
            var  mergedConfig       = service.Options.OverrideWith(resource.Options);
            bool includeErrorQueues = mergedConfig.IncludeErrorQueues ?? true;

            var result = new List <Alarm>();

            var mergedValuesByAlarmName = service.Values.OverrideWith(resource.Values);

            foreach (var alarm in defaults)
            {
                var dimensions = _dimensionProvider.GetDimensions(queue, alarm.DimensionNames);
                var values     = mergedValuesByAlarmName.GetValueOrDefault(alarm.Name) ?? new AlarmValues();

                var actualThreshold = alarm.Threshold.CopyWith(value: values.Threshold);

                var threshold = await ThresholdCalculator.ExpandThreshold(_attributeProvider,
                                                                          queue,
                                                                          mergedConfig,
                                                                          actualThreshold);

                var built = alarm.CopyWith(threshold, values);

                var model = new Alarm
                {
                    AlarmName        = $"{resource.Name}-{built.Name}-{groupParameters.AlarmNameSuffix}",
                    AlarmDescription = groupParameters.DefaultAlarmDescription(resource),

                    // error queues currently named as per parent queue
                    ResourceIdentifier = resource.Name,
                    Dimensions         = dimensions,
                    AlarmDefinition    = built
                };

                result.Add(model);
            }

            if (includeErrorQueues && queue.ErrorQueue != null)
            {
                var alarms = await BuildAlarmsForQueue(_errorQueueDefaults, resource, service, groupParameters,
                                                       queue.ErrorQueue);

                result.AddRange(alarms);
            }

            return(result);
        }
Esempio n. 3
0
        private async Task <List <Alarm> > BuildTableAlarms(ResourceAndThresholdsPair <DynamoResourceConfig, TableDescription> resourceConfig,
                                                            PopulatedServiceAlarms <DynamoResourceConfig, TableDescription> service,
                                                            AlertingGroupParameters groupParameters,
                                                            TableDescription entity)
        {
            var mergedConfig = service.Options.OverrideWith(resourceConfig.Definition.Options);

            var result = new List <Alarm>();

            var mergedValuesByAlarmName = service.Values.OverrideWith(resourceConfig.Definition.Values);

            var defaults = _defaultAlarms.DynamoDbRead;

            if (mergedConfig.MonitorWrites ?? DynamoResourceConfig.MonitorWritesDefault)
            {
                defaults = defaults.Concat(_defaultAlarms.DynamoDbWrite).ToArray();
            }

            foreach (var alarm in defaults)
            {
                var dimensions          = _dimensions.GetDimensions(entity, alarm.DimensionNames);
                var values              = mergedValuesByAlarmName.GetValueOrDefault(alarm.Name) ?? new AlarmValues();
                var configuredThreshold = alarm.Threshold.CopyWith(value: values.Threshold);

                if (mergedConfig.ThresholdIsAbsolute ?? DynamoResourceConfig.ThresholdIsAbsoluteDefault)
                {
                    configuredThreshold.ThresholdType = ThresholdType.Absolute;
                }

                var threshold = await ThresholdCalculator.ExpandThreshold(_attributeProvider,
                                                                          entity,
                                                                          mergedConfig,
                                                                          configuredThreshold);

                var built = alarm.CopyWith(threshold, values);

                var model = new Alarm
                {
                    AlarmName          = $"{resourceConfig.Resource.Name}-{built.Name}-{groupParameters.AlarmNameSuffix}",
                    AlarmDescription   = groupParameters.DefaultAlarmDescription(),
                    ResourceIdentifier = resourceConfig.Resource.Name,
                    Dimensions         = dimensions,
                    AlarmDefinition    = built
                };

                result.Add(model);
            }

            return(result);
        }
Esempio n. 4
0
        private async Task<IList<Alarm>> CreateAlarmsForResource(
            ResourceAndThresholdsPair<SqsResourceConfig, QueueDataV2> resource,
            PopulatedServiceAlarms<SqsResourceConfig, QueueDataV2> service,
            AlertingGroupParameters groupParameters)
        {
            var entity = await resource.Resource.GetFullResource();

            if (entity == null)
            {
                throw new Exception($"Entity {resource.Resource.Name} not found");
            }

            var mergedConfig = service.Options.OverrideWith(resource.Definition.Options);
            var includeErrorQueues = mergedConfig.IncludeErrorQueues ?? true;

            var result = new List<Alarm>();

            // get working queue alarms
            if (entity.WorkingQueue != null)
            {
                var alarms = await BuildAlarmsForQueue(_defaultAlarms,
                    mergedConfig,
                    resource.Definition,
                    service,
                    groupParameters,
                    entity.WorkingQueue);

                result.AddRange(alarms);
            }

            // get error queue alarms
            if (includeErrorQueues && entity.ErrorQueue != null)
            {
                var alarms = await BuildAlarmsForQueue(_errorQueueDefaults,
                    mergedConfig,
                    resource.Definition,
                    service,
                    groupParameters,
                    entity.ErrorQueue);

                result.AddRange(alarms);
            }

            return result;
        }
        private async Task <IList <Alarm> > CreateAlarmsForResource(
            ResourceAndThresholdsPair <TAlarmConfig, T> resource,
            PopulatedServiceAlarms <TAlarmConfig, T> service,
            AlertingGroupParameters groupParameters)
        {
            var entity = await resource.Resource.GetFullResource();

            if (entity == null)
            {
                throw new Exception($"Entity {resource.Resource.Name} not found");
            }

            var mergedConfig            = service.Options.OverrideWith(resource.Definition.Options);
            var mergedValuesByAlarmName = service.Values.OverrideWith(resource.Definition.Values);

            var result = new List <Alarm>();

            foreach (var alarm in _defaultAlarms)
            {
                var values = mergedValuesByAlarmName.GetValueOrDefault(alarm.Name) ?? new AlarmValues();
                var configuredThreshold = alarm.Threshold.CopyWith(value: values.Threshold);
                var dimensions          = _dimensions.GetDimensions(entity, alarm.DimensionNames);
                var threshold           = await ThresholdCalculator.ExpandThreshold(_attributeProvider,
                                                                                    entity,
                                                                                    mergedConfig,
                                                                                    configuredThreshold);

                var built = alarm.CopyWith(threshold, values);

                var model = new Alarm
                {
                    AlarmName          = $"{resource.Resource.Name}-{built.Name}-{groupParameters.AlarmNameSuffix}",
                    AlarmDescription   = groupParameters.DefaultAlarmDescription(),
                    ResourceIdentifier = resource.Resource.Name,
                    Dimensions         = dimensions,
                    AlarmDefinition    = built
                };

                result.Add(model);
            }

            return(result);
        }
        private async Task <IList <Alarm> > CreateAlarmsForResource(
            ResourceAndThresholdsPair <DynamoResourceConfig, TableDescription> resource,
            PopulatedServiceAlarms <DynamoResourceConfig, TableDescription> service,
            AlertingGroupParameters groupParameters)
        {
            var entity = await resource.Resource.GetFullResource();

            if (entity == null)
            {
                _logger.Error($"Skipping table {resource.Resource.Name} as it does not exist");
                return(Array.Empty <Alarm>());
            }

            var result = await BuildTableAlarms(resource, service, groupParameters, entity);

            result.AddRange(await BuildIndexAlarms(resource, service, groupParameters, entity));

            return(result);
        }
Esempio n. 7
0
        public async Task<IList<Alarm>> GenerateAlarmsFor(
            PopulatedServiceAlarms<SqsResourceConfig, QueueDataV2> service,
            AlertingGroupParameters groupParameters)
        {
            if (service?.Resources == null || service.Resources.Count == 0)
            {
                return new List<Alarm>();
            }

            var alarms = new List<Alarm>();

            foreach (var resource in service.Resources)
            {
                var alarmsForResource = await CreateAlarmsForResource(resource, service, groupParameters);
                alarms.AddRange(alarmsForResource);
            }

            return alarms;
        }
        public async Task <IList <Alarm> > GenerateAlarmsFor(
            PopulatedServiceAlarms <DynamoResourceConfig, TableDescription> service,
            AlertingGroupParameters groupParameters)
        {
            if (service?.Resources == null || service.Resources.Count == 0)
            {
                return(new List <Alarm>());
            }

            List <Alarm> alarms = new List <Alarm>();

            foreach (var resource in service.Resources)
            {
                var alarmsForResource = await CreateAlarmsForResource(resource, service, groupParameters);

                alarms.AddRange(alarmsForResource);
            }

            return(alarms);
        }
        private async Task <IList <Alarm> > CreateAlarmsForResource(
            ResourceAndThresholdsPair <SqsResourceConfig, QueueDataV2> resource,
            PopulatedServiceAlarms <SqsResourceConfig, QueueDataV2> service,
            AlertingGroupParameters groupParameters)
        {
            var entity = await resource.Resource.GetFullResource();

            if (entity == null)
            {
                throw new Exception($"Entity {resource.Resource.Name} not found");
            }

            var alarms = await BuildAlarmsForQueue(_defaultAlarms,
                                                   resource.Definition,
                                                   service,
                                                   groupParameters,
                                                   entity);

            return(alarms);
        }