Skip to content

Commit 3a46f17

Browse files
committed
nrlambda: add support for pointer to event
1 parent bc9e89f commit 3a46f17

File tree

2 files changed

+183
-9
lines changed

2 files changed

+183
-9
lines changed

v3/integrations/nrlambda/events.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,52 @@ func getEventSourceARN(event interface{}) string {
1616
switch v := event.(type) {
1717
case events.KinesisFirehoseEvent:
1818
return v.DeliveryStreamArn
19+
case *events.KinesisFirehoseEvent:
20+
return getEventSourceARN(safeDereference(v))
21+
1922
case events.KinesisEvent:
2023
if len(v.Records) > 0 {
2124
return v.Records[0].EventSourceArn
2225
}
26+
case *events.KinesisEvent:
27+
return getEventSourceARN(safeDereference(v))
28+
2329
case events.CodeCommitEvent:
2430
if len(v.Records) > 0 {
2531
return v.Records[0].EventSourceARN
2632
}
33+
case *events.CodeCommitEvent:
34+
return getEventSourceARN(safeDereference(v))
35+
2736
case events.DynamoDBEvent:
2837
if len(v.Records) > 0 {
2938
return v.Records[0].EventSourceArn
3039
}
40+
case *events.DynamoDBEvent:
41+
return getEventSourceARN(safeDereference(v))
42+
3143
case events.SQSEvent:
3244
if len(v.Records) > 0 {
3345
return v.Records[0].EventSourceARN
3446
}
47+
case *events.SQSEvent:
48+
return getEventSourceARN(safeDereference(v))
49+
3550
case events.S3Event:
3651
if len(v.Records) > 0 {
3752
return v.Records[0].S3.Bucket.Arn
3853
}
54+
case *events.S3Event:
55+
return getEventSourceARN(safeDereference(v))
56+
3957
case events.SNSEvent:
4058
if len(v.Records) > 0 {
4159
return v.Records[0].EventSubscriptionArn
4260
}
61+
case *events.SNSEvent:
62+
return getEventSourceARN(safeDereference(v))
4363
}
64+
4465
return ""
4566
}
4667

@@ -54,11 +75,16 @@ func eventWebRequest(event interface{}) *newrelic.WebRequest {
5475
request.Method = r.HTTPMethod
5576
path = r.Path
5677
headers = r.Headers
78+
case *events.APIGatewayProxyRequest:
79+
return eventWebRequest(safeDereference(r))
80+
5781
case events.ALBTargetGroupRequest:
58-
// https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html#receive-event-from-load-balancer
5982
request.Method = r.HTTPMethod
6083
path = r.Path
6184
headers = r.Headers
85+
case *events.ALBTargetGroupRequest:
86+
return eventWebRequest(safeDereference(r))
87+
6288
default:
6389
return nil
6490
}
@@ -98,9 +124,15 @@ func eventResponse(event interface{}) *response {
98124
case events.APIGatewayProxyResponse:
99125
code = r.StatusCode
100126
headers = r.Headers
127+
case *events.APIGatewayProxyResponse:
128+
return eventResponse(safeDereference(r))
129+
101130
case events.ALBTargetGroupResponse:
102131
code = r.StatusCode
103132
headers = r.Headers
133+
case *events.ALBTargetGroupResponse:
134+
return eventResponse(safeDereference(r))
135+
104136
default:
105137
return nil
106138
}
@@ -113,3 +145,11 @@ func eventResponse(event interface{}) *response {
113145
header: hdr,
114146
}
115147
}
148+
149+
func safeDereference[T any](p *T) T {
150+
if p == nil {
151+
var z T
152+
return z
153+
}
154+
return *p
155+
}

v3/integrations/nrlambda/events_test.go

