diff --git a/api/all/src/main/java/io/opentelemetry/api/common/AttributesBuilder.java b/api/all/src/main/java/io/opentelemetry/api/common/AttributesBuilder.java index 9422eaf035f..a7fe1be0ee0 100644 --- a/api/all/src/main/java/io/opentelemetry/api/common/AttributesBuilder.java +++ b/api/all/src/main/java/io/opentelemetry/api/common/AttributesBuilder.java @@ -16,6 +16,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import java.util.Arrays; +import java.util.List; import java.util.function.Predicate; /** A builder of {@link Attributes} supporting an arbitrary number of key-value pairs. */ @@ -100,6 +101,19 @@ default AttributesBuilder put(String key, String... value) { return put(stringArrayKey(key), Arrays.asList(value)); } + /** + * Puts a List attribute into this. + * + * @return this Builder + */ + @SuppressWarnings("unchecked") + default AttributesBuilder put(AttributeKey> key, T... value) { + if (value == null) { + return this; + } + return put(key, Arrays.asList(value)); + } + /** * Puts a Long array attribute into this. * diff --git a/api/all/src/test/java/io/opentelemetry/api/common/AttributesTest.java b/api/all/src/test/java/io/opentelemetry/api/common/AttributesTest.java index db9c84e83db..6726b539713 100644 --- a/api/all/src/test/java/io/opentelemetry/api/common/AttributesTest.java +++ b/api/all/src/test/java/io/opentelemetry/api/common/AttributesTest.java @@ -289,6 +289,52 @@ void builder() { assertThat(attributes).isEqualTo(wantAttributes); } + @Test + void builderWithAttributeKeyList() { + Attributes attributes = + Attributes.builder() + .put("string", "value1") + .put(longKey("long"), 10) + .put(stringArrayKey("anotherString"), "value1", "value2", "value3") + .put(longArrayKey("anotherLong"), 10L, 20L, 30L) + .put(booleanArrayKey("anotherBoolean"), true, false, true) + .build(); + + Attributes wantAttributes = + Attributes.of( + stringKey("string"), + "value1", + longKey("long"), + 10L, + stringArrayKey("anotherString"), + Arrays.asList("value1", "value2", "value3"), + longArrayKey("anotherLong"), + Arrays.asList(10L, 20L, 30L), + booleanArrayKey("anotherBoolean"), + Arrays.asList(true, false, true)); + assertThat(attributes).isEqualTo(wantAttributes); + + AttributesBuilder newAttributes = attributes.toBuilder(); + newAttributes.put("newKey", "newValue"); + assertThat(newAttributes.build()) + .isEqualTo( + Attributes.of( + stringKey("string"), + "value1", + longKey("long"), + 10L, + stringArrayKey("anotherString"), + Arrays.asList("value1", "value2", "value3"), + longArrayKey("anotherLong"), + Arrays.asList(10L, 20L, 30L), + booleanArrayKey("anotherBoolean"), + Arrays.asList(true, false, true), + stringKey("newKey"), + "newValue")); + // Original not mutated. + assertThat(attributes).isEqualTo(wantAttributes); + } + @Test void builder_arrayTypes() { Attributes attributes = diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt index df26146497b..573eeb42ebe 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt @@ -1,2 +1,4 @@ Comparing source compatibility of against -No changes. \ No newline at end of file +***! MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.common.AttributesBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++! NEW METHOD: PUBLIC(+) io.opentelemetry.api.common.AttributesBuilder put(io.opentelemetry.api.common.AttributeKey, java.lang.Object[]) diff --git a/sdk/common/src/test/java/io/opentelemetry/sdk/resources/ResourceTest.java b/sdk/common/src/test/java/io/opentelemetry/sdk/resources/ResourceTest.java index 24d7a88239a..892b4577685 100644 --- a/sdk/common/src/test/java/io/opentelemetry/sdk/resources/ResourceTest.java +++ b/sdk/common/src/test/java/io/opentelemetry/sdk/resources/ResourceTest.java @@ -148,10 +148,10 @@ void create_NullEmptyArray() { assertThat(resource.getAttributes().size()).isEqualTo(8); // Null arrays should be dropped - attributes.put(stringArrayKey("NullArrayStringKey"), null); - attributes.put(longArrayKey("NullArrayLongKey"), null); - attributes.put(doubleArrayKey("NullArrayDoubleKey"), null); - attributes.put(booleanArrayKey("NullArrayBooleanKey"), null); + attributes.put(stringArrayKey("NullArrayStringKey"), (String[]) null); + attributes.put(longArrayKey("NullArrayLongKey"), (Long[]) null); + attributes.put(doubleArrayKey("NullArrayDoubleKey"), (Double[]) null); + attributes.put(booleanArrayKey("NullArrayBooleanKey"), (Boolean[]) null); resource = Resource.create(attributes.build()); assertThat(resource.getAttributes()).isNotNull(); diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java index 68c80b85b16..e0f68950cd7 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java @@ -535,10 +535,10 @@ void setAllAttributes() { .put(doubleArrayKey("ArrayDoubleKey"), Arrays.asList(0.1, 2.3, 4.5, 6.7, 8.9)) .put(booleanArrayKey("ArrayBooleanKey"), Arrays.asList(true, false, false, true)) // These should be dropped - .put(stringArrayKey("NullArrayStringKey"), null) - .put(longArrayKey("NullArrayLongKey"), null) - .put(doubleArrayKey("NullArrayDoubleKey"), null) - .put(booleanArrayKey("NullArrayBooleanKey"), null) + .put(stringArrayKey("NullArrayStringKey"), (String[]) null) + .put(longArrayKey("NullArrayLongKey"), (Long[]) null) + .put(doubleArrayKey("NullArrayDoubleKey"), (Double[]) null) + .put(booleanArrayKey("NullArrayBooleanKey"), (Boolean[]) null) // These should be maintained .put(longArrayKey("ArrayWithNullLongKey"), Arrays.asList(new Long[] {null})) .put(stringArrayKey("ArrayWithNullStringKey"), Arrays.asList(new String[] {null}))