Skip to content

Commit

Permalink
Fix log throttle (#159)
Browse files Browse the repository at this point in the history
* only create the log group once

* update test

* remove extra line
  • Loading branch information
brianterry authored Aug 27, 2020
1 parent cb80be9 commit c1261e8
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 52 deletions.
23 changes: 16 additions & 7 deletions cfn/cfn.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"log"
"os"
"path"
"sync"
"time"

"github.com/aws-cloudformation/cloudformation-cli-go-plugin/cfn/cfnerr"
Expand Down Expand Up @@ -39,6 +40,8 @@ const (
listAction = "LIST"
)

var once sync.Once

// Handler is the interface that all resource providers must implement
//
// Each method of Handler maps directly to a CloudFormation action.
Expand Down Expand Up @@ -97,15 +100,21 @@ type handlerFunc func(request handler.Request) handler.ProgressEvent
// MakeEventFunc is the entry point to all invocations of a custom resource
func makeEventFunc(h Handler) eventFunc {
return func(ctx context.Context, event *event) (response, error) {
//pls := credentials.SessionFromCredentialsProvider(&event.RequestData.PlatformCredentials)
ps := credentials.SessionFromCredentialsProvider(&event.RequestData.ProviderCredentials)
l, err := logging.NewCloudWatchLogsProvider(
cloudwatchlogs.New(ps),
event.RequestData.ProviderLogGroupName,
)
// Set default logger to output to CWL in the provider account
logging.SetProviderLogOutput(l)
m := metrics.New(cloudwatch.New(ps), event.ResourceType)
once.Do(func() {
l, err := logging.NewCloudWatchLogsProvider(
cloudwatchlogs.New(ps),
event.RequestData.ProviderLogGroupName,
)
if err != nil {
log.Printf("Error: %v, Logging to Stdout", err)
m.PublishExceptionMetric(time.Now(), event.Action, err)
l = os.Stdout
}
// Set default logger to output to CWL in the provider account
logging.SetProviderLogOutput(l)
})
re := newReportErr(m)
if err := scrubFiles("/tmp"); err != nil {
log.Printf("Error: %v", err)
Expand Down
16 changes: 3 additions & 13 deletions cfn/logging/cloudwatchlogs.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package logging

import (
"context"
"io"
"log"
"os"
Expand Down Expand Up @@ -132,10 +131,7 @@ func (p *cloudWatchLogsProvider) Write(b []byte) (int, error) {
// // do something
// }
func CloudWatchLogGroupExists(client cloudwatchlogsiface.CloudWatchLogsAPI, logGroupName string) (bool, error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500)
defer cancel()

resp, err := client.DescribeLogGroupsWithContext(ctx, &cloudwatchlogs.DescribeLogGroupsInput{
resp, err := client.DescribeLogGroups(&cloudwatchlogs.DescribeLogGroupsInput{
Limit: aws.Int64(1),
LogGroupNamePrefix: aws.String(logGroupName),
})
Expand Down Expand Up @@ -163,10 +159,7 @@ func CloudWatchLogGroupExists(client cloudwatchlogsiface.CloudWatchLogsAPI, logG
// panic("Unable to create log group", err)
// }
func CreateNewCloudWatchLogGroup(client cloudwatchlogsiface.CloudWatchLogsAPI, logGroupName string) error {
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500)
defer cancel()

if _, err := client.CreateLogGroupWithContext(ctx, &cloudwatchlogs.CreateLogGroupInput{
if _, err := client.CreateLogGroup(&cloudwatchlogs.CreateLogGroupInput{
LogGroupName: aws.String(logGroupName),
}); err != nil {
return err
Expand All @@ -177,10 +170,7 @@ func CreateNewCloudWatchLogGroup(client cloudwatchlogsiface.CloudWatchLogsAPI, l

// CreateNewLogStream creates a log stream inside of a LogGroup
func CreateNewLogStream(client cloudwatchlogsiface.CloudWatchLogsAPI, logGroupName string, logStreamName string) error {
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500)
defer cancel()

_, err := client.CreateLogStreamWithContext(ctx, &cloudwatchlogs.CreateLogStreamInput{
_, err := client.CreateLogStream(&cloudwatchlogs.CreateLogStreamInput{
LogGroupName: aws.String(logGroupName),
LogStreamName: aws.String(logStreamName),
})
Expand Down
58 changes: 28 additions & 30 deletions cfn/logging/cloudwatchlogs_test.go
Original file line number Diff line number Diff line change
@@ -1,32 +1,30 @@
package logging

import (
"context"
"testing"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/service/cloudwatchlogs"
"github.com/aws/aws-sdk-go/service/cloudwatchlogs/cloudwatchlogsiface"
)

func TestCloudWatchLogProvider(t *testing.T) {
t.Run("Init", func(t *testing.T) {
client := CallbackCloudWatchLogs{
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
return &cloudwatchlogs.DescribeLogGroupsOutput{
LogGroups: []*cloudwatchlogs.LogGroup{
&cloudwatchlogs.LogGroup{LogGroupName: input.LogGroupNamePrefix},
},
}, nil
},

CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
return nil, nil
},

CreateLogStreamFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
CreateLogStreamFn: func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
return nil, nil
},

Expand All @@ -45,15 +43,15 @@ func TestCloudWatchLogProvider(t *testing.T) {

t.Run("Init Error Exists", func(t *testing.T) {
client := CallbackCloudWatchLogs{
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
return nil, awserr.New("Invalid", "Invalid", nil)
},

CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
return nil, nil
},

CreateLogStreamFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
CreateLogStreamFn: func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
return nil, nil
},

Expand All @@ -72,17 +70,17 @@ func TestCloudWatchLogProvider(t *testing.T) {

t.Run("Init Error Unable to Create", func(t *testing.T) {
client := CallbackCloudWatchLogs{
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
return &cloudwatchlogs.DescribeLogGroupsOutput{
LogGroups: []*cloudwatchlogs.LogGroup{},
}, nil
},

CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
return nil, awserr.New("Invalid", "Invalid", nil)
},

CreateLogStreamFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
CreateLogStreamFn: func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
return nil, nil
},

Expand All @@ -101,19 +99,19 @@ func TestCloudWatchLogProvider(t *testing.T) {

t.Run("Write", func(t *testing.T) {
client := CallbackCloudWatchLogs{
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
return &cloudwatchlogs.DescribeLogGroupsOutput{
LogGroups: []*cloudwatchlogs.LogGroup{
&cloudwatchlogs.LogGroup{LogGroupName: input.LogGroupNamePrefix},
},
}, nil
},

CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
return nil, nil
},

CreateLogStreamFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
CreateLogStreamFn: func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
return nil, nil
},

Expand Down Expand Up @@ -143,19 +141,19 @@ func TestCloudWatchLogProvider(t *testing.T) {
t.Run("Write Error", func(t *testing.T) {
writeCount := 0
client := CallbackCloudWatchLogs{
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
return &cloudwatchlogs.DescribeLogGroupsOutput{
LogGroups: []*cloudwatchlogs.LogGroup{
&cloudwatchlogs.LogGroup{LogGroupName: input.LogGroupNamePrefix},
},
}, nil
},

CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
return nil, nil
},

CreateLogStreamFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
CreateLogStreamFn: func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
return nil, nil
},

Expand Down Expand Up @@ -187,7 +185,7 @@ func TestCloudWatchLogProvider(t *testing.T) {
func TestCloudWatchLogGroupExists(t *testing.T) {
t.Run("Success", func(t *testing.T) {
client := CallbackCloudWatchLogs{
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
return &cloudwatchlogs.DescribeLogGroupsOutput{
LogGroups: []*cloudwatchlogs.LogGroup{
&cloudwatchlogs.LogGroup{LogGroupName: input.LogGroupNamePrefix},
Expand All @@ -203,7 +201,7 @@ func TestCloudWatchLogGroupExists(t *testing.T) {

t.Run("Error", func(t *testing.T) {
client := CallbackCloudWatchLogs{
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
return nil, awserr.New("Invalid", "Invalid", nil)
},
}
Expand All @@ -217,7 +215,7 @@ func TestCloudWatchLogGroupExists(t *testing.T) {
func TestCreateCloudWatchLogGroup(t *testing.T) {
t.Run("Success", func(t *testing.T) {
client := CallbackCloudWatchLogs{
CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
return nil, nil
},
}
Expand All @@ -229,7 +227,7 @@ func TestCreateCloudWatchLogGroup(t *testing.T) {

t.Run("Error", func(t *testing.T) {
client := CallbackCloudWatchLogs{
CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
return nil, awserr.New("Invalid", "Invalid", nil)
},
}
Expand All @@ -243,22 +241,22 @@ func TestCreateCloudWatchLogGroup(t *testing.T) {
type CallbackCloudWatchLogs struct {
cloudwatchlogsiface.CloudWatchLogsAPI

DescribeLogGroupsFn func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error)
CreateLogGroupFn func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error)
CreateLogStreamFn func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error)
DescribeLogGroupsFn func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error)
CreateLogGroupFn func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error)
CreateLogStreamFn func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error)
PutLogEventsFn func(input *cloudwatchlogs.PutLogEventsInput) (*cloudwatchlogs.PutLogEventsOutput, error)
}

func (cwl CallbackCloudWatchLogs) DescribeLogGroupsWithContext(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput, opts ...request.Option) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
return cwl.DescribeLogGroupsFn(ctx, input)
func (cwl CallbackCloudWatchLogs) DescribeLogGroups(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
return cwl.DescribeLogGroupsFn(input)
}

func (cwl CallbackCloudWatchLogs) CreateLogGroupWithContext(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput, opts ...request.Option) (*cloudwatchlogs.CreateLogGroupOutput, error) {
return cwl.CreateLogGroupFn(ctx, input)
func (cwl CallbackCloudWatchLogs) CreateLogGroup(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
return cwl.CreateLogGroupFn(input)
}

func (cwl CallbackCloudWatchLogs) CreateLogStreamWithContext(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput, opts ...request.Option) (*cloudwatchlogs.CreateLogStreamOutput, error) {
return cwl.CreateLogStreamFn(ctx, input)
func (cwl CallbackCloudWatchLogs) CreateLogStream(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
return cwl.CreateLogStreamFn(input)
}

func (cwl CallbackCloudWatchLogs) PutLogEvents(input *cloudwatchlogs.PutLogEventsInput) (*cloudwatchlogs.PutLogEventsOutput, error) {
Expand Down
2 changes: 0 additions & 2 deletions cfn/logging/logging.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ const (

// SetProviderLogOutput ...
func SetProviderLogOutput(w io.Writer) {
os.Stderr = nil
os.Stdout = nil

log.SetOutput(w)

Expand Down

0 comments on commit c1261e8

Please sign in to comment.