Lines changed: 142 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,33 @@ func TestGetEventAttributes(t *testing.T) {
1717
Arn string
1818
}{
1919
{Name: "nil", Input: nil, Arn: ""},
20+
2021
{Name: "SQSEvent empty", Input: events.SQSEvent{}, Arn: ""},
2122
{Name: "SQSEvent", Input: events.SQSEvent{
2223
Records: []events.SQSMessage{{
2324
EventSourceARN: "ARN",
2425
}},
2526
}, Arn: "ARN"},
27+
{Name: "*SQSEvent nil", Input: (*events.SQSEvent)(nil), Arn: ""},
28+
{Name: "*SQSEvent", Input: &events.SQSEvent{
29+
Records: []events.SQSMessage{{
30+
EventSourceARN: "ARN",
31+
}},
32+
}, Arn: "ARN"},
33+
2634
{Name: "SNSEvent empty", Input: events.SNSEvent{}, Arn: ""},
2735
{Name: "SNSEvent", Input: events.SNSEvent{
2836
Records: []events.SNSEventRecord{{
2937
EventSubscriptionArn: "ARN",
3038
}},
3139
}, Arn: "ARN"},
40+
{Name: "*SNSEvent nil", Input: (*events.SNSEvent)(nil), Arn: ""},
41+
{Name: "*SNSEvent", Input: &events.SNSEvent{
42+
Records: []events.SNSEventRecord{{
43+
EventSubscriptionArn: "ARN",
44+
}},
45+
}, Arn: "ARN"},
46+
3247
{Name: "S3Event empty", Input: events.S3Event{}, Arn: ""},
3348
{Name: "S3Event", Input: events.S3Event{
3449
Records: []events.S3EventRecord{{
@@ -39,27 +54,64 @@ func TestGetEventAttributes(t *testing.T) {
3954
},
4055
}},
4156
}, Arn: "ARN"},
57+
{Name: "*S3Event nil", Input: (*events.S3Event)(nil), Arn: ""},
58+
{Name: "*S3Event", Input: &events.S3Event{
59+
Records: []events.S3EventRecord{{
60+
S3: events.S3Entity{
61+
Bucket: events.S3Bucket{
62+
Arn: "ARN",
63+
},
64+
},
65+
}},
66+
}, Arn: "ARN"},
67+
4268
{Name: "DynamoDBEvent empty", Input: events.DynamoDBEvent{}, Arn: ""},
4369
{Name: "DynamoDBEvent", Input: events.DynamoDBEvent{
4470
Records: []events.DynamoDBEventRecord{{
4571
EventSourceArn: "ARN",
4672
}},
4773
}, Arn: "ARN"},
74+
{Name: "*DynamoDBEvent nil", Input: (*events.DynamoDBEvent)(nil), Arn: ""},
75+
{Name: "*DynamoDBEvent", Input: &events.DynamoDBEvent{
76+
Records: []events.DynamoDBEventRecord{{
77+
EventSourceArn: "ARN",
78+
}},
79+
}, Arn: "ARN"},
80+
4881
{Name: "CodeCommitEvent empty", Input: events.CodeCommitEvent{}, Arn: ""},
4982
{Name: "CodeCommitEvent", Input: events.CodeCommitEvent{
5083
Records: []events.CodeCommitRecord{{
5184
EventSourceARN: "ARN",
5285
}},
5386
}, Arn: "ARN"},
87+
{Name: "*CodeCommitEvent nil", Input: (*events.CodeCommitEvent)(nil), Arn: ""},
88+
{Name: "*CodeCommitEvent", Input: &events.CodeCommitEvent{
89+
Records: []events.CodeCommitRecord{{
90+
EventSourceARN: "ARN",
91+
}},
92+
}, Arn: "ARN"},
93+
5494
{Name: "KinesisEvent empty", Input: events.KinesisEvent{}, Arn: ""},
5595
{Name: "KinesisEvent", Input: events.KinesisEvent{
5696
Records: []events.KinesisEventRecord{{
5797
EventSourceArn: "ARN",
5898
}},
5999
}, Arn: "ARN"},
100+
{Name: "*KinesisEvent nil", Input: (*events.KinesisEvent)(nil), Arn: ""},
101+
{Name: "*KinesisEvent", Input: &events.KinesisEvent{
102+
Records: []events.KinesisEventRecord{{
103+
EventSourceArn: "ARN",
104+
}},
105+
}, Arn: "ARN"},
106+
107+
{Name: "KinesisFirehoseEvent empty", Input: events.KinesisFirehoseEvent{}, Arn: ""},
60108
{Name: "KinesisFirehoseEvent", Input: events.KinesisFirehoseEvent{
61109
DeliveryStreamArn: "ARN",
62110
}, Arn: "ARN"},
111+
{Name: "*KinesisFirehoseEvent nil", Input: (*events.KinesisFirehoseEvent)(nil), Arn: ""},
112+
{Name: "*KinesisFirehoseEvent", Input: &events.KinesisFirehoseEvent{
113+
DeliveryStreamArn: "ARN",
114+
}, Arn: "ARN"},
63115
}
64116

