From 315c38f20f75a4a5ce90fcf691d10d3ed286966d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mazeau?= Date: Mon, 4 Dec 2023 11:10:15 +0100 Subject: [PATCH] serverless: add http.route tag when available (#21086) This allows serverless spans to get picked-up by API Catalog, that requires http.route to be present. --- pkg/serverless/invocationlifecycle/lifecycle_test.go | 4 ++++ pkg/serverless/trigger/extractor.go | 9 +++++++++ pkg/serverless/trigger/extractor_test.go | 8 ++++++++ 3 files changed, 21 insertions(+) diff --git a/pkg/serverless/invocationlifecycle/lifecycle_test.go b/pkg/serverless/invocationlifecycle/lifecycle_test.go index b3eae5d5a7fb9..83b2e6f96ab9d 100644 --- a/pkg/serverless/invocationlifecycle/lifecycle_test.go +++ b/pkg/serverless/invocationlifecycle/lifecycle_test.go @@ -396,6 +396,7 @@ func TestTriggerTypesLifecycleEventForAPIGatewayRest(t *testing.T) { assert.Equal(t, map[string]string{ "function_trigger.event_source_arn": "arn:aws:apigateway:us-east-1::/restapis/1234567890/stages/prod", "http.method": "POST", + "http.route": "/{proxy+}", "http.url": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/prod/path/to/resource", "http.useragent": "Custom User Agent String", @@ -442,6 +443,7 @@ func TestTriggerTypesLifecycleEventForAPIGateway5xxResponse(t *testing.T) { "cold_start": "false", "function_trigger.event_source_arn": "arn:aws:apigateway:us-east-1::/restapis/1234567890/stages/prod", "http.method": "POST", + "http.route": "/{proxy+}", "http.url": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com", "http.url_details.path": "/prod/path/to/resource", "http.useragent": "Custom User Agent String", @@ -487,6 +489,7 @@ func TestTriggerTypesLifecycleEventForAPIGatewayNonProxy(t *testing.T) { "cold_start": "false", "function_trigger.event_source_arn": "arn:aws:apigateway:us-east-1::/restapis/lgxbo6a518/stages/dev", "http.method": "GET", + "http.route": "/http/get", "http.url": "lgxbo6a518.execute-api.sa-east-1.amazonaws.com", "http.url_details.path": "/dev/http/get", "http.useragent": "curl/7.64.1", @@ -535,6 +538,7 @@ func TestTriggerTypesLifecycleEventForAPIGatewayNonProxy5xxResponse(t *testing.T "cold_start": "false", "function_trigger.event_source_arn": "arn:aws:apigateway:us-east-1::/restapis/lgxbo6a518/stages/dev", "http.method": "GET", + "http.route": "/http/get", "http.url": "lgxbo6a518.execute-api.sa-east-1.amazonaws.com", "http.url_details.path": "/dev/http/get", "request_id": "test-request-id", diff --git a/pkg/serverless/trigger/extractor.go b/pkg/serverless/trigger/extractor.go index 56c7efad17c58..7ba2d90aa54af 100644 --- a/pkg/serverless/trigger/extractor.go +++ b/pkg/serverless/trigger/extractor.go @@ -110,6 +110,9 @@ func GetTagsFromAPIGatewayEvent(event events.APIGatewayProxyRequest) map[string] } httpTags["http.url_details.path"] = event.RequestContext.Path httpTags["http.method"] = event.RequestContext.HTTPMethod + if event.Resource != "" { + httpTags["http.route"] = event.Resource + } if event.Headers != nil { if event.Headers["Referer"] != "" { httpTags["http.referer"] = event.Headers["Referer"] @@ -128,6 +131,9 @@ func GetTagsFromAPIGatewayV2HTTPRequest(event events.APIGatewayV2HTTPRequest) ma httpTags["http.url"] = event.RequestContext.DomainName httpTags["http.url_details.path"] = event.RequestContext.HTTP.Path httpTags["http.method"] = event.RequestContext.HTTP.Method + if event.RouteKey != "" { + httpTags["http.route"] = event.RouteKey + } if event.Headers != nil { if event.Headers["Referer"] != "" { httpTags["http.referer"] = event.Headers["Referer"] @@ -164,6 +170,9 @@ func GetTagsFromAPIGatewayCustomAuthorizerRequestTypeEvent(event events.APIGatew httpTags := make(map[string]string) httpTags["http.url_details.path"] = event.RequestContext.Path httpTags["http.method"] = event.HTTPMethod + if event.Resource != "" { + httpTags["http.route"] = event.Resource + } if referer := event.Headers["Referer"]; referer != "" { httpTags["http.referer"] = referer } diff --git a/pkg/serverless/trigger/extractor_test.go b/pkg/serverless/trigger/extractor_test.go index 4d180597c2124..757d1c02d98eb 100644 --- a/pkg/serverless/trigger/extractor_test.go +++ b/pkg/serverless/trigger/extractor_test.go @@ -238,6 +238,7 @@ func TestExtractFunctionURLEventARN(t *testing.T) { Path: "path", HTTPMethod: "http-method", }, + Resource: "/{route}", } httpTags := GetTagsFromAPIGatewayEvent(event) @@ -247,6 +248,7 @@ func TestExtractFunctionURLEventARN(t *testing.T) { "http.url_details.path": "path", "http.method": "http-method", "http.referer": "referer", + "http.route": "/{route}", }, httpTags) } @@ -261,6 +263,7 @@ func TestGetTagsFromAPIGatewayEvent(t *testing.T) { Path: "path", HTTPMethod: "http-method", }, + Resource: "/{route}", } httpTags := GetTagsFromAPIGatewayEvent(event) @@ -270,6 +273,7 @@ func TestGetTagsFromAPIGatewayEvent(t *testing.T) { "http.url_details.path": "path", "http.method": "http-method", "http.referer": "referer", + "http.route": "/{route}", }, httpTags) } @@ -285,6 +289,7 @@ func TestGetTagsFromAPIGatewayV2HTTPRequestNoReferer(t *testing.T) { Method: "http-method", }, }, + RouteKey: "/{route}", } httpTags := GetTagsFromAPIGatewayV2HTTPRequest(event) @@ -293,6 +298,7 @@ func TestGetTagsFromAPIGatewayV2HTTPRequestNoReferer(t *testing.T) { "http.url": "domain-name", "http.url_details.path": "path", "http.method": "http-method", + "http.route": "/{route}", }, httpTags) } @@ -315,6 +321,7 @@ func TestGetTagsFromAPIGatewayCustomAuthorizerRequestTypeEvent(t *testing.T) { RequestContext: events.APIGatewayCustomAuthorizerRequestTypeRequestContext{ Path: "/path/to/resource", }, + Resource: "/{route}", } httpTags := GetTagsFromAPIGatewayCustomAuthorizerRequestTypeEvent(event) @@ -322,6 +329,7 @@ func TestGetTagsFromAPIGatewayCustomAuthorizerRequestTypeEvent(t *testing.T) { assert.Equal(t, map[string]string{ "http.method": "GET", "http.url_details.path": "/path/to/resource", + "http.route": "/{route}", }, httpTags) }