From 510f7123f24a1c3366236ec1a9bd8c30ed9c77b3 Mon Sep 17 00:00:00 2001 From: Gavi Hirsch Date: Thu, 15 Aug 2019 17:19:54 -0700 Subject: [PATCH] adding 'container_region' to kvmeta --- Gopkg.lock | 18 ++++++++++--- decode/decode.go | 26 ++++++++++++------ decode/decode_test.go | 62 ++++++++++++++++++++++++++++--------------- 3 files changed, 73 insertions(+), 33 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index efc1f45..894cbf2 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -4,7 +4,10 @@ [[projects]] branch = "master" name = "github.com/Clever/syslogparser" - packages = [".","rfc3164"] + packages = [ + ".", + "rfc3164" + ] revision = "fb28ad3e4340c046323b7beba685a72fd12ecbe8" [[projects]] @@ -25,7 +28,10 @@ [[projects]] name = "github.com/stretchr/testify" - packages = ["assert"] + packages = [ + "assert", + "require" + ] revision = "69483b4bd14f5845b5a1e55bca19e954e827f1d0" version = "v1.1.4" @@ -57,7 +63,11 @@ [[projects]] name = "gopkg.in/Clever/kayvee-go.v6" - packages = [".","logger","router"] + packages = [ + ".", + "logger", + "router" + ] revision = "096364e316a52652d3493be702d8105d8d01db84" version = "v6.6.0" @@ -69,6 +79,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "12add425987f6b506139be39923e5dababe3a0337b5d8f81bf5722c55c58b52e" + inputs-digest = "4699293f3632dd38561ff60477aa7cc1ecaadc5808b974d017099e2189679286" solver-name = "gps-cdcl" solver-version = 1 diff --git a/decode/decode.go b/decode/decode.go index 93d8a66..4ce9905 100644 --- a/decode/decode.go +++ b/decode/decode.go @@ -404,6 +404,7 @@ func ParseAndEnhance(line string, env string) (map[string]interface{}, error) { // docker-events app. forceEnv := "" forceApp := "" + forceRegion := "" forceTask := "" if cEnv, ok := out["container_env"]; ok { forceEnv = cEnv.(string) @@ -411,10 +412,13 @@ func ParseAndEnhance(line string, env string) (map[string]interface{}, error) { if cApp, ok := out["container_app"]; ok { forceApp = cApp.(string) } + if cRegion, ok := out["container_region"]; ok { + forceRegion = cRegion.(string) + } if cTask, ok := out["container_task"]; ok { forceTask = cTask.(string) } - meta, err := getContainerMeta(programname, forceEnv, forceApp, forceTask) + meta, err := getContainerMeta(programname, forceEnv, forceApp, forceRegion, forceTask) if err == nil { for k, v := range meta { out[k] = v @@ -425,24 +429,26 @@ func ParseAndEnhance(line string, env string) (map[string]interface{}, error) { } const containerMeta = `([a-z0-9-]+)--([a-z0-9-]+)\/` + // env--app - `arn%3Aaws%3Aecs%3Aus-(west|east)-[1-2]%3A[0-9]{12}%3Atask%2F` + // ARN cruft + `arn%3Aaws%3Aecs%3A(us-(west|east)-[1-2])%3A[0-9]{12}%3Atask%2F` + // ARN cruft `([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|[a-z0-9]{32})` // task-id (ECS, both EC2 and Fargate) var containerMetaRegex = regexp.MustCompile(containerMeta) -func getContainerMeta(programname, forceEnv, forceApp, forceTask string) (map[string]string, error) { +func getContainerMeta(programname, forceEnv, forceApp, forceRegion, forceTask string) (map[string]string, error) { if programname == "" { return map[string]string{}, fmt.Errorf("no programname") } env := "" app := "" + region := "" task := "" matches := containerMetaRegex.FindAllStringSubmatch(programname, 1) if len(matches) == 1 { env = matches[0][1] app = matches[0][2] - task = matches[0][4] + region = matches[0][3] + task = matches[0][5] } if forceEnv != "" { @@ -451,17 +457,21 @@ func getContainerMeta(programname, forceEnv, forceApp, forceTask string) (map[st if forceApp != "" { app = forceApp } + if forceRegion != "" { + region = forceRegion + } if forceTask != "" { task = forceTask } - if env == "" || app == "" || task == "" { + if env == "" || app == "" || region == "" || task == "" { return map[string]string{}, fmt.Errorf("unable to get one or more of env/app/task") } return map[string]string{ - "container_env": env, - "container_app": app, - "container_task": task, + "container_env": env, + "container_app": app, + "container_region": region, + "container_task": task, }, nil } diff --git a/decode/decode_test.go b/decode/decode_test.go index f71ea1f..cf5a86f 100644 --- a/decode/decode_test.go +++ b/decode/decode_test.go @@ -243,6 +243,7 @@ func TestParseAndEnhance(t *testing.T) { "env": "deploy-env", "container_env": "env", "container_app": "app", + "container_region": "us-west-1", "container_task": "abcd1234-1a3b-1a3b-1234-d76552f4b7ef", }, ExpectedError: nil, @@ -262,6 +263,7 @@ func TestParseAndEnhance(t *testing.T) { "env": "deploy-env", "container_env": "env", "container_app": "force-app", + "container_region": "us-west-1", "container_task": "abcd1234-1a3b-1a3b-1234-d76552f4b7ef", }, ExpectedError: nil, @@ -278,6 +280,7 @@ func TestParseAndEnhance(t *testing.T) { "decoder_msg_type": "syslog", "container_env": "env", "container_app": "app", + "container_region": "us-west-1", "container_task": "abcd1234-1a3b-1a3b-1234-d76552f4b7ef", }, ExpectedError: nil, @@ -303,6 +306,7 @@ func TestParseAndEnhance(t *testing.T) { "env": "deploy-env", "container_env": "env", "container_app": "app", + "container_region": "us-west-1", "container_task": "abcd1234-1a3b-1a3b-1234-d76552f4b7ef", "nested": map[string]interface{}{"a": "b"}, }, @@ -341,57 +345,73 @@ func TestGetContainerMeta(t *testing.T) { t.Log("Must have a programname to get container meta") programname := "" - _, err := getContainerMeta(programname, "", "", "") + _, err := getContainerMeta(programname, "", "", "", "") assert.Error(err) t.Log("Can parse a programname") programname = `env1--app2/arn%3Aaws%3Aecs%3Aus-west-1%3A589690932525%3Atask%2Fabcd1234-1a3b-1a3b-1234-d76552f4b7ef` - meta, err := getContainerMeta(programname, "", "", "") + meta, err := getContainerMeta(programname, "", "", "", "") assert.NoError(err) assert.Equal(map[string]string{ - "container_env": "env1", - "container_app": "app2", - "container_task": "abcd1234-1a3b-1a3b-1234-d76552f4b7ef", + "container_env": "env1", + "container_app": "app2", + "container_region": "us-west-1", + "container_task": "abcd1234-1a3b-1a3b-1234-d76552f4b7ef", }, meta) t.Log("Can override just 'env'") overrideEnv := "force-env" - meta, err = getContainerMeta(programname, overrideEnv, "", "") + meta, err = getContainerMeta(programname, overrideEnv, "", "", "") assert.NoError(err) assert.Equal(map[string]string{ - "container_env": overrideEnv, - "container_app": "app2", - "container_task": "abcd1234-1a3b-1a3b-1234-d76552f4b7ef", + "container_env": overrideEnv, + "container_app": "app2", + "container_region": "us-west-1", + "container_task": "abcd1234-1a3b-1a3b-1234-d76552f4b7ef", }, meta) t.Log("Can override just 'app'") overrideApp := "force-app" - meta, err = getContainerMeta(programname, "", overrideApp, "") + meta, err = getContainerMeta(programname, "", overrideApp, "", "") assert.NoError(err) assert.Equal(map[string]string{ - "container_env": "env1", - "container_app": overrideApp, - "container_task": "abcd1234-1a3b-1a3b-1234-d76552f4b7ef", + "container_env": "env1", + "container_app": overrideApp, + "container_region": "us-west-1", + "container_task": "abcd1234-1a3b-1a3b-1234-d76552f4b7ef", + }, meta) + + t.Log("Can override just 'region'") + overrideRegion := "force-region" + meta, err = getContainerMeta(programname, "", "", overrideRegion, "") + assert.NoError(err) + assert.Equal(map[string]string{ + "container_env": "env1", + "container_app": "app2", + "container_region": overrideRegion, + "container_task": "abcd1234-1a3b-1a3b-1234-d76552f4b7ef", }, meta) t.Log("Can override just 'task'") overrideTask := "force-task" - meta, err = getContainerMeta(programname, "", "", overrideTask) + meta, err = getContainerMeta(programname, "", "", "", overrideTask) assert.NoError(err) assert.Equal(map[string]string{ - "container_env": "env1", - "container_app": "app2", - "container_task": overrideTask, + "container_env": "env1", + "container_app": "app2", + "container_region": "us-west-1", + "container_task": overrideTask, }, meta) t.Log("Can override all fields") programname = `env--app/arn%3Aaws%3Aecs%3Aus-west-1%3A999988887777%3Atask%2Fabcd1234-1a3b-1a3b-1234-d76552f4b7ef` - meta, err = getContainerMeta(programname, overrideEnv, overrideApp, overrideTask) + meta, err = getContainerMeta(programname, overrideEnv, overrideApp, overrideRegion, overrideTask) assert.NoError(err) assert.Equal(map[string]string{ - "container_env": overrideEnv, - "container_app": overrideApp, - "container_task": overrideTask, + "container_env": overrideEnv, + "container_app": overrideApp, + "container_region": overrideRegion, + "container_task": overrideTask, }, meta) }