Clarify that AttributesBuilder.put allows nulls (#7271)
This commit is contained in:
		
							parent
							
								
									14e2fefe7a
								
							
						
					
					
						commit
						d13f04d084
					
				|  | @ -9,6 +9,7 @@ import java.util.ArrayList; | |||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| import java.util.function.Predicate; | ||||
| import javax.annotation.Nullable; | ||||
| 
 | ||||
| class ArrayBackedAttributesBuilder implements AttributesBuilder { | ||||
|   private final List<Object> data; | ||||
|  | @ -37,7 +38,7 @@ class ArrayBackedAttributesBuilder implements AttributesBuilder { | |||
|   } | ||||
| 
 | ||||
|   @Override | ||||
|   public <T> AttributesBuilder put(AttributeKey<T> key, T value) { | ||||
|   public <T> AttributesBuilder put(AttributeKey<T> key, @Nullable T value) { | ||||
|     if (key == null || key.getKey().isEmpty() || value == null) { | ||||
|       return this; | ||||
|     } | ||||
|  |  | |||
|  | @ -18,6 +18,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; | |||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| import java.util.function.Predicate; | ||||
| import javax.annotation.Nullable; | ||||
| 
 | ||||
| /** A builder of {@link Attributes} supporting an arbitrary number of key-value pairs. */ | ||||
| public interface AttributesBuilder { | ||||
|  | @ -35,18 +36,22 @@ public interface AttributesBuilder { | |||
|   // version. | ||||
|   <T> AttributesBuilder put(AttributeKey<Long> key, int value); | ||||
| 
 | ||||
|   /** Puts a {@link AttributeKey} with associated value into this. */ | ||||
|   <T> AttributesBuilder put(AttributeKey<T> key, T value); | ||||
|   /** | ||||
|    * Puts an {@link AttributeKey} with an associated value into this if the value is non-null. | ||||
|    * Providing a null value does not remove or unset previously set values. | ||||
|    */ | ||||
|   <T> AttributesBuilder put(AttributeKey<T> key, @Nullable T value); | ||||
| 
 | ||||
|   /** | ||||
|    * Puts a String attribute into this. | ||||
|    * Puts a String attribute into this if the value is non-null. Providing a null value does not | ||||
|    * remove or unset previously set values. | ||||
|    * | ||||
|    * <p>Note: It is strongly recommended to use {@link #put(AttributeKey, Object)}, and pre-allocate | ||||
|    * your keys, if possible. | ||||
|    * | ||||
|    * @return this Builder | ||||
|    */ | ||||
|   default AttributesBuilder put(String key, String value) { | ||||
|   default AttributesBuilder put(String key, @Nullable String value) { | ||||
|     return put(stringKey(key), value); | ||||
|   } | ||||
| 
 | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ import io.opentelemetry.api.common.Value; | |||
| import io.opentelemetry.context.Context; | ||||
| import java.time.Instant; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import javax.annotation.Nullable; | ||||
| 
 | ||||
| class DefaultLogger implements Logger { | ||||
| 
 | ||||
|  | @ -77,7 +78,7 @@ class DefaultLogger implements Logger { | |||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public <T> LogRecordBuilder setAttribute(AttributeKey<T> key, T value) { | ||||
|     public <T> LogRecordBuilder setAttribute(AttributeKey<T> key, @Nullable T value) { | ||||
|       return this; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ import io.opentelemetry.api.common.Value; | |||
| import io.opentelemetry.context.Context; | ||||
| import java.time.Instant; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import javax.annotation.Nullable; | ||||
| 
 | ||||
| /** | ||||
|  * Used to construct and emit log records from a {@link Logger}. | ||||
|  | @ -107,16 +108,20 @@ public interface LogRecordBuilder { | |||
|    * Sets an attribute on the {@code LogRecord}. If the {@code LogRecord} previously contained a | ||||
|    * mapping for the key, the old value is replaced by the specified value. | ||||
|    * | ||||
|    * <p>Note: Providing a null value is a no-op and will not remove previously set values. | ||||
|    * | ||||
|    * @param key the key for this attribute. | ||||
|    * @param value the value for this attribute. | ||||
|    * @return this. | ||||
|    */ | ||||
|   <T> LogRecordBuilder setAttribute(AttributeKey<T> key, T value); | ||||
|   <T> LogRecordBuilder setAttribute(AttributeKey<T> key, @Nullable T value); | ||||
| 
 | ||||
|   /** | ||||
|    * Sets a String attribute on the {@code LogRecord}. If the {@code LogRecord} previously contained | ||||
|    * a mapping for the key, the old value is replaced by the specified value. | ||||
|    * | ||||
|    * <p>Note: Providing a null value is a no-op and will not remove previously set values. | ||||
|    * | ||||
|    * <p>Note: It is strongly recommended to use {@link #setAttribute(AttributeKey, Object)}, and | ||||
|    * pre-allocate your keys, if possible. | ||||
|    * | ||||
|  | @ -125,7 +130,7 @@ public interface LogRecordBuilder { | |||
|    * @return this. | ||||
|    * @since 1.48.0 | ||||
|    */ | ||||
|   default LogRecordBuilder setAttribute(String key, String value) { | ||||
|   default LogRecordBuilder setAttribute(String key, @Nullable String value) { | ||||
|     return setAttribute(stringKey(key), value); | ||||
|   } | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ package io.opentelemetry.api.trace; | |||
| import io.opentelemetry.api.common.AttributeKey; | ||||
| import io.opentelemetry.api.common.Attributes; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import javax.annotation.Nullable; | ||||
| import javax.annotation.concurrent.Immutable; | ||||
| 
 | ||||
| /** | ||||
|  | @ -42,7 +43,7 @@ final class PropagatedSpan implements Span { | |||
|   } | ||||
| 
 | ||||
|   @Override | ||||
|   public Span setAttribute(String key, String value) { | ||||
|   public Span setAttribute(String key, @Nullable String value) { | ||||
|     return this; | ||||
|   } | ||||
| 
 | ||||
|  | @ -62,7 +63,7 @@ final class PropagatedSpan implements Span { | |||
|   } | ||||
| 
 | ||||
|   @Override | ||||
|   public <T> Span setAttribute(AttributeKey<T> key, T value) { | ||||
|   public <T> Span setAttribute(AttributeKey<T> key, @Nullable T value) { | ||||
|     return this; | ||||
|   } | ||||
| 
 | ||||
|  |  | |||
|  | @ -88,7 +88,9 @@ public interface Span extends ImplicitContextKeyed { | |||
|    * Sets an attribute to the {@code Span}. If the {@code Span} previously contained a mapping for | ||||
|    * the key, the old value is replaced by the specified value. | ||||
|    * | ||||
|    * <p>Empty String "" and null are valid attribute {@code value}, but not valid keys. | ||||
|    * <p>Empty String "" and null are valid attribute {@code value}s, but not valid keys. | ||||
|    * | ||||
|    * <p>Note: Providing a null value is a no-op and will not remove previously set values. | ||||
|    * | ||||
|    * <p>Note: It is strongly recommended to use {@link #setAttribute(AttributeKey, Object)}, and | ||||
|    * pre-allocate your keys, if possible. | ||||
|  | @ -97,7 +99,7 @@ public interface Span extends ImplicitContextKeyed { | |||
|    * @param value the value for this attribute. | ||||
|    * @return this. | ||||
|    */ | ||||
|   default Span setAttribute(String key, String value) { | ||||
|   default Span setAttribute(String key, @Nullable String value) { | ||||
|     return setAttribute(AttributeKey.stringKey(key), value); | ||||
|   } | ||||
| 
 | ||||
|  | @ -150,13 +152,13 @@ public interface Span extends ImplicitContextKeyed { | |||
|    * Sets an attribute to the {@code Span}. If the {@code Span} previously contained a mapping for | ||||
|    * the key, the old value is replaced by the specified value. | ||||
|    * | ||||
|    * <p>Note: the behavior of null values is undefined, and hence strongly discouraged. | ||||
|    * <p>Note: Providing a null value is a no-op. | ||||
|    * | ||||
|    * @param key the key for this attribute. | ||||
|    * @param value the value for this attribute. | ||||
|    * @return this. | ||||
|    */ | ||||
|   <T> Span setAttribute(AttributeKey<T> key, T value); | ||||
|   <T> Span setAttribute(AttributeKey<T> key, @Nullable T value); | ||||
| 
 | ||||
|   /** | ||||
|    * Sets an attribute to the {@code Span}. If the {@code Span} previously contained a mapping for | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ import java.util.LinkedHashMap; | |||
| import java.util.Map; | ||||
| import java.util.NoSuchElementException; | ||||
| import java.util.concurrent.atomic.AtomicBoolean; | ||||
| import javax.annotation.Nullable; | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| /** Unit tests for {@link Attributes}s. */ | ||||
|  | @ -565,7 +566,7 @@ class AttributesTest { | |||
|           } | ||||
| 
 | ||||
|           @Override | ||||
|           public <T> AttributesBuilder put(AttributeKey<T> key, T value) { | ||||
|           public <T> AttributesBuilder put(AttributeKey<T> key, @Nullable T value) { | ||||
|             return null; | ||||
|           } | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,6 +13,7 @@ import io.opentelemetry.api.logs.Severity; | |||
| import io.opentelemetry.context.Context; | ||||
| import java.time.Instant; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import javax.annotation.Nullable; | ||||
| 
 | ||||
| class ExtendedDefaultLogger implements ExtendedLogger { | ||||
| 
 | ||||
|  | @ -51,7 +52,7 @@ class ExtendedDefaultLogger implements ExtendedLogger { | |||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public <T> ExtendedLogRecordBuilder setAttribute(AttributeKey<T> key, T value) { | ||||
|     public <T> ExtendedLogRecordBuilder setAttribute(AttributeKey<T> key, @Nullable T value) { | ||||
|       return this; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -15,6 +15,7 @@ import io.opentelemetry.api.logs.Severity; | |||
| import io.opentelemetry.context.Context; | ||||
| import java.time.Instant; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import javax.annotation.Nullable; | ||||
| 
 | ||||
| /** Extended {@link LogRecordBuilder} with experimental APIs. */ | ||||
| public interface ExtendedLogRecordBuilder extends LogRecordBuilder { | ||||
|  | @ -110,7 +111,7 @@ public interface ExtendedLogRecordBuilder extends LogRecordBuilder { | |||
|    * attribute APIs. | ||||
|    */ | ||||
|   @Override | ||||
|   <T> ExtendedLogRecordBuilder setAttribute(AttributeKey<T> key, T value); | ||||
|   <T> ExtendedLogRecordBuilder setAttribute(AttributeKey<T> key, @Nullable T value); | ||||
| 
 | ||||
|   /** | ||||
|    * Set an attribute. | ||||
|  |  | |||
|  | @ -15,6 +15,7 @@ import io.opentelemetry.context.Context; | |||
| import io.opentelemetry.context.Scope; | ||||
| import java.time.Instant; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import javax.annotation.Nullable; | ||||
| 
 | ||||
| /** | ||||
|  * Delegates <i>all</i> {@link Span} methods to some underlying Span via {@link | ||||
|  | @ -52,12 +53,12 @@ interface DelegatingSpan extends Span { | |||
|   } | ||||
| 
 | ||||
|   @Override | ||||
|   default <T> Span setAttribute(AttributeKey<T> key, T value) { | ||||
|   default <T> Span setAttribute(AttributeKey<T> key, @Nullable T value) { | ||||
|     return getDelegate().setAttribute(key, value); | ||||
|   } | ||||
| 
 | ||||
|   @Override | ||||
|   default Span setAttribute(String key, String value) { | ||||
|   default Span setAttribute(String key, @Nullable String value) { | ||||
|     return getDelegate().setAttribute(key, value); | ||||
|   } | ||||
| 
 | ||||
|  |  | |||
|  | @ -37,7 +37,7 @@ import io.opentelemetry.api.trace.StatusCode; | |||
| import java.util.EnumSet; | ||||
| import java.util.Map; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import javax.annotation.Nonnull; | ||||
| import javax.annotation.Nullable; | ||||
| 
 | ||||
| final class OpenTelemetryNoRecordEventsSpanImpl extends Span | ||||
|     implements io.opentelemetry.api.trace.Span { | ||||
|  | @ -110,7 +110,7 @@ final class OpenTelemetryNoRecordEventsSpanImpl extends Span | |||
|   } | ||||
| 
 | ||||
|   @Override | ||||
|   public io.opentelemetry.api.trace.Span setAttribute(String key, @Nonnull String value) { | ||||
|   public io.opentelemetry.api.trace.Span setAttribute(String key, @Nullable String value) { | ||||
|     return this; | ||||
|   } | ||||
| 
 | ||||
|  | @ -130,7 +130,7 @@ final class OpenTelemetryNoRecordEventsSpanImpl extends Span | |||
|   } | ||||
| 
 | ||||
|   @Override | ||||
|   public <T> io.opentelemetry.api.trace.Span setAttribute(AttributeKey<T> key, @Nonnull T value) { | ||||
|   public <T> io.opentelemetry.api.trace.Span setAttribute(AttributeKey<T> key, @Nullable T value) { | ||||
|     return this; | ||||
|   } | ||||
| 
 | ||||
|  |  | |||
|  | @ -117,7 +117,7 @@ final class ExtendedSdkLogRecordBuilder extends SdkLogRecordBuilder | |||
|   } | ||||
| 
 | ||||
|   @Override | ||||
|   public <T> ExtendedSdkLogRecordBuilder setAttribute(AttributeKey<T> key, T value) { | ||||
|   public <T> ExtendedSdkLogRecordBuilder setAttribute(AttributeKey<T> key, @Nullable T value) { | ||||
|     if (key == null || key.getKey().isEmpty() || value == null) { | ||||
|       return this; | ||||
|     } | ||||
|  |  | |||
|  | @ -95,7 +95,7 @@ class SdkLogRecordBuilder implements LogRecordBuilder { | |||
|   } | ||||
| 
 | ||||
|   @Override | ||||
|   public <T> SdkLogRecordBuilder setAttribute(AttributeKey<T> key, T value) { | ||||
|   public <T> SdkLogRecordBuilder setAttribute(AttributeKey<T> key, @Nullable T value) { | ||||
|     if (key == null || key.getKey().isEmpty() || value == null) { | ||||
|       return this; | ||||
|     } | ||||
|  |  | |||
|  | @ -314,7 +314,7 @@ final class SdkSpan implements ReadWriteSpan { | |||
|   } | ||||
| 
 | ||||
|   @Override | ||||
|   public <T> ReadWriteSpan setAttribute(AttributeKey<T> key, T value) { | ||||
|   public <T> ReadWriteSpan setAttribute(AttributeKey<T> key, @Nullable T value) { | ||||
|     if (key == null || key.getKey().isEmpty() || value == null) { | ||||
|       return this; | ||||
|     } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue