From 7be770f6c9b725a6b174e036799681139d4ea4d7 Mon Sep 17 00:00:00 2001 From: Johnny Lim Date: Sat, 24 Feb 2024 21:31:02 +0900 Subject: [PATCH] Refine observation assertion messages for keys Closes gh-4046 --- .../tck/ObservationContextAssert.java | 10 ++++++ .../tck/ObservationContextAssertTests.java | 32 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/micrometer-observation-test/src/main/java/io/micrometer/observation/tck/ObservationContextAssert.java b/micrometer-observation-test/src/main/java/io/micrometer/observation/tck/ObservationContextAssert.java index c133512820..76aba90ea6 100644 --- a/micrometer-observation-test/src/main/java/io/micrometer/observation/tck/ObservationContextAssert.java +++ b/micrometer-observation-test/src/main/java/io/micrometer/observation/tck/ObservationContextAssert.java @@ -229,6 +229,11 @@ private List highCardinalityKeys() { public SELF hasLowCardinalityKeyValueWithKey(String key) { isNotNull(); if (this.actual.getLowCardinalityKeyValues().stream().noneMatch(tag -> tag.getKey().equals(key))) { + if (this.actual.getHighCardinalityKeyValue(key) != null) { + failWithMessage( + "Observation should have a low cardinality tag with key <%s> but it was in the wrong (high) cardinality keys. List of all low cardinality keys <%s>", + key, lowCardinalityKeys()); + } failWithMessage( "Observation should have a low cardinality tag with key <%s> but it's not there. List of all keys <%s>", key, lowCardinalityKeys()); @@ -301,6 +306,11 @@ public SELF doesNotHaveLowCardinalityKeyValue(KeyValue keyValue) { public SELF hasHighCardinalityKeyValueWithKey(String key) { isNotNull(); if (this.actual.getHighCardinalityKeyValues().stream().noneMatch(tag -> tag.getKey().equals(key))) { + if (this.actual.getLowCardinalityKeyValue(key) != null) { + failWithMessage( + "Observation should have a high cardinality tag with key <%s> but it was in the wrong (low) cardinality keys. List of all high cardinality keys <%s>", + key, highCardinalityKeys()); + } failWithMessage( "Observation should have a high cardinality tag with key <%s> but it's not there. List of all keys <%s>", key, highCardinalityKeys()); diff --git a/micrometer-observation-test/src/test/java/io/micrometer/observation/tck/ObservationContextAssertTests.java b/micrometer-observation-test/src/test/java/io/micrometer/observation/tck/ObservationContextAssertTests.java index 7ad956cddb..d427e4690b 100644 --- a/micrometer-observation-test/src/test/java/io/micrometer/observation/tck/ObservationContextAssertTests.java +++ b/micrometer-observation-test/src/test/java/io/micrometer/observation/tck/ObservationContextAssertTests.java @@ -253,6 +253,22 @@ void should_throw_exception_when_low_cardinality_key_value_missing() { .isInstanceOf(AssertionError.class); } + @Test + void should_throw_exception_when_low_cardinality_key_value_missing_but_in_high_cardinality_keys() { + Observation observation = Observation.start("foo", context, registry); + observation.lowCardinalityKeyValue("low", "l"); + observation.highCardinalityKeyValue("high", "h"); + + thenThrownBy(() -> assertThat(context).hasLowCardinalityKeyValue("high", "h")) + .isInstanceOf(AssertionError.class) + .hasMessage( + "Observation should have a low cardinality tag with key but it was in the wrong (high) cardinality keys. List of all low cardinality keys <[low]>"); + thenThrownBy(() -> assertThat(context).hasLowCardinalityKeyValueWithKey("high")) + .isInstanceOf(AssertionError.class) + .hasMessage( + "Observation should have a low cardinality tag with key but it was in the wrong (high) cardinality keys. List of all low cardinality keys <[low]>"); + } + @Test void should_not_throw_exception_when_high_cardinality_key_value_exists() { Observation observation = Observation.start("foo", context, registry); @@ -273,6 +289,22 @@ void should_throw_exception_when_high_cardinality_key_value_missing() { .isInstanceOf(AssertionError.class); } + @Test + void should_throw_exception_when_high_cardinality_key_value_missing_but_in_low_cardinality_keys() { + Observation observation = Observation.start("foo", context, registry); + observation.lowCardinalityKeyValue("low", "l"); + observation.highCardinalityKeyValue("high", "h"); + + thenThrownBy(() -> assertThat(context).hasHighCardinalityKeyValue("low", "l")) + .isInstanceOf(AssertionError.class) + .hasMessage( + "Observation should have a high cardinality tag with key but it was in the wrong (low) cardinality keys. List of all high cardinality keys <[high]>"); + thenThrownBy(() -> assertThat(context).hasHighCardinalityKeyValueWithKey("low")) + .isInstanceOf(AssertionError.class) + .hasMessage( + "Observation should have a high cardinality tag with key but it was in the wrong (low) cardinality keys. List of all high cardinality keys <[high]>"); + } + @Test void should_not_throw_exception_when_high_cardinality_key_value_present() { thenNoException().isThrownBy(() -> assertThat(context).doesNotHaveHighCardinalityKeyValue("foo", "bar")