Skip to content

Commit c1261e8

Browse files
authored
Fix log throttle (#159)
* only create the log group once * update test * remove extra line
1 parent cb80be9 commit c1261e8

File tree

4 files changed

+47
-52
lines changed

4 files changed

+47
-52
lines changed

cfn/cfn.go

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"log"
88
"os"
99
"path"
10+
"sync"
1011
"time"
1112

1213
"github.com/aws-cloudformation/cloudformation-cli-go-plugin/cfn/cfnerr"
@@ -39,6 +40,8 @@ const (
3940
listAction = "LIST"
4041
)
4142

43+
var once sync.Once
44+
4245
// Handler is the interface that all resource providers must implement
4346
//
4447
// Each method of Handler maps directly to a CloudFormation action.
@@ -97,15 +100,21 @@ type handlerFunc func(request handler.Request) handler.ProgressEvent
97100
// MakeEventFunc is the entry point to all invocations of a custom resource
98101
func makeEventFunc(h Handler) eventFunc {
99102
return func(ctx context.Context, event *event) (response, error) {
100-
//pls := credentials.SessionFromCredentialsProvider(&event.RequestData.PlatformCredentials)
101103
ps := credentials.SessionFromCredentialsProvider(&event.RequestData.ProviderCredentials)
102-
l, err := logging.NewCloudWatchLogsProvider(
103-
cloudwatchlogs.New(ps),
104-
event.RequestData.ProviderLogGroupName,
105-
)
106-
// Set default logger to output to CWL in the provider account
107-
logging.SetProviderLogOutput(l)
108104
m := metrics.New(cloudwatch.New(ps), event.ResourceType)
105+
once.Do(func() {
106+
l, err := logging.NewCloudWatchLogsProvider(
107+
cloudwatchlogs.New(ps),
108+
event.RequestData.ProviderLogGroupName,
109+
)
110+
if err != nil {
111+
log.Printf("Error: %v, Logging to Stdout", err)
112+
m.PublishExceptionMetric(time.Now(), event.Action, err)
113+
l = os.Stdout
114+
}
115+
// Set default logger to output to CWL in the provider account
116+
logging.SetProviderLogOutput(l)
117+
})
109118
re := newReportErr(m)
110119
if err := scrubFiles("/tmp"); err != nil {
111120
log.Printf("Error: %v", err)

cfn/logging/cloudwatchlogs.go

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package logging
22

33
import (
4-
"context"
54
"io"
65
"log"
76
"os"
@@ -132,10 +131,7 @@ func (p *cloudWatchLogsProvider) Write(b []byte) (int, error) {
132131
// // do something
133132
// }
134133
func CloudWatchLogGroupExists(client cloudwatchlogsiface.CloudWatchLogsAPI, logGroupName string) (bool, error) {
135-
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500)
136-
defer cancel()
137-
138-
resp, err := client.DescribeLogGroupsWithContext(ctx, &cloudwatchlogs.DescribeLogGroupsInput{
134+
resp, err := client.DescribeLogGroups(&cloudwatchlogs.DescribeLogGroupsInput{
139135
Limit: aws.Int64(1),
140136
LogGroupNamePrefix: aws.String(logGroupName),
141137
})
@@ -163,10 +159,7 @@ func CloudWatchLogGroupExists(client cloudwatchlogsiface.CloudWatchLogsAPI, logG
163159
// panic("Unable to create log group", err)
164160
// }
165161
func CreateNewCloudWatchLogGroup(client cloudwatchlogsiface.CloudWatchLogsAPI, logGroupName string) error {
166-
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500)
167-
defer cancel()
168-
169-
if _, err := client.CreateLogGroupWithContext(ctx, &cloudwatchlogs.CreateLogGroupInput{
162+
if _, err := client.CreateLogGroup(&cloudwatchlogs.CreateLogGroupInput{
170163
LogGroupName: aws.String(logGroupName),
171164
}); err != nil {
172165
return err
@@ -177,10 +170,7 @@ func CreateNewCloudWatchLogGroup(client cloudwatchlogsiface.CloudWatchLogsAPI, l
177170

178171
// CreateNewLogStream creates a log stream inside of a LogGroup
179172
func CreateNewLogStream(client cloudwatchlogsiface.CloudWatchLogsAPI, logGroupName string, logStreamName string) error {
180-
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500)
181-
defer cancel()
182-
183-
_, err := client.CreateLogStreamWithContext(ctx, &cloudwatchlogs.CreateLogStreamInput{
173+
_, err := client.CreateLogStream(&cloudwatchlogs.CreateLogStreamInput{
184174
LogGroupName: aws.String(logGroupName),
185175
LogStreamName: aws.String(logStreamName),
186176
})

cfn/logging/cloudwatchlogs_test.go

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,30 @@
11
package logging
22

33
import (
4-
"context"
54
"testing"
65

76
"github.com/aws/aws-sdk-go/aws"
87
"github.com/aws/aws-sdk-go/aws/awserr"
9-
"github.com/aws/aws-sdk-go/aws/request"
108
"github.com/aws/aws-sdk-go/service/cloudwatchlogs"
119
"github.com/aws/aws-sdk-go/service/cloudwatchlogs/cloudwatchlogsiface"
1210
)
1311

1412
func TestCloudWatchLogProvider(t *testing.T) {
1513
t.Run("Init", func(t *testing.T) {
1614
client := CallbackCloudWatchLogs{
17-
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
15+
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
1816
return &cloudwatchlogs.DescribeLogGroupsOutput{
1917
LogGroups: []*cloudwatchlogs.LogGroup{
2018
&cloudwatchlogs.LogGroup{LogGroupName: input.LogGroupNamePrefix},
2119
},
2220
}, nil
2321
},
2422

25-
CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
23+
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
2624
return nil, nil
2725
},
2826

29-
CreateLogStreamFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
27+
CreateLogStreamFn: func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
3028
return nil, nil
3129
},
3230

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

4644
t.Run("Init Error Exists", func(t *testing.T) {
4745
client := CallbackCloudWatchLogs{
48-
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
46+
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
4947
return nil, awserr.New("Invalid", "Invalid", nil)
5048
},
5149

52-
CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
50+
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
5351
return nil, nil
5452
},
5553

56-
CreateLogStreamFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
54+
CreateLogStreamFn: func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
5755
return nil, nil
5856
},
5957

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

7371
t.Run("Init Error Unable to Create", func(t *testing.T) {
7472
client := CallbackCloudWatchLogs{
75-
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
73+
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
7674
return &cloudwatchlogs.DescribeLogGroupsOutput{
7775
LogGroups: []*cloudwatchlogs.LogGroup{},
7876
}, nil
7977
},
8078

81-
CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
79+
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
8280
return nil, awserr.New("Invalid", "Invalid", nil)
8381
},
8482

85-
CreateLogStreamFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
83+
CreateLogStreamFn: func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
8684
return nil, nil
8785
},
8886

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

102100
t.Run("Write", func(t *testing.T) {
103101
client := CallbackCloudWatchLogs{
104-
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
102+
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
105103
return &cloudwatchlogs.DescribeLogGroupsOutput{
106104
LogGroups: []*cloudwatchlogs.LogGroup{
107105
&cloudwatchlogs.LogGroup{LogGroupName: input.LogGroupNamePrefix},
108106
},
109107
}, nil
110108
},
111109

112-
CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
110+
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
113111
return nil, nil
114112
},
115113

116-
CreateLogStreamFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
114+
CreateLogStreamFn: func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
117115
return nil, nil
118116
},
119117

@@ -143,19 +141,19 @@ func TestCloudWatchLogProvider(t *testing.T) {
143141
t.Run("Write Error", func(t *testing.T) {
144142
writeCount := 0
145143
client := CallbackCloudWatchLogs{
146-
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
144+
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
147145
return &cloudwatchlogs.DescribeLogGroupsOutput{
148146
LogGroups: []*cloudwatchlogs.LogGroup{
149147
&cloudwatchlogs.LogGroup{LogGroupName: input.LogGroupNamePrefix},
150148
},
151149
}, nil
152150
},
153151

154-
CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
152+
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
155153
return nil, nil
156154
},
157155

158-
CreateLogStreamFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
156+
CreateLogStreamFn: func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
159157
return nil, nil
160158
},
161159

@@ -187,7 +185,7 @@ func TestCloudWatchLogProvider(t *testing.T) {
187185
func TestCloudWatchLogGroupExists(t *testing.T) {
188186
t.Run("Success", func(t *testing.T) {
189187
client := CallbackCloudWatchLogs{
190-
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
188+
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
191189
return &cloudwatchlogs.DescribeLogGroupsOutput{
192190
LogGroups: []*cloudwatchlogs.LogGroup{
193191
&cloudwatchlogs.LogGroup{LogGroupName: input.LogGroupNamePrefix},
@@ -203,7 +201,7 @@ func TestCloudWatchLogGroupExists(t *testing.T) {
203201

204202
t.Run("Error", func(t *testing.T) {
205203
client := CallbackCloudWatchLogs{
206-
DescribeLogGroupsFn: func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
204+
DescribeLogGroupsFn: func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
207205
return nil, awserr.New("Invalid", "Invalid", nil)
208206
},
209207
}
@@ -217,7 +215,7 @@ func TestCloudWatchLogGroupExists(t *testing.T) {
217215
func TestCreateCloudWatchLogGroup(t *testing.T) {
218216
t.Run("Success", func(t *testing.T) {
219217
client := CallbackCloudWatchLogs{
220-
CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
218+
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
221219
return nil, nil
222220
},
223221
}
@@ -229,7 +227,7 @@ func TestCreateCloudWatchLogGroup(t *testing.T) {
229227

230228
t.Run("Error", func(t *testing.T) {
231229
client := CallbackCloudWatchLogs{
232-
CreateLogGroupFn: func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
230+
CreateLogGroupFn: func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
233231
return nil, awserr.New("Invalid", "Invalid", nil)
234232
},
235233
}
@@ -243,22 +241,22 @@ func TestCreateCloudWatchLogGroup(t *testing.T) {
243241
type CallbackCloudWatchLogs struct {
244242
cloudwatchlogsiface.CloudWatchLogsAPI
245243

246-
DescribeLogGroupsFn func(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error)
247-
CreateLogGroupFn func(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error)
248-
CreateLogStreamFn func(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error)
244+
DescribeLogGroupsFn func(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error)
245+
CreateLogGroupFn func(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error)
246+
CreateLogStreamFn func(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error)
249247
PutLogEventsFn func(input *cloudwatchlogs.PutLogEventsInput) (*cloudwatchlogs.PutLogEventsOutput, error)
250248
}
251249

252-
func (cwl CallbackCloudWatchLogs) DescribeLogGroupsWithContext(ctx context.Context, input *cloudwatchlogs.DescribeLogGroupsInput, opts ...request.Option) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
253-
return cwl.DescribeLogGroupsFn(ctx, input)
250+
func (cwl CallbackCloudWatchLogs) DescribeLogGroups(input *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) {
251+
return cwl.DescribeLogGroupsFn(input)
254252
}
255253

256-
func (cwl CallbackCloudWatchLogs) CreateLogGroupWithContext(ctx context.Context, input *cloudwatchlogs.CreateLogGroupInput, opts ...request.Option) (*cloudwatchlogs.CreateLogGroupOutput, error) {
257-
return cwl.CreateLogGroupFn(ctx, input)
254+
func (cwl CallbackCloudWatchLogs) CreateLogGroup(input *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) {
255+
return cwl.CreateLogGroupFn(input)
258256
}
259257

260-
func (cwl CallbackCloudWatchLogs) CreateLogStreamWithContext(ctx context.Context, input *cloudwatchlogs.CreateLogStreamInput, opts ...request.Option) (*cloudwatchlogs.CreateLogStreamOutput, error) {
261-
return cwl.CreateLogStreamFn(ctx, input)
258+
func (cwl CallbackCloudWatchLogs) CreateLogStream(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) {
259+
return cwl.CreateLogStreamFn(input)
262260
}
263261

264262
func (cwl CallbackCloudWatchLogs) PutLogEvents(input *cloudwatchlogs.PutLogEventsInput) (*cloudwatchlogs.PutLogEventsOutput, error) {

cfn/logging/logging.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ const (
2525

2626
// SetProviderLogOutput ...
2727
func SetProviderLogOutput(w io.Writer) {
28-
os.Stderr = nil
29-
os.Stdout = nil
3028

3129
log.SetOutput(w)
3230

0 commit comments

Comments
 (0)