github.com/mweagle/Sparta@v1.15.0/decorator/alarm.go (about)

     1  package decorator
     2  
     3  import (
     4  	"fmt"
     5  
     6  	sparta "github.com/mweagle/Sparta"
     7  	gocf "github.com/mweagle/go-cloudformation"
     8  	"github.com/sirupsen/logrus"
     9  )
    10  
    11  // CloudWatchErrorAlarmDecorator returns a TemplateDecoratorHookFunc
    12  // that associates a CloudWatch Lambda Error count alarm with the given
    13  // lambda function. The four parameters are periodWindow, minutes per period
    14  // the strict lower bound value, and the SNS topic to which alerts should be
    15  // sent. See the CloudWatch alarm resource type in the official
    16  // AWS documentation at https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cw-alarm.html
    17  // for more information
    18  func CloudWatchErrorAlarmDecorator(periodWindow int,
    19  	minutesPerPeriod int,
    20  	thresholdGreaterThanOrEqualToValue int,
    21  	snsTopic gocf.Stringable) sparta.TemplateDecoratorHookFunc {
    22  	alarmDecorator := func(serviceName string,
    23  		lambdaResourceName string,
    24  		lambdaResource gocf.LambdaFunction,
    25  		resourceMetadata map[string]interface{},
    26  		S3Bucket string,
    27  		S3Key string,
    28  		buildID string,
    29  		template *gocf.Template,
    30  		context map[string]interface{},
    31  		logger *logrus.Logger) error {
    32  
    33  		periodInSeconds := minutesPerPeriod * 60
    34  
    35  		alarm := &gocf.CloudWatchAlarm{
    36  			AlarmName: gocf.Join("",
    37  				gocf.String("ERROR Alarm for "),
    38  				gocf.Ref(lambdaResourceName)),
    39  			AlarmDescription: gocf.Join(" ",
    40  				gocf.String("ERROR count for AWS Lambda function"),
    41  				gocf.Ref(lambdaResourceName),
    42  				gocf.String("( Stack:"),
    43  				gocf.Ref("AWS::StackName"),
    44  				gocf.String(") is greater than"),
    45  				gocf.String(fmt.Sprintf("%d", thresholdGreaterThanOrEqualToValue)),
    46  				gocf.String("over the last"),
    47  				gocf.String(fmt.Sprintf("%d", periodInSeconds)),
    48  				gocf.String("seconds"),
    49  			),
    50  			MetricName:         gocf.String("Errors"),
    51  			Namespace:          gocf.String("AWS/Lambda"),
    52  			Statistic:          gocf.String("Sum"),
    53  			Period:             gocf.Integer(int64(periodInSeconds)),
    54  			EvaluationPeriods:  gocf.Integer(int64(periodWindow)),
    55  			Threshold:          gocf.Integer(int64(thresholdGreaterThanOrEqualToValue)),
    56  			ComparisonOperator: gocf.String("GreaterThanOrEqualToThreshold"),
    57  			Dimensions: &gocf.CloudWatchAlarmDimensionList{
    58  				gocf.CloudWatchAlarmDimension{
    59  					Name:  gocf.String("FunctionName"),
    60  					Value: gocf.Ref(lambdaResourceName).String(),
    61  				},
    62  			},
    63  			TreatMissingData: gocf.String("notBreaching"),
    64  			AlarmActions: gocf.StringList(
    65  				snsTopic,
    66  			),
    67  		}
    68  		// Create the resource, add it...
    69  		alarmResourceName := sparta.CloudFormationResourceName("Alarm",
    70  			lambdaResourceName)
    71  		template.AddResource(alarmResourceName, alarm)
    72  		return nil
    73  	}
    74  	return sparta.TemplateDecoratorHookFunc(alarmDecorator)
    75  }