65117
for _, testcase := range testcases {
@@ -86,15 +138,15 @@ func TestEventWebRequest(t *testing.T) {
86138
transport newrelic.TransportType
87139
}{
88140
{
89-
testname: "empty proxy request",
141+
testname: "empty APIGatewayProxyRequest",
90142
input: events.APIGatewayProxyRequest{},
91143
numHeaders: 0,
92144
method: "",
93145
urlString: "",
94146
transport: newrelic.TransportUnknown,
95147
},
96148
{
97-
testname: "populated proxy request",
149+
testname: "populated APIGatewayProxyRequest",
98150
input: events.APIGatewayProxyRequest{
99151
Headers: map[string]string{
100152
"x-forwarded-port": "4000",
@@ -109,15 +161,39 @@ func TestEventWebRequest(t *testing.T) {
109161
transport: newrelic.TransportHTTPS,
110162
},
111163
{
112-
testname: "empty alb request",
164+
testname: "nil *APIGatewayProxyRequest",
165+
input: (*events.APIGatewayProxyRequest)(nil),
166+
numHeaders: 0,
167+
method: "",
168+
urlString: "",
169+
transport: newrelic.TransportUnknown,
170+
},
171+
{
172+
testname: "populated *APIGatewayProxyRequest",
173+
input: &events.APIGatewayProxyRequest{
174+
Headers: map[string]string{
175+
"x-forwarded-port": "4000",
176+
"x-forwarded-proto": "HTTPS",
177+
},
178+
HTTPMethod: "GET",
179+
Path: "the/path",
180+
},
181+
numHeaders: 2,
182+
method: "GET",
183+
urlString: "//:4000/the/path",
184+
transport: newrelic.TransportHTTPS,
185+
},
186+
187+
{
188+
testname: "empty ALBTargetGroupRequest",
113189
input: events.ALBTargetGroupRequest{},
114190
numHeaders: 0,
115191
method: "",
116192
urlString: "",
117193
transport: newrelic.TransportUnknown,
118194
},
119195
{
120-
testname: "populated alb request",
196+
testname: "populated ALBTargetGroupRequest",
121197
input: events.ALBTargetGroupRequest{
122198
Headers: map[string]string{
123199
"x-forwarded-port": "3000",
@@ -131,6 +207,29 @@ func TestEventWebRequest(t *testing.T) {
131207
urlString: "//:3000/the/path",
132208
transport: newrelic.TransportHTTP,
133209
},
210+
{
211+
testname: "nil *ALBTargetGroupRequest",
212+
input: (*events.ALBTargetGroupRequest)(nil),
213+
numHeaders: 0,
214+
method: "",
215+
urlString: "",
216+
transport: newrelic.TransportUnknown,
217+
},
218+
{
219+
testname: "populated *ALBTargetGroupRequest",
220+
input: &events.ALBTargetGroupRequest{
221+
Headers: map[string]string{
222+
"x-forwarded-port": "3000",
223+
"x-forwarded-proto": "HttP",
224+
},
225+
HTTPMethod: "GET",
226+
Path: "the/path",
227+
},
228+
numHeaders: 2,
229+
method: "GET",
230+
urlString: "//:3000/the/path",
231+
transport: newrelic.TransportHTTP,
232+
},
134233
}
135234

136235
for _, tc := range testcases {
@@ -168,13 +267,13 @@ func TestEventResponse(t *testing.T) {
168267
code int
169268
}{
170269
{
171-
testname: "empty proxy response",
270+
testname: "empty APIGatewayProxyResponse",
172271
input: events.APIGatewayProxyResponse{},
173272
numHeaders: 0,
174273
code: 0,
175274
},
176275
{
177-
testname: "populated proxy response",
276+
testname: "populated APIGatewayProxyResponse",
178277
input: events.APIGatewayProxyResponse{
179278
StatusCode: 200,
180279
Headers: map[string]string{
@@ -185,13 +284,31 @@ func TestEventResponse(t *testing.T) {
185284
code: 200,
186285
},
187286
{
188-
testname: "empty alb response",
287+
testname: "nil *APIGatewayProxyResponse",
288+
input: (*events.APIGatewayProxyResponse)(nil),
289+
numHeaders: 0,
290+
code: 0,
291+
},
292+
{
293+
testname: "populated *APIGatewayProxyResponse",
294+
input: &events.APIGatewayProxyResponse{
295+
StatusCode: 200,
296+
Headers: map[string]string{
297+
"x-custom-header": "my custom header value",
298+
},
299+
},
300+
numHeaders: 1,
301+
code: 200,
302+
},
303+
304+
{
305+
testname: "empty ALBTargetGroupResponse",
189306
input: events.ALBTargetGroupResponse{},
190307
numHeaders: 0,
191308
code: 0,
192309
},
193310
{
194-
testname: "populated alb response",
311+
testname: "populated ALBTargetGroupResponse",
195312
input: events.ALBTargetGroupResponse{
196313
StatusCode: 200,
197314
Headers: map[string]string{
@@ -201,6 +318,23 @@ func TestEventResponse(t *testing.T) {
201318
numHeaders: 1,
202319
code: 200,
203320
},
321+
{
322+
testname: "nil *ALBTargetGroupResponse",
323+
input: (*events.ALBTargetGroupResponse)(nil),
324+
numHeaders: 0,
325+
code: 0,
326+
},
327+
{
328+
testname: "populated *ALBTargetGroupResponse",
329+
input: &events.ALBTargetGroupResponse{
330+
StatusCode: 200,
331+
Headers: map[string]string{
332+
"x-custom-header": "my custom header value",
333+
},
334+
},
335+
numHeaders: 1,
336+
code: 200,
337+
},
204338
}
205339

206340
for _, tc := range testcases {

0 commit comments

Comments
 (0)