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  }