From 088ddf7aaf3e4c07c17082e973a40f12b8c8e12b Mon Sep 17 00:00:00 2001 From: Yao Zhao Date: Tue, 27 Apr 2021 17:46:57 -0700 Subject: [PATCH 1/2] Fixed a bug of carrying default dimensions over flushes --- .../cloudwatchlogs/emf/model/Metadata.java | 5 ++ .../emf/model/MetricDirective.java | 14 ++++++ .../emf/model/MetricsContext.java | 12 +++-- .../emf/logger/MetricsLoggerTest.java | 49 +++++++++++++++++++ 4 files changed, 75 insertions(+), 5 deletions(-) diff --git a/src/main/java/software/amazon/cloudwatchlogs/emf/model/Metadata.java b/src/main/java/software/amazon/cloudwatchlogs/emf/model/Metadata.java index 623eeabb..638850e5 100644 --- a/src/main/java/software/amazon/cloudwatchlogs/emf/model/Metadata.java +++ b/src/main/java/software/amazon/cloudwatchlogs/emf/model/Metadata.java @@ -70,6 +70,11 @@ MetricDirective createMetricDirective() { return newMetricDirective; } + void setMetricDirective(MetricDirective metricDirective) { + cloudWatchMetrics = new ArrayList<>(); + cloudWatchMetrics.add(metricDirective); + } + /** * Test if there's any metric added. * diff --git a/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricDirective.java b/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricDirective.java index f5218702..8d52094a 100644 --- a/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricDirective.java +++ b/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricDirective.java @@ -115,4 +115,18 @@ List getAllDimensions() { boolean hasNoMetrics() { return this.getMetrics().isEmpty(); } + + /** + * Create a copy of the metric directive without having the existing metrics + * + * @return A object of metric directive + */ + MetricDirective copyWithoutMetrics() { + MetricDirective metricDirective = new MetricDirective(); + metricDirective.setDefaultDimensions(this.defaultDimensions); + metricDirective.setDimensions(this.dimensions); + metricDirective.setNamespace(this.namespace); + metricDirective.shouldUseDefaultDimension = this.shouldUseDefaultDimension; + return metricDirective; + } } diff --git a/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricsContext.java b/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricsContext.java index b745e7b1..d7a6c838 100644 --- a/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricsContext.java +++ b/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricsContext.java @@ -37,6 +37,12 @@ public MetricsContext(RootNode rootNode) { metricDirective = rootNode.getAws().createMetricDirective(); } + public MetricsContext(MetricDirective metricDirective) { + this(); + this.rootNode.getAws().setMetricDirective(metricDirective); + this.metricDirective = metricDirective; + } + public MetricsContext( String namespace, Map properties, @@ -191,11 +197,7 @@ public void putMetadata(String key, Object value) { /** @return Creates an independently flushable context. */ public MetricsContext createCopyWithContext() { - return new MetricsContext( - this.metricDirective.getNamespace(), - this.rootNode.getProperties(), - this.metricDirective.getDimensions(), - this.metricDirective.getDefaultDimensions()); + return new MetricsContext(metricDirective.copyWithoutMetrics()); } /** diff --git a/src/test/java/software/amazon/cloudwatchlogs/emf/logger/MetricsLoggerTest.java b/src/test/java/software/amazon/cloudwatchlogs/emf/logger/MetricsLoggerTest.java index 5d8beff5..09957771 100644 --- a/src/test/java/software/amazon/cloudwatchlogs/emf/logger/MetricsLoggerTest.java +++ b/src/test/java/software/amazon/cloudwatchlogs/emf/logger/MetricsLoggerTest.java @@ -17,6 +17,7 @@ package software.amazon.cloudwatchlogs.emf.logger; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.*; @@ -201,6 +202,54 @@ public void testNoDefaultDimensionsAfterSetDimension() { expectDimension("Name", "Test"); } + @Test + public void testFlushPreserveDimensions() { + MetricsLogger logger = new MetricsLogger(envProvider); + logger.setDimensions(DimensionSet.of("Name", "Test")); + logger.flush(); + expectDimension("Name", "Test"); + + logger.flush(); + expectDimension("Name", "Test"); + } + + @Test + public void testFlushDoesntPreserveMetrics() { + MetricsLogger logger = new MetricsLogger(envProvider); + logger.setDimensions(DimensionSet.of("Name", "Test")); + logger.putMetric("Count", 1.0); + logger.flush(); + assertTrue(sink.getLogEvents().get(0).contains("Count")); + + logger.flush(); + assertFalse(sink.getLogEvents().get(0).contains("Count")); + } + + + @Test + public void testNoDimensionsAfterSetEmptyDimensionSet() { + MetricsLogger logger = new MetricsLogger(envProvider); + + logger.setDimensions(); + logger.flush(); + + List dimensions = sink.getContext().getDimensions(); + assertEquals(0, dimensions.size()); + } + + @Test + public void testNoDimensionsAfterSetEmptyDimensionSetWithMultipleFlush() { + MetricsLogger logger = new MetricsLogger(envProvider); + + logger.setDimensions(); + logger.flush(); + + assertEquals(0, sink.getContext().getDimensions().size()); + + logger.flush(); + assertEquals(0, sink.getContext().getDimensions().size()); + } + private void expectDimension(String dimension, String value) { List dimensions = sink.getContext().getDimensions(); assertEquals(dimensions.size(), 1); From 633f0cc4d556350ca7db94b392138546cbf91cc3 Mon Sep 17 00:00:00 2001 From: Yao Zhao Date: Wed, 28 Apr 2021 14:25:40 -0700 Subject: [PATCH 2/2] Fixed coding style --- .../amazon/cloudwatchlogs/emf/logger/MetricsLoggerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/software/amazon/cloudwatchlogs/emf/logger/MetricsLoggerTest.java b/src/test/java/software/amazon/cloudwatchlogs/emf/logger/MetricsLoggerTest.java index 09957771..1dafc385 100644 --- a/src/test/java/software/amazon/cloudwatchlogs/emf/logger/MetricsLoggerTest.java +++ b/src/test/java/software/amazon/cloudwatchlogs/emf/logger/MetricsLoggerTest.java @@ -225,7 +225,6 @@ public void testFlushDoesntPreserveMetrics() { assertFalse(sink.getLogEvents().get(0).contains("Count")); } - @Test public void testNoDimensionsAfterSetEmptyDimensionSet() { MetricsLogger logger = new MetricsLogger(envProvider);