github.com/newrelic/go-agent@v3.26.0+incompatible/_integrations/nrlambda/events.go (about) 1 // Copyright 2020 New Relic Corporation. All rights reserved. 2 // SPDX-License-Identifier: Apache-2.0 3 4 package nrlambda 5 6 import ( 7 "net/http" 8 "net/url" 9 "strings" 10 11 "github.com/aws/aws-lambda-go/events" 12 newrelic "github.com/newrelic/go-agent" 13 ) 14 15 func getEventSourceARN(event interface{}) string { 16 switch v := event.(type) { 17 case events.KinesisFirehoseEvent: 18 return v.DeliveryStreamArn 19 case events.KinesisEvent: 20 if len(v.Records) > 0 { 21 return v.Records[0].EventSourceArn 22 } 23 case events.CodeCommitEvent: 24 if len(v.Records) > 0 { 25 return v.Records[0].EventSourceARN 26 } 27 case events.DynamoDBEvent: 28 if len(v.Records) > 0 { 29 return v.Records[0].EventSourceArn 30 } 31 case events.SQSEvent: 32 if len(v.Records) > 0 { 33 return v.Records[0].EventSourceARN 34 } 35 case events.S3Event: 36 if len(v.Records) > 0 { 37 return v.Records[0].S3.Bucket.Arn 38 } 39 case events.SNSEvent: 40 if len(v.Records) > 0 { 41 return v.Records[0].EventSubscriptionArn 42 } 43 } 44 return "" 45 } 46 47 type webRequest struct { 48 header http.Header 49 method string 50 u *url.URL 51 transport newrelic.TransportType 52 } 53 54 func (r webRequest) Header() http.Header { return r.header } 55 func (r webRequest) URL() *url.URL { return r.u } 56 func (r webRequest) Method() string { return r.method } 57 func (r webRequest) Transport() newrelic.TransportType { return r.transport } 58 59 func eventWebRequest(event interface{}) newrelic.WebRequest { 60 var path string 61 var request webRequest 62 var headers map[string]string 63 64 switch r := event.(type) { 65 case events.APIGatewayProxyRequest: 66 request.method = r.HTTPMethod 67 path = r.Path 68 headers = r.Headers 69 case events.ALBTargetGroupRequest: 70 // https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html#receive-event-from-load-balancer 71 request.method = r.HTTPMethod 72 path = r.Path 73 headers = r.Headers 74 default: 75 return nil 76 } 77 78 request.header = make(http.Header, len(headers)) 79 for k, v := range headers { 80 request.header.Set(k, v) 81 } 82 83 var host string 84 if port := request.header.Get("X-Forwarded-Port"); port != "" { 85 host = ":" + port 86 } 87 request.u = &url.URL{ 88 Path: path, 89 Host: host, 90 } 91 92 proto := strings.ToLower(request.header.Get("X-Forwarded-Proto")) 93 switch proto { 94 case "https": 95 request.transport = newrelic.TransportHTTPS 96 case "http": 97 request.transport = newrelic.TransportHTTP 98 default: 99 request.transport = newrelic.TransportUnknown 100 } 101 102 return request 103 } 104 105 func eventResponse(event interface{}) *response { 106 var code int 107 var headers map[string]string 108 109 switch r := event.(type) { 110 case events.APIGatewayProxyResponse: 111 code = r.StatusCode 112 headers = r.Headers 113 case events.ALBTargetGroupResponse: 114 code = r.StatusCode 115 headers = r.Headers 116 default: 117 return nil 118 } 119 hdr := make(http.Header, len(headers)) 120 for k, v := range headers { 121 hdr.Add(k, v) 122 } 123 return &response{ 124 code: code, 125 header: hdr, 126 } 127 }