From b9b964d2c1dae51522220d961daad8ef84ccc119 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Fri, 15 Dec 2023 13:57:54 -0800 Subject: [PATCH 1/3] Do not call flush endpoint for every invocation. --- ddlambda.go | 4 ++++ internal/metrics/listener.go | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ddlambda.go b/ddlambda.go index 0ac49c62..aa445456 100644 --- a/ddlambda.go +++ b/ddlambda.go @@ -304,6 +304,10 @@ func (cfg *Config) toMetricsConfig(isExtensionRunning bool) metrics.Config { mc.EnhancedMetrics = strings.EqualFold(enhancedMetrics, "true") } + if localTest := os.Getenv("DD_LOCAL_TEST"); localTest == "true" || localTest == "1" { + mc.LocalTest = true + } + return mc } diff --git a/internal/metrics/listener.go b/internal/metrics/listener.go index 73f6e878..dcb309f5 100644 --- a/internal/metrics/listener.go +++ b/internal/metrics/listener.go @@ -49,6 +49,7 @@ type ( CircuitBreakerInterval time.Duration CircuitBreakerTimeout time.Duration CircuitBreakerTotalFailures uint32 + LocalTest bool } logMetric struct { @@ -143,8 +144,10 @@ func (l *Listener) HandlerFinished(ctx context.Context, err error) { } } // send a message to the Agent to flush the metrics - if err := l.extensionManager.Flush(); err != nil { - logger.Error(fmt.Errorf("error while flushing the metrics: %s", err)) + if l.config.LocalTest { + if err := l.extensionManager.Flush(); err != nil { + logger.Error(fmt.Errorf("error while flushing the metrics: %s", err)) + } } } else { // use the api From 484dd065046a8530d664591b731bf0b3329462c9 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Fri, 15 Dec 2023 14:14:10 -0800 Subject: [PATCH 2/3] Tests for toMetricsConfig. --- ddlambda.go | 2 +- ddlambda_test.go | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/ddlambda.go b/ddlambda.go index aa445456..87388e5c 100644 --- a/ddlambda.go +++ b/ddlambda.go @@ -304,7 +304,7 @@ func (cfg *Config) toMetricsConfig(isExtensionRunning bool) metrics.Config { mc.EnhancedMetrics = strings.EqualFold(enhancedMetrics, "true") } - if localTest := os.Getenv("DD_LOCAL_TEST"); localTest == "true" || localTest == "1" { + if localTest := os.Getenv("DD_LOCAL_TEST"); localTest == "1" || strings.ToLower(localTest) == "true" { mc.LocalTest = true } diff --git a/ddlambda_test.go b/ddlambda_test.go index 0b3d4480..052528e8 100644 --- a/ddlambda_test.go +++ b/ddlambda_test.go @@ -9,8 +9,10 @@ package ddlambda import ( "context" + "fmt" "net/http" "net/http/httptest" + "os" "testing" "github.com/stretchr/testify/assert" @@ -51,3 +53,54 @@ func TestMetricsSubmitWithWrapper(t *testing.T) { assert.NoError(t, err) assert.True(t, called) } + +func TestToMetricConfigLocalTest(t *testing.T) { + testcases := []struct { + envs map[string]string + cval bool + }{ + { + envs: map[string]string{"DD_LOCAL_TEST": "True"}, + cval: true, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": "true"}, + cval: true, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": "1"}, + cval: true, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": "False"}, + cval: false, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": "false"}, + cval: false, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": "0"}, + cval: false, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": ""}, + cval: false, + }, + { + envs: map[string]string{}, + cval: false, + }, + } + + cfg := Config{} + for _, tc := range testcases { + t.Run(fmt.Sprintf("%#v", tc.envs), func(t *testing.T) { + for k, v := range tc.envs { + os.Setenv(k, v) + } + mc := cfg.toMetricsConfig(true) + assert.Equal(t, tc.cval, mc.LocalTest) + }) + } +} From 156f596c95e0de7cf7774c983d846c49150da6df Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Fri, 15 Dec 2023 15:01:36 -0800 Subject: [PATCH 3/3] Test for HandlerFinished. --- internal/metrics/listener_test.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/internal/metrics/listener_test.go b/internal/metrics/listener_test.go index 07b90998..40d908d7 100644 --- a/internal/metrics/listener_test.go +++ b/internal/metrics/listener_test.go @@ -13,6 +13,8 @@ import ( "context" "encoding/json" "errors" + "fmt" + "net" "net/http" "net/http/httptest" "os" @@ -221,3 +223,27 @@ func TestSubmitEnhancedMetricsOnlyErrors(t *testing.T) { expected := "{\"m\":\"aws.lambda.enhanced.errors\",\"v\":1," assert.True(t, strings.Contains(output, expected)) } + +func TestListenerHandlerFinishedFlushes(t *testing.T) { + var called bool + + ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + })) + ts.Listener.Close() + ts.Listener, _ = net.Listen("tcp", "127.0.0.1:8124") + + ts.Start() + defer ts.Close() + + listener := MakeListener(Config{}, extension.BuildExtensionManager(false)) + listener.isAgentRunning = true + for _, localTest := range []bool{true, false} { + t.Run(fmt.Sprintf("%#v", localTest), func(t *testing.T) { + called = false + listener.config.LocalTest = localTest + listener.HandlerFinished(context.TODO(), nil) + assert.Equal(t, called, localTest) + }) + } +}