From a0239e5e5315c0cabcd976e214e70bbf513a8038 Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Wed, 22 Apr 2026 20:20:46 -0500 Subject: [PATCH 01/10] first pass --- .../api/GlobalOpenTelemetry.java | 3 + .../opentelemetry/api/logs/DefaultLogger.java | 21 +++ .../api/logs/DefaultLoggerProvider.java | 5 + .../api/metrics/DefaultMeter.java | 138 +++++++++++++++--- .../api/metrics/DefaultMeterProvider.java | 4 + .../api/trace/DefaultTracer.java | 36 +++++ .../api/trace/DefaultTracerBuilder.java | 4 + .../api/trace/DefaultTracerProvider.java | 3 + .../api/trace/PropagatedSpan.java | 70 ++++++++- .../opentelemetry/common/ComponentLoader.java | 4 + .../common/ServiceLoaderComponentLoader.java | 2 + .../context/ArrayBasedContext.java | 5 + .../io/opentelemetry/context/Context.java | 9 ++ .../opentelemetry/context/ContextStorage.java | 2 + .../propagation/TextMapPropagator.java | 3 + docs/knowledge/api-design.md | 4 +- .../OtlpJsonLoggingLogRecordExporter.java | 2 + .../otlp/OtlpJsonLoggingMetricExporter.java | 4 + .../otlp/OtlpJsonLoggingSpanExporter.java | 2 + .../logging/LoggingMetricExporter.java | 4 + .../exporter/logging/LoggingSpanExporter.java | 2 + .../logging/SystemOutLogRecordExporter.java | 2 + .../OtlpHttpLogRecordExporterBuilder.java | 5 + .../OtlpHttpMetricExporterBuilder.java | 5 + .../trace/OtlpHttpSpanExporterBuilder.java | 5 + .../OtlpGrpcLogRecordExporterBuilder.java | 5 + .../OtlpGrpcMetricExporterBuilder.java | 5 + .../trace/OtlpGrpcSpanExporterBuilder.java | 5 + .../OtlpGrpcProfilesExporterBuilder.java | 5 + .../prometheus/PrometheusHttpServer.java | 2 + .../prometheus/PrometheusMetricReader.java | 2 + .../exporter/zipkin/ZipkinSpanExporter.java | 2 + .../propagation/B3ConfigurablePropagator.java | 2 + .../B3MultiConfigurablePropagator.java | 2 + .../trace/propagation/B3Propagator.java | 17 +++ .../JaegerConfigurablePropagator.java | 2 + .../OtTraceConfigurablePropagator.java | 2 + .../OpenCensusMetricProducer.java | 2 + .../opentracingshim/OpenTracingShim.java | 5 + .../opentracingshim/SpanShim.java | 17 +++ .../opentracingshim/TracerShim.java | 5 + .../sdk/autoconfigure/spi/Ordered.java | 3 + .../EnvironmentResourceProvider.java | 2 + .../autoconfigure/ResourceConfiguration.java | 2 + .../DeclarativeConfiguration.java | 7 + .../DeclarativeConfigurationBuilder.java | 9 ++ .../metric/viewconfig/ViewConfig.java | 2 + .../incubator/trace/OnStartSpanProcessor.java | 2 + .../trace/samplers/AlwaysRecordSampler.java | 2 + .../ComposableRuleBasedSamplerBuilder.java | 3 + .../trace/samplers/ComposableSampler.java | 4 + .../trace/samplers/CompositeSampler.java | 2 + .../jaeger/sampler/JaegerRemoteSampler.java | 7 + .../sampler/JaegerRemoteSamplerProvider.java | 2 + .../sdk/common/CompletableResultCode.java | 3 + .../sdk/common/InstrumentationScopeInfo.java | 1 + .../InstrumentationScopeInfoBuilder.java | 4 + .../sdk/common/export/ProxyOptions.java | 3 + .../sdk/logs/SdkLogRecordBuilder.java | 25 ++++ .../io/opentelemetry/sdk/logs/SdkLogger.java | 9 ++ .../logs/export/BatchLogRecordProcessor.java | 5 +- .../logs/export/SimpleLogRecordProcessor.java | 1 + .../logs/internal/LoggerConfigBuilder.java | 2 + .../sdk/metrics/Aggregation.java | 3 + .../sdk/metrics/SdkMeterProviderBuilder.java | 5 + .../sdk/metrics/ViewBuilder.java | 1 + .../metrics/export/PeriodicMetricReader.java | 4 + .../sdk/profiles/DictionaryTable.java | 2 + .../ProfilesDictionaryCompositor.java | 8 + .../profiles/SampleCompositionBuilder.java | 2 + .../sdk/profiles/SampleCompositionKey.java | 1 + .../sdk/trace/export/BatchSpanProcessor.java | 4 +- .../sdk/trace/export/SimpleSpanProcessor.java | 4 +- .../samplers/ParentBasedSamplerBuilder.java | 5 + 74 files changed, 537 insertions(+), 26 deletions(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java b/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java index 5069eb06e9a..19a68c8bee0 100644 --- a/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java +++ b/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java @@ -169,6 +169,7 @@ public static OpenTelemetry get() { * OpenTelemetrySdk.builder().buildAndRegisterGlobal()} instead of calling this method directly. */ public static void set(OpenTelemetry openTelemetry) { + Objects.requireNonNull(openTelemetry, "openTelemetry"); synchronized (mutex) { if (globalOpenTelemetry != null) { throw new IllegalStateException( @@ -192,6 +193,7 @@ public static void set(OpenTelemetry openTelemetry) { * @since 1.52.0 */ public static void set(Supplier supplier) { + Objects.requireNonNull(supplier, "supplier"); synchronized (mutex) { OpenTelemetry openTelemetry = supplier.get(); set(openTelemetry); @@ -386,6 +388,7 @@ public ContextPropagators getPropagators() { @Override public TracerBuilder tracerBuilder(String instrumentationScopeName) { + Objects.requireNonNull(instrumentationScopeName, "instrumentationScopeName"); return delegate.tracerBuilder(instrumentationScopeName); } } diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java index 38c9e6efa98..d0c5d5c6c4c 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java @@ -7,6 +7,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Value; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import java.time.Instant; import java.util.concurrent.TimeUnit; @@ -59,26 +60,46 @@ public LogRecordBuilder setObservedTimestamp(Instant instant) { @Override public LogRecordBuilder setContext(Context context) { + if (context == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setContext", "context"); + return this; + } return this; } @Override public LogRecordBuilder setSeverity(Severity severity) { + if (severity == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setSeverity", "severity"); + return this; + } return this; } @Override public LogRecordBuilder setSeverityText(String severityText) { + if (severityText == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setSeverityText", "severityText"); + return this; + } return this; } @Override public LogRecordBuilder setBody(String body) { + if (body == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setBody", "body"); + return this; + } return this; } @Override public LogRecordBuilder setBody(Value body) { + if (body == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setBody", "body"); + return this; + } return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLoggerProvider.java b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLoggerProvider.java index c92eb3d8b49..03f45c818bc 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLoggerProvider.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLoggerProvider.java @@ -5,6 +5,8 @@ package io.opentelemetry.api.logs; +import java.util.Objects; + class DefaultLoggerProvider implements LoggerProvider { private static final LoggerProvider INSTANCE = new DefaultLoggerProvider(); @@ -18,6 +20,7 @@ static LoggerProvider getInstance() { @Override public LoggerBuilder loggerBuilder(String instrumentationScopeName) { + Objects.requireNonNull(instrumentationScopeName, "instrumentationScopeName"); return NOOP_BUILDER; } @@ -25,11 +28,13 @@ private static class NoopLoggerBuilder implements LoggerBuilder { @Override public LoggerBuilder setSchemaUrl(String schemaUrl) { + Objects.requireNonNull(schemaUrl, "schemaUrl"); return this; } @Override public LoggerBuilder setInstrumentationVersion(String instrumentationVersion) { + Objects.requireNonNull(instrumentationVersion, "instrumentationVersion"); return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java index 5caa7d829c2..3638882d27e 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java @@ -6,7 +6,9 @@ package io.opentelemetry.api.metrics; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; +import java.util.Objects; import java.util.function.Consumer; import javax.annotation.concurrent.ThreadSafe; @@ -38,21 +40,25 @@ static Meter getInstance() { @Override public LongCounterBuilder counterBuilder(String name) { + Objects.requireNonNull(name, "name"); return NOOP_LONG_COUNTER_BUILDER; } @Override public LongUpDownCounterBuilder upDownCounterBuilder(String name) { + Objects.requireNonNull(name, "name"); return NOOP_LONG_UP_DOWN_COUNTER_BUILDER; } @Override public DoubleHistogramBuilder histogramBuilder(String name) { + Objects.requireNonNull(name, "name"); return NOOP_DOUBLE_HISTOGRAM_BUILDER; } @Override public DoubleGaugeBuilder gaugeBuilder(String name) { + Objects.requireNonNull(name, "name"); return NOOP_DOUBLE_GAUGE_BUILDER; } @@ -73,10 +79,21 @@ public boolean isEnabled() { } @Override - public void add(long value, Attributes attributes, Context context) {} + public void add(long value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongCounter.class, "add", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(LongCounter.class, "add", "context"); + } + } @Override - public void add(long value, Attributes attributes) {} + public void add(long value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongCounter.class, "add", "attributes"); + } + } @Override public void add(long value) {} @@ -89,10 +106,21 @@ public boolean isEnabled() { } @Override - public void add(double value, Attributes attributes, Context context) {} + public void add(double value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleCounter.class, "add", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleCounter.class, "add", "context"); + } + } @Override - public void add(double value, Attributes attributes) {} + public void add(double value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleCounter.class, "add", "attributes"); + } + } @Override public void add(double value) {} @@ -175,10 +203,21 @@ public boolean isEnabled() { } @Override - public void add(long value, Attributes attributes, Context context) {} + public void add(long value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongUpDownCounter.class, "add", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(LongUpDownCounter.class, "add", "context"); + } + } @Override - public void add(long value, Attributes attributes) {} + public void add(long value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongUpDownCounter.class, "add", "attributes"); + } + } @Override public void add(long value) {} @@ -191,10 +230,21 @@ public boolean isEnabled() { } @Override - public void add(double value, Attributes attributes, Context context) {} + public void add(double value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleUpDownCounter.class, "add", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleUpDownCounter.class, "add", "context"); + } + } @Override - public void add(double value, Attributes attributes) {} + public void add(double value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleUpDownCounter.class, "add", "attributes"); + } + } @Override public void add(double value) {} @@ -279,10 +329,21 @@ public boolean isEnabled() { } @Override - public void record(double value, Attributes attributes, Context context) {} + public void record(double value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleHistogram.class, "record", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleHistogram.class, "record", "context"); + } + } @Override - public void record(double value, Attributes attributes) {} + public void record(double value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleHistogram.class, "record", "attributes"); + } + } @Override public void record(double value) {} @@ -295,10 +356,21 @@ public boolean isEnabled() { } @Override - public void record(long value, Attributes attributes, Context context) {} + public void record(long value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongHistogram.class, "record", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(LongHistogram.class, "record", "context"); + } + } @Override - public void record(long value, Attributes attributes) {} + public void record(long value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongHistogram.class, "record", "attributes"); + } + } @Override public void record(long value) {} @@ -396,10 +468,21 @@ public boolean isEnabled() { public void set(double value) {} @Override - public void set(double value, Attributes attributes) {} + public void set(double value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleGauge.class, "set", "attributes"); + } + } @Override - public void set(double value, Attributes attributes, Context context) {} + public void set(double value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleGauge.class, "set", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleGauge.class, "set", "context"); + } + } } private static class NoopLongGaugeBuilder implements LongGaugeBuilder { @@ -442,10 +525,21 @@ public boolean isEnabled() { public void set(long value) {} @Override - public void set(long value, Attributes attributes) {} + public void set(long value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongGauge.class, "set", "attributes"); + } + } @Override - public void set(long value, Attributes attributes, Context context) {} + public void set(long value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongGauge.class, "set", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(LongGauge.class, "set", "context"); + } + } } private static class NoopObservableDoubleMeasurement implements ObservableDoubleMeasurement { @@ -453,7 +547,11 @@ private static class NoopObservableDoubleMeasurement implements ObservableDouble public void record(double value) {} @Override - public void record(double value, Attributes attributes) {} + public void record(double value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(ObservableDoubleMeasurement.class, "record", "attributes"); + } + } } private static class NoopObservableLongMeasurement implements ObservableLongMeasurement { @@ -461,6 +559,10 @@ private static class NoopObservableLongMeasurement implements ObservableLongMeas public void record(long value) {} @Override - public void record(long value, Attributes attributes) {} + public void record(long value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(ObservableLongMeasurement.class, "record", "attributes"); + } + } } } diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeterProvider.java b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeterProvider.java index 3ea78ec2d34..aa2e107c070 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeterProvider.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeterProvider.java @@ -6,11 +6,13 @@ package io.opentelemetry.api.metrics; import io.opentelemetry.api.internal.IncubatingUtil; +import java.util.Objects; /** A {@link MeterProvider} that does nothing. */ class DefaultMeterProvider implements MeterProvider { @Override public MeterBuilder meterBuilder(String instrumentationScopeName) { + Objects.requireNonNull(instrumentationScopeName, "instrumentationScopeName"); return BUILDER_INSTANCE; } @@ -30,11 +32,13 @@ private static class NoopMeterBuilder implements MeterBuilder { @Override public MeterBuilder setSchemaUrl(String schemaUrl) { + Objects.requireNonNull(schemaUrl, "schemaUrl"); return this; } @Override public MeterBuilder setInstrumentationVersion(String instrumentationScopeVersion) { + Objects.requireNonNull(instrumentationScopeVersion, "instrumentationScopeVersion"); return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracer.java b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracer.java index 6b9cff09e7b..1f2a70c5faf 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracer.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracer.java @@ -30,6 +30,9 @@ public boolean isEnabled() { @Override public SpanBuilder spanBuilder(String spanName) { + if (spanName == null) { + ApiUsageLogger.logNullParam(Tracer.class, "spanBuilder", "spanName"); + } return NoopSpanBuilder.create(); } @@ -70,51 +73,84 @@ public NoopSpanBuilder setNoParent() { @Override public NoopSpanBuilder addLink(SpanContext spanContext) { + if (spanContext == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "addLink", "spanContext"); + } return this; } @Override public NoopSpanBuilder addLink(SpanContext spanContext, Attributes attributes) { + if (spanContext == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "addLink", "spanContext"); + } + if (attributes == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "addLink", "attributes"); + } return this; } @Override public NoopSpanBuilder setAttribute(String key, @Nullable String value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAttribute", "key"); + } return this; } @Override public NoopSpanBuilder setAttribute(String key, long value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAttribute", "key"); + } return this; } @Override public NoopSpanBuilder setAttribute(String key, double value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAttribute", "key"); + } return this; } @Override public NoopSpanBuilder setAttribute(String key, boolean value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAttribute", "key"); + } return this; } @Override public NoopSpanBuilder setAttribute(AttributeKey key, @Nullable T value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAttribute", "key"); + } return this; } @Override public NoopSpanBuilder setAllAttributes(Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAllAttributes", "attributes"); + } return this; } @Override public NoopSpanBuilder setSpanKind(SpanKind spanKind) { + if (spanKind == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setSpanKind", "spanKind"); + } return this; } @Override public NoopSpanBuilder setStartTimestamp(long startTimestamp, TimeUnit unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setStartTimestamp", "unit"); + } return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerBuilder.java b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerBuilder.java index 543d9a8cf95..c0c4d07600d 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerBuilder.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerBuilder.java @@ -5,6 +5,8 @@ package io.opentelemetry.api.trace; +import java.util.Objects; + class DefaultTracerBuilder implements TracerBuilder { private static final DefaultTracerBuilder INSTANCE = new DefaultTracerBuilder(); @@ -14,11 +16,13 @@ static TracerBuilder getInstance() { @Override public TracerBuilder setSchemaUrl(String schemaUrl) { + Objects.requireNonNull(schemaUrl, "schemaUrl"); return this; } @Override public TracerBuilder setInstrumentationVersion(String instrumentationScopeVersion) { + Objects.requireNonNull(instrumentationScopeVersion, "instrumentationScopeVersion"); return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java index 9bef6cf9928..0d9a26feed4 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java @@ -6,6 +6,7 @@ package io.opentelemetry.api.trace; import io.opentelemetry.api.internal.IncubatingUtil; +import java.util.Objects; import javax.annotation.concurrent.ThreadSafe; @ThreadSafe @@ -22,11 +23,13 @@ static TracerProvider getInstance() { @Override public Tracer get(String instrumentationScopeName) { + Objects.requireNonNull(instrumentationScopeName, "instrumentationScopeName"); return DefaultTracer.getInstance(); } @Override public Tracer get(String instrumentationScopeName, String instrumentationScopeVersion) { + Objects.requireNonNull(instrumentationScopeName, "instrumentationScopeName"); return DefaultTracer.getInstance(); } diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/PropagatedSpan.java b/api/all/src/main/java/io/opentelemetry/api/trace/PropagatedSpan.java index 88396280043..b7b659b1d77 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/PropagatedSpan.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/PropagatedSpan.java @@ -7,6 +7,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.common.ApiUsageLogger; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @@ -44,76 +45,139 @@ private PropagatedSpan(SpanContext spanContext) { @Override public Span setAttribute(String key, @Nullable String value) { + if (key == null) { + ApiUsageLogger.logNullParam(Span.class, "setAttribute", "key"); + } return this; } @Override public Span setAttribute(String key, long value) { + if (key == null) { + ApiUsageLogger.logNullParam(Span.class, "setAttribute", "key"); + } return this; } @Override public Span setAttribute(String key, double value) { + if (key == null) { + ApiUsageLogger.logNullParam(Span.class, "setAttribute", "key"); + } return this; } @Override public Span setAttribute(String key, boolean value) { + if (key == null) { + ApiUsageLogger.logNullParam(Span.class, "setAttribute", "key"); + } return this; } @Override public Span setAttribute(AttributeKey key, @Nullable T value) { + if (key == null) { + ApiUsageLogger.logNullParam(Span.class, "setAttribute", "key"); + } return this; } @Override public Span setAllAttributes(Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(Span.class, "setAllAttributes", "attributes"); + } return this; } @Override public Span addEvent(String name) { + if (name == null) { + ApiUsageLogger.logNullParam(Span.class, "addEvent", "name"); + } return this; } @Override public Span addEvent(String name, long timestamp, TimeUnit unit) { + if (name == null) { + ApiUsageLogger.logNullParam(Span.class, "addEvent", "name"); + } + if (unit == null) { + ApiUsageLogger.logNullParam(Span.class, "addEvent", "unit"); + } return this; } @Override public Span addEvent(String name, Attributes attributes) { + if (name == null) { + ApiUsageLogger.logNullParam(Span.class, "addEvent", "name"); + } + if (attributes == null) { + ApiUsageLogger.logNullParam(Span.class, "addEvent", "attributes"); + } return this; } @Override public Span addEvent(String name, Attributes attributes, long timestamp, TimeUnit unit) { + if (name == null) { + ApiUsageLogger.logNullParam(Span.class, "addEvent", "name"); + } + if (attributes == null) { + ApiUsageLogger.logNullParam(Span.class, "addEvent", "attributes"); + } + if (unit == null) { + ApiUsageLogger.logNullParam(Span.class, "addEvent", "unit"); + } return this; } @Override public Span setStatus(StatusCode statusCode) { + if (statusCode == null) { + ApiUsageLogger.logNullParam(Span.class, "setStatus", "statusCode"); + } return this; } @Override public Span setStatus(StatusCode statusCode, String description) { + if (statusCode == null) { + ApiUsageLogger.logNullParam(Span.class, "setStatus", "statusCode"); + } + if (description == null) { + ApiUsageLogger.logNullParam(Span.class, "setStatus", "description"); + } return this; } @Override public Span recordException(Throwable exception) { + if (exception == null) { + ApiUsageLogger.logNullParam(Span.class, "recordException", "exception"); + } return this; } @Override public Span recordException(Throwable exception, Attributes additionalAttributes) { + if (exception == null) { + ApiUsageLogger.logNullParam(Span.class, "recordException", "exception"); + } + if (additionalAttributes == null) { + ApiUsageLogger.logNullParam(Span.class, "recordException", "additionalAttributes"); + } return this; } @Override public Span updateName(String name) { + if (name == null) { + ApiUsageLogger.logNullParam(Span.class, "updateName", "name"); + } return this; } @@ -121,7 +185,11 @@ public Span updateName(String name) { public void end() {} @Override - public void end(long timestamp, TimeUnit unit) {} + public void end(long timestamp, TimeUnit unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(Span.class, "end", "unit"); + } + } @Override public SpanContext getSpanContext() { diff --git a/common/src/main/java/io/opentelemetry/common/ComponentLoader.java b/common/src/main/java/io/opentelemetry/common/ComponentLoader.java index 33d835b9906..74e3ec9e5b8 100644 --- a/common/src/main/java/io/opentelemetry/common/ComponentLoader.java +++ b/common/src/main/java/io/opentelemetry/common/ComponentLoader.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.ServiceLoader; /** A loader for components that are discovered via SPI. */ @@ -26,6 +27,7 @@ public interface ComponentLoader { * ClassLoader)}. */ static ComponentLoader forClassLoader(ClassLoader classLoader) { + Objects.requireNonNull(classLoader, "classLoader"); return new ServiceLoaderComponentLoader(classLoader); } @@ -36,6 +38,8 @@ static ComponentLoader forClassLoader(ClassLoader classLoader) { * @since 1.61.0 */ static List loadList(ComponentLoader componentLoader, Class spiClass) { + Objects.requireNonNull(componentLoader, "componentLoader"); + Objects.requireNonNull(spiClass, "spiClass"); List result = new ArrayList<>(); componentLoader.load(spiClass).forEach(result::add); return Collections.unmodifiableList(result); diff --git a/common/src/main/java/io/opentelemetry/common/ServiceLoaderComponentLoader.java b/common/src/main/java/io/opentelemetry/common/ServiceLoaderComponentLoader.java index 5f2d0c58cd8..07f7bfa0530 100644 --- a/common/src/main/java/io/opentelemetry/common/ServiceLoaderComponentLoader.java +++ b/common/src/main/java/io/opentelemetry/common/ServiceLoaderComponentLoader.java @@ -5,6 +5,7 @@ package io.opentelemetry.common; +import java.util.Objects; import java.util.ServiceLoader; class ServiceLoaderComponentLoader implements ComponentLoader { @@ -17,6 +18,7 @@ class ServiceLoaderComponentLoader implements ComponentLoader { @Override public Iterable load(Class spiClass) { + Objects.requireNonNull(spiClass, "spiClass"); return ServiceLoader.load(spiClass, classLoader); } diff --git a/context/src/main/java/io/opentelemetry/context/ArrayBasedContext.java b/context/src/main/java/io/opentelemetry/context/ArrayBasedContext.java index ba3f22559eb..a377c4a7d0d 100644 --- a/context/src/main/java/io/opentelemetry/context/ArrayBasedContext.java +++ b/context/src/main/java/io/opentelemetry/context/ArrayBasedContext.java @@ -22,6 +22,7 @@ package io.opentelemetry.context; +import io.opentelemetry.common.ApiUsageLogger; import java.util.Arrays; import javax.annotation.Nullable; @@ -66,6 +67,10 @@ public V get(ContextKey key) { @Override public Context with(ContextKey key, V value) { + if (key == null) { + ApiUsageLogger.logNullParam(Context.class, "with", "key"); + return this; + } for (int i = 0; i < entries.length; i += 2) { if (entries[i] == key) { if (entries[i + 1] == value) { diff --git a/context/src/main/java/io/opentelemetry/context/Context.java b/context/src/main/java/io/opentelemetry/context/Context.java index 4dc7fd6e60a..ac8dbbc4367 100644 --- a/context/src/main/java/io/opentelemetry/context/Context.java +++ b/context/src/main/java/io/opentelemetry/context/Context.java @@ -23,6 +23,8 @@ package io.opentelemetry.context; import com.google.errorprone.annotations.MustBeClosed; +import io.opentelemetry.common.ApiUsageLogger; +import java.util.Objects; import java.util.concurrent.Callable; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; @@ -118,6 +120,7 @@ static Context root() { * @since 1.1.0 */ static Executor taskWrapping(Executor executor) { + Objects.requireNonNull(executor, "executor"); return command -> executor.execute(Context.current().wrap(command)); } @@ -136,6 +139,7 @@ static Executor taskWrapping(Executor executor) { * @since 1.1.0 */ static ExecutorService taskWrapping(ExecutorService executorService) { + Objects.requireNonNull(executorService, "executorService"); if (executorService instanceof CurrentContextExecutorService) { return executorService; } @@ -161,6 +165,7 @@ static ExecutorService taskWrapping(ExecutorService executorService) { * @since 1.43.0 */ static ScheduledExecutorService taskWrapping(ScheduledExecutorService executorService) { + Objects.requireNonNull(executorService, "executorService"); if (executorService instanceof CurrentContextScheduledExecutorService) { return executorService; } @@ -200,6 +205,10 @@ static ScheduledExecutorService taskWrapping(ScheduledExecutorService executorSe /** Returns a new {@link Context} with the given {@link ImplicitContextKeyed} set. */ default Context with(ImplicitContextKeyed value) { + if (value == null) { + ApiUsageLogger.logNullParam(Context.class, "with", "value"); + return this; + } return value.storeInContext(this); } diff --git a/context/src/main/java/io/opentelemetry/context/ContextStorage.java b/context/src/main/java/io/opentelemetry/context/ContextStorage.java index 6a62f4be959..7c05b57bf9d 100644 --- a/context/src/main/java/io/opentelemetry/context/ContextStorage.java +++ b/context/src/main/java/io/opentelemetry/context/ContextStorage.java @@ -22,6 +22,7 @@ package io.opentelemetry.context; +import java.util.Objects; import java.util.function.Function; import javax.annotation.Nullable; @@ -86,6 +87,7 @@ static ContextStorage defaultStorage() { * main class. */ static void addWrapper(Function wrapper) { + Objects.requireNonNull(wrapper, "wrapper"); ContextStorageWrappers.addWrapper(wrapper); } diff --git a/context/src/main/java/io/opentelemetry/context/propagation/TextMapPropagator.java b/context/src/main/java/io/opentelemetry/context/propagation/TextMapPropagator.java index 8505d9a49a5..25351bd17dd 100644 --- a/context/src/main/java/io/opentelemetry/context/propagation/TextMapPropagator.java +++ b/context/src/main/java/io/opentelemetry/context/propagation/TextMapPropagator.java @@ -10,6 +10,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Objects; import javax.annotation.Nullable; import javax.annotation.concurrent.ThreadSafe; @@ -51,6 +52,7 @@ public interface TextMapPropagator { * TextMapPropagator#extract()} for registered trace propagators is undefined. */ static TextMapPropagator composite(TextMapPropagator... propagators) { + Objects.requireNonNull(propagators, "propagators"); return composite(Arrays.asList(propagators)); } @@ -62,6 +64,7 @@ static TextMapPropagator composite(TextMapPropagator... propagators) { * TextMapPropagator#extract()} for registered trace propagators is undefined. */ static TextMapPropagator composite(Iterable propagators) { + Objects.requireNonNull(propagators, "propagators"); List propagatorsList = new ArrayList<>(); for (TextMapPropagator propagator : propagators) { propagatorsList.add(propagator); diff --git a/docs/knowledge/api-design.md b/docs/knowledge/api-design.md index ffe168089c2..c0a3e69aef3 100644 --- a/docs/knowledge/api-design.md +++ b/docs/knowledge/api-design.md @@ -80,7 +80,7 @@ unambiguously. ### Runtime / instrumentation-time boundaries (Span methods, metric recordings, log builders) Do **not** throw. Log the violation via -[`ApiUsageLogger`](../../common/src/main/java/io/opentelemetry/common/ApiUsageLogger.java) — +[`ApiUsageLogger`](../../common/src/main/java/io/opentelemetry/common/impl/ApiUsageLogger.java) — which logs at `FINEST` with a stack trace so the offending call site is visible — then degrade gracefully (return `this`, an empty/noop result, or substitute a safe default such as `Attributes.empty()` or `Context.current()`): @@ -97,7 +97,7 @@ public Span addEvent(String name) { ``` The class and method arguments identify the problem immediately in the log message without -requiring stack trace analysis. Use `ApiUsageLogger.log(...)` directly when the message is not +requiring stack trace analysis. Use `ApiUsageLogger.logUsageIssue(...)` directly when the message is not simply "X is null" (e.g. `"spanIdBytes is null or too short"`). `FINEST` is silent by default, so there is no production noise. To investigate misuse, enable the logger named `io.opentelemetry.usage` at `FINEST` in development, or periodically in staging/production. Check each argument once, at the first diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java index 0c00cca908e..adbdeb8274b 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java @@ -5,6 +5,7 @@ package io.opentelemetry.exporter.logging.otlp; +import java.util.Objects; import io.opentelemetry.exporter.logging.otlp.internal.logs.OtlpStdoutLogRecordExporter; import io.opentelemetry.exporter.logging.otlp.internal.logs.OtlpStdoutLogRecordExporterBuilder; import io.opentelemetry.sdk.common.CompletableResultCode; @@ -39,6 +40,7 @@ public static LogRecordExporter create() { @Override public CompletableResultCode export(Collection logs) { + Objects.requireNonNull(logs, "logs"); return delegate.export(logs); } diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java index b42ef4acab7..e8506427f98 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java @@ -5,6 +5,7 @@ package io.opentelemetry.exporter.logging.otlp; +import java.util.Objects; import io.opentelemetry.exporter.logging.otlp.internal.metrics.OtlpStdoutMetricExporter; import io.opentelemetry.exporter.logging.otlp.internal.metrics.OtlpStdoutMetricExporterBuilder; import io.opentelemetry.sdk.common.CompletableResultCode; @@ -13,6 +14,7 @@ import io.opentelemetry.sdk.metrics.data.MetricData; import io.opentelemetry.sdk.metrics.export.MetricExporter; import java.util.Collection; +import java.util.Objects; import java.util.logging.Logger; /** @@ -41,6 +43,7 @@ public static MetricExporter create() { * aggregationTemporality}. */ public static MetricExporter create(AggregationTemporality aggregationTemporality) { + Objects.requireNonNull(aggregationTemporality, "aggregationTemporality"); OtlpStdoutMetricExporter delegate = new OtlpStdoutMetricExporterBuilder(logger).setWrapperJsonObject(false).build(); return new OtlpJsonLoggingMetricExporter(delegate, aggregationTemporality); @@ -54,6 +57,7 @@ public static MetricExporter create(AggregationTemporality aggregationTemporalit @Override public CompletableResultCode export(Collection logs) { + Objects.requireNonNull(logs, "logs"); return delegate.export(logs); } diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java index 63901351326..345ab7b4024 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java @@ -5,6 +5,7 @@ package io.opentelemetry.exporter.logging.otlp; +import java.util.Objects; import io.opentelemetry.exporter.logging.otlp.internal.traces.OtlpStdoutSpanExporter; import io.opentelemetry.exporter.logging.otlp.internal.traces.OtlpStdoutSpanExporterBuilder; import io.opentelemetry.sdk.common.CompletableResultCode; @@ -37,6 +38,7 @@ public static SpanExporter create() { @Override public CompletableResultCode export(Collection logs) { + Objects.requireNonNull(logs, "logs"); return delegate.export(logs); } diff --git a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingMetricExporter.java b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingMetricExporter.java index 8b7d837330f..afb7e2e72ad 100644 --- a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingMetricExporter.java +++ b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingMetricExporter.java @@ -5,12 +5,14 @@ package io.opentelemetry.exporter.logging; +import java.util.Objects; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.metrics.InstrumentType; import io.opentelemetry.sdk.metrics.data.AggregationTemporality; import io.opentelemetry.sdk.metrics.data.MetricData; import io.opentelemetry.sdk.metrics.export.MetricExporter; import java.util.Collection; +import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Handler; import java.util.logging.Level; @@ -32,6 +34,7 @@ public static LoggingMetricExporter create() { /** Returns a new {@link LoggingMetricExporter} with the given {@code aggregationTemporality}. */ public static LoggingMetricExporter create(AggregationTemporality aggregationTemporality) { + Objects.requireNonNull(aggregationTemporality, "aggregationTemporality"); return new LoggingMetricExporter(aggregationTemporality); } @@ -66,6 +69,7 @@ public AggregationTemporality getAggregationTemporality(InstrumentType instrumen @Override public CompletableResultCode export(Collection metrics) { + Objects.requireNonNull(metrics, "metrics"); if (isShutdown.get()) { return CompletableResultCode.ofFailure(); } diff --git a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingSpanExporter.java b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingSpanExporter.java index 58c828635c0..86f2cd05b9c 100644 --- a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingSpanExporter.java +++ b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingSpanExporter.java @@ -5,6 +5,7 @@ package io.opentelemetry.exporter.logging; +import java.util.Objects; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.trace.data.SpanData; @@ -36,6 +37,7 @@ public LoggingSpanExporter() {} @Override public CompletableResultCode export(Collection spans) { + Objects.requireNonNull(spans, "spans"); if (isShutdown.get()) { return CompletableResultCode.ofFailure(); } diff --git a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java index 3848bf0225a..690fc4d0d74 100644 --- a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java +++ b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java @@ -8,6 +8,7 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS; import io.opentelemetry.api.common.Value; +import java.util.Objects; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogRecordData; @@ -42,6 +43,7 @@ private SystemOutLogRecordExporter() {} @Override public CompletableResultCode export(Collection logs) { + Objects.requireNonNull(logs, "logs"); if (isShutdown.get()) { return CompletableResultCode.ofFailure(); } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java index 8684a7680bc..8e57ddc88e0 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java @@ -124,6 +124,8 @@ public OtlpHttpLogRecordExporterBuilder setCompression(String compressionMethod) * name or a one from {@link #setHeaders(Supplier)}, the values from both are included. */ public OtlpHttpLogRecordExporterBuilder addHeader(String key, String value) { + requireNonNull(key, "key"); + requireNonNull(value, "value"); delegate.addConstantHeaders(key, value); return this; } @@ -135,6 +137,7 @@ public OtlpHttpLogRecordExporterBuilder addHeader(String key, String value) { * @since 1.33.0 */ public OtlpHttpLogRecordExporterBuilder setHeaders(Supplier> headerSupplier) { + requireNonNull(headerSupplier, "headerSupplier"); delegate.setHeadersSupplier(headerSupplier); return this; } @@ -165,6 +168,8 @@ public OtlpHttpLogRecordExporterBuilder setClientTls( */ public OtlpHttpLogRecordExporterBuilder setSslContext( SSLContext sslContext, X509TrustManager trustManager) { + requireNonNull(sslContext, "sslContext"); + requireNonNull(trustManager, "trustManager"); delegate.setSslContext(sslContext, trustManager); return this; } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java index 1e531d36e3d..cb2f3d38dc7 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java @@ -144,6 +144,8 @@ public OtlpHttpMetricExporterBuilder setCompression(String compressionMethod) { * name or a one from {@link #setHeaders(Supplier)}, the values from both are included. */ public OtlpHttpMetricExporterBuilder addHeader(String key, String value) { + requireNonNull(key, "key"); + requireNonNull(value, "value"); delegate.addConstantHeaders(key, value); return this; } @@ -155,6 +157,7 @@ public OtlpHttpMetricExporterBuilder addHeader(String key, String value) { * @since 1.33.0 */ public OtlpHttpMetricExporterBuilder setHeaders(Supplier> headerSupplier) { + requireNonNull(headerSupplier, "headerSupplier"); delegate.setHeadersSupplier(headerSupplier); return this; } @@ -186,6 +189,8 @@ public OtlpHttpMetricExporterBuilder setClientTls(byte[] privateKeyPem, byte[] c */ public OtlpHttpMetricExporterBuilder setSslContext( SSLContext sslContext, X509TrustManager trustManager) { + requireNonNull(sslContext, "sslContext"); + requireNonNull(trustManager, "trustManager"); delegate.setSslContext(sslContext, trustManager); return this; } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java index 6480929299b..80c278229b1 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java @@ -124,6 +124,8 @@ public OtlpHttpSpanExporterBuilder setCompression(String compressionMethod) { * name or a one from {@link #setHeaders(Supplier)}, the values from both are included. */ public OtlpHttpSpanExporterBuilder addHeader(String key, String value) { + requireNonNull(key, "key"); + requireNonNull(value, "value"); delegate.addConstantHeaders(key, value); return this; } @@ -135,6 +137,7 @@ public OtlpHttpSpanExporterBuilder addHeader(String key, String value) { * @since 1.33.0 */ public OtlpHttpSpanExporterBuilder setHeaders(Supplier> headerSupplier) { + requireNonNull(headerSupplier, "headerSupplier"); delegate.setHeadersSupplier(headerSupplier); return this; } @@ -166,6 +169,8 @@ public OtlpHttpSpanExporterBuilder setClientTls(byte[] privateKeyPem, byte[] cer */ public OtlpHttpSpanExporterBuilder setSslContext( SSLContext sslContext, X509TrustManager trustManager) { + requireNonNull(sslContext, "sslContext"); + requireNonNull(trustManager, "trustManager"); delegate.setSslContext(sslContext, trustManager); return this; } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java index c115c05b91d..f5c61f054dd 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java @@ -174,6 +174,8 @@ public OtlpGrpcLogRecordExporterBuilder setClientTls( */ public OtlpGrpcLogRecordExporterBuilder setSslContext( SSLContext sslContext, X509TrustManager trustManager) { + requireNonNull(sslContext, "sslContext"); + requireNonNull(trustManager, "trustManager"); delegate.setSslContext(sslContext, trustManager); return this; } @@ -189,6 +191,8 @@ public OtlpGrpcLogRecordExporterBuilder setSslContext( * @return this builder's instance */ public OtlpGrpcLogRecordExporterBuilder addHeader(String key, String value) { + requireNonNull(key, "key"); + requireNonNull(value, "value"); delegate.addConstantHeader(key, value); return this; } @@ -201,6 +205,7 @@ public OtlpGrpcLogRecordExporterBuilder addHeader(String key, String value) { * @since 1.33.0 */ public OtlpGrpcLogRecordExporterBuilder setHeaders(Supplier> headerSupplier) { + requireNonNull(headerSupplier, "headerSupplier"); delegate.setHeadersSupplier(headerSupplier); return this; } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java index 6b72ec3f36d..e8debab7bf6 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java @@ -194,6 +194,8 @@ public OtlpGrpcMetricExporterBuilder setClientTls(byte[] privateKeyPem, byte[] c */ public OtlpGrpcMetricExporterBuilder setSslContext( SSLContext sslContext, X509TrustManager trustManager) { + requireNonNull(sslContext, "sslContext"); + requireNonNull(trustManager, "trustManager"); delegate.setSslContext(sslContext, trustManager); return this; } @@ -209,6 +211,8 @@ public OtlpGrpcMetricExporterBuilder setSslContext( * @return this builder's instance */ public OtlpGrpcMetricExporterBuilder addHeader(String key, String value) { + requireNonNull(key, "key"); + requireNonNull(value, "value"); delegate.addConstantHeader(key, value); return this; } @@ -221,6 +225,7 @@ public OtlpGrpcMetricExporterBuilder addHeader(String key, String value) { * @since 1.33.0 */ public OtlpGrpcMetricExporterBuilder setHeaders(Supplier> headerSupplier) { + requireNonNull(headerSupplier, "headerSupplier"); delegate.setHeadersSupplier(headerSupplier); return this; } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java index d1180b404ef..398c544945d 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java @@ -172,6 +172,8 @@ public OtlpGrpcSpanExporterBuilder setClientTls(byte[] privateKeyPem, byte[] cer */ public OtlpGrpcSpanExporterBuilder setSslContext( SSLContext sslContext, X509TrustManager trustManager) { + requireNonNull(sslContext, "sslContext"); + requireNonNull(trustManager, "trustManager"); delegate.setSslContext(sslContext, trustManager); return this; } @@ -187,6 +189,8 @@ public OtlpGrpcSpanExporterBuilder setSslContext( * @return this builder's instance */ public OtlpGrpcSpanExporterBuilder addHeader(String key, String value) { + requireNonNull(key, "key"); + requireNonNull(value, "value"); delegate.addConstantHeader(key, value); return this; } @@ -199,6 +203,7 @@ public OtlpGrpcSpanExporterBuilder addHeader(String key, String value) { * @since 1.33.0 */ public OtlpGrpcSpanExporterBuilder setHeaders(Supplier> headerSupplier) { + requireNonNull(headerSupplier, "headerSupplier"); delegate.setHeadersSupplier(headerSupplier); return this; } diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java index 8f8fa9d1be7..9e76b765ac0 100644 --- a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java +++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java @@ -161,6 +161,8 @@ public OtlpGrpcProfilesExporterBuilder setClientTls(byte[] privateKeyPem, byte[] */ public OtlpGrpcProfilesExporterBuilder setSslContext( SSLContext sslContext, X509TrustManager trustManager) { + requireNonNull(sslContext, "sslContext"); + requireNonNull(trustManager, "trustManager"); delegate.setSslContext(sslContext, trustManager); return this; } @@ -174,6 +176,8 @@ public OtlpGrpcProfilesExporterBuilder setSslContext( * @return this builder's instance */ public OtlpGrpcProfilesExporterBuilder addHeader(String key, String value) { + requireNonNull(key, "key"); + requireNonNull(value, "value"); delegate.addConstantHeader(key, value); return this; } @@ -183,6 +187,7 @@ public OtlpGrpcProfilesExporterBuilder addHeader(String key, String value) { * from {@link #addHeader(String, String)}, the values from both are included. */ public OtlpGrpcProfilesExporterBuilder setHeaders(Supplier> headerSupplier) { + requireNonNull(headerSupplier, "headerSupplier"); delegate.setHeadersSupplier(headerSupplier); return this; } diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java index 2caed4f385c..1a17fa7d80e 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.io.UncheckedIOException; import java.net.InetSocketAddress; +import java.util.Objects; import java.util.StringJoiner; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; @@ -127,6 +128,7 @@ public MemoryMode getMemoryMode() { @Override public void register(CollectionRegistration registration) { + Objects.requireNonNull(registration, "registration"); prometheusMetricReader.register(registration); } diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java index 821a7d37cb6..564539ebcc9 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java @@ -12,6 +12,7 @@ import io.opentelemetry.sdk.metrics.export.MetricReader; import io.prometheus.metrics.model.registry.MultiCollector; import io.prometheus.metrics.model.snapshots.MetricSnapshots; +import java.util.Objects; import java.util.StringJoiner; import java.util.function.Predicate; import javax.annotation.Nullable; @@ -86,6 +87,7 @@ public AggregationTemporality getAggregationTemporality(InstrumentType instrumen @Override public void register(CollectionRegistration registration) { + Objects.requireNonNull(registration, "registration"); this.collectionRegistration = registration; } diff --git a/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporter.java b/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporter.java index 34405dbbf14..8ff67638da7 100644 --- a/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporter.java +++ b/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporter.java @@ -7,6 +7,7 @@ import io.opentelemetry.api.internal.InstrumentationUtil; import io.opentelemetry.api.metrics.MeterProvider; +import java.util.Objects; import io.opentelemetry.exporter.internal.metrics.ExporterInstrumentation; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InternalTelemetryVersion; @@ -83,6 +84,7 @@ public final class ZipkinSpanExporter implements SpanExporter { @Override public CompletableResultCode export(Collection spanDataList) { + Objects.requireNonNull(spanDataList, "spanDataList"); if (isShutdown.get()) { return CompletableResultCode.ofFailure(); } diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java index ba6f9b02448..988ebaf0842 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java @@ -8,6 +8,7 @@ import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; +import java.util.Objects; /** * A {@link ConfigurablePropagatorProvider} which allows enabling the {@linkplain @@ -16,6 +17,7 @@ public final class B3ConfigurablePropagator implements ConfigurablePropagatorProvider { @Override public TextMapPropagator getPropagator(ConfigProperties config) { + Objects.requireNonNull(config, "config"); return B3Propagator.injectingSingleHeader(); } diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java index b42b62c1f14..51c197d7989 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java @@ -8,6 +8,7 @@ import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; +import java.util.Objects; /** * A {@link ConfigurablePropagatorProvider} which allows enabling the {@linkplain @@ -17,6 +18,7 @@ public final class B3MultiConfigurablePropagator implements ConfigurablePropagatorProvider { @Override public TextMapPropagator getPropagator(ConfigProperties config) { + Objects.requireNonNull(config, "config"); return B3Propagator.injectingMultiHeaders(); } diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3Propagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3Propagator.java index 301a9c6c83c..7b892d16684 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3Propagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3Propagator.java @@ -5,6 +5,7 @@ package io.opentelemetry.extension.trace.propagation; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.ContextKey; import io.opentelemetry.context.propagation.TextMapGetter; @@ -106,11 +107,27 @@ public Collection fields() { @Override public void inject(Context context, @Nullable C carrier, TextMapSetter setter) { + if (context == null) { + ApiUsageLogger.logNullParam(B3Propagator.class, "inject", "context"); + return; + } + if (setter == null) { + ApiUsageLogger.logNullParam(B3Propagator.class, "inject", "setter"); + return; + } b3PropagatorInjector.inject(context, carrier, setter); } @Override public Context extract(Context context, @Nullable C carrier, TextMapGetter getter) { + if (context == null) { + ApiUsageLogger.logNullParam(B3Propagator.class, "extract", "context"); + return Context.root(); + } + if (getter == null) { + ApiUsageLogger.logNullParam(B3Propagator.class, "extract", "getter"); + return context; + } Optional ctx = singleHeaderExtractor.extract(context, carrier, getter); if (ctx.isPresent()) { return ctx.get(); diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java index 46999cb81d1..3df9c775acf 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java @@ -8,6 +8,7 @@ import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; +import java.util.Objects; /** * A {@link ConfigurablePropagatorProvider} which allows enabling the {@link JaegerPropagator} with @@ -17,6 +18,7 @@ public final class JaegerConfigurablePropagator implements ConfigurablePropagatorProvider { @Override public TextMapPropagator getPropagator(ConfigProperties config) { + Objects.requireNonNull(config, "config"); return JaegerPropagator.getInstance(); } diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java index e80697bd8ff..7910beb3479 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java @@ -8,6 +8,7 @@ import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; +import java.util.Objects; /** * A {@link ConfigurablePropagatorProvider} which allows enabling the {@link OtTracePropagator} with @@ -17,6 +18,7 @@ public final class OtTraceConfigurablePropagator implements ConfigurablePropagatorProvider { @Override public TextMapPropagator getPropagator(ConfigProperties config) { + Objects.requireNonNull(config, "config"); return OtTracePropagator.getInstance(); } diff --git a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenCensusMetricProducer.java b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenCensusMetricProducer.java index 121c61360f1..ac0a3c4551f 100644 --- a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenCensusMetricProducer.java +++ b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenCensusMetricProducer.java @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; /** * {@link MetricProducer} for OpenCensus metrics, which allows {@link MetricReader}s to read from @@ -39,6 +40,7 @@ public static MetricProducer create() { @Override public Collection produce(Resource resource) { + Objects.requireNonNull(resource, "resource"); List result = new ArrayList<>(); openCensusMetricStorage .getAllMetricProducer() diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/OpenTracingShim.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/OpenTracingShim.java index 8fcf5aec207..48ab4ab57d4 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/OpenTracingShim.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/OpenTracingShim.java @@ -9,6 +9,7 @@ import io.opentelemetry.api.trace.TracerProvider; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentracing.Tracer; +import java.util.Objects; /** * Factory for creating an OpenTracing {@link io.opentracing.Tracer} that is implemented using the @@ -28,6 +29,7 @@ private OpenTracingShim() {} * @return a {@code io.opentracing.Tracer}. */ public static Tracer createTracerShim(OpenTelemetry openTelemetry) { + Objects.requireNonNull(openTelemetry, "openTelemetry"); TextMapPropagator propagator = openTelemetry.getPropagators().getTextMapPropagator(); return createTracerShim(openTelemetry.getTracerProvider(), propagator, propagator); } @@ -47,6 +49,9 @@ public static Tracer createTracerShim( TracerProvider provider, TextMapPropagator textMapPropagator, TextMapPropagator httpPropagator) { + Objects.requireNonNull(provider, "provider"); + Objects.requireNonNull(textMapPropagator, "textMapPropagator"); + Objects.requireNonNull(httpPropagator, "httpPropagator"); return new TracerShim(provider, textMapPropagator, httpPropagator); } } diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java index a5524cd1645..f6cd26b25a0 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java @@ -15,6 +15,7 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.ContextKey; import io.opentelemetry.context.ImplicitContextKeyed; @@ -88,6 +89,10 @@ public SpanContext context() { @Override public Span setTag(String key, String value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanShim.class, "setTag", "key"); + return this; + } if (Tags.ERROR.getKey().equals(key)) { StatusCode canonicalCode = Boolean.parseBoolean(value) ? StatusCode.ERROR : StatusCode.OK; span.setStatus(canonicalCode); @@ -100,6 +105,10 @@ public Span setTag(String key, String value) { @Override public Span setTag(String key, boolean value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanShim.class, "setTag", "key"); + return this; + } if (Tags.ERROR.getKey().equals(key)) { StatusCode canonicalCode = value ? StatusCode.ERROR : StatusCode.OK; span.setStatus(canonicalCode); @@ -141,12 +150,20 @@ public Span setTag(Tag tag, T value) { @Override public Span log(Map fields) { + if (fields == null) { + ApiUsageLogger.logNullParam(SpanShim.class, "log", "fields"); + return this; + } logInternal(-1, fields); return this; } @Override public Span log(long timestampMicroseconds, Map fields) { + if (fields == null) { + ApiUsageLogger.logNullParam(SpanShim.class, "log", "fields"); + return this; + } logInternal(timestampMicroseconds, fields); return this; } diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java index 8f3ba836328..3d3ca72edc5 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java @@ -6,6 +6,7 @@ package io.opentelemetry.opentracingshim; import io.opentelemetry.api.trace.TracerProvider; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.opentracing.shim.internal.OtelVersion; import io.opentracing.Scope; @@ -70,6 +71,10 @@ public Scope activateSpan(Span span) { @Override public SpanBuilder buildSpan(String operationName) { + if (operationName == null) { + ApiUsageLogger.logNullParam(TracerShim.class, "buildSpan", "operationName"); + return new NoopSpanBuilderShim(operationName); + } if (isShutdown.get()) { return new NoopSpanBuilderShim(operationName); } diff --git a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/Ordered.java b/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/Ordered.java index 9477ebbd104..369bd514c8e 100644 --- a/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/Ordered.java +++ b/sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/Ordered.java @@ -10,6 +10,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Objects; /** * Interface to be extended by SPIs that need to guarantee ordering during loading. @@ -34,6 +35,8 @@ default int order() { */ static List loadOrderedList( ComponentLoader componentLoader, Class spiClass) { + Objects.requireNonNull(componentLoader, "componentLoader"); + Objects.requireNonNull(spiClass, "spiClass"); List result = new ArrayList<>(ComponentLoader.loadList(componentLoader, spiClass)); result.sort(Comparator.comparing(Ordered::order)); return Collections.unmodifiableList(result); diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/EnvironmentResourceProvider.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/EnvironmentResourceProvider.java index 231967c833c..8510a113136 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/EnvironmentResourceProvider.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/EnvironmentResourceProvider.java @@ -8,6 +8,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; import io.opentelemetry.sdk.resources.Resource; +import java.util.Objects; /** * {@link ResourceProvider} for automatically configuring {@link @@ -18,6 +19,7 @@ public final class EnvironmentResourceProvider implements ResourceProvider { @Override public Resource createResource(ConfigProperties config) { + Objects.requireNonNull(config, "config"); return ResourceConfiguration.createEnvironmentResource(config); } diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/ResourceConfiguration.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/ResourceConfiguration.java index 9f1a1c4d03c..08e3f4054a9 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/ResourceConfiguration.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/ResourceConfiguration.java @@ -16,6 +16,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.function.BiFunction; @@ -54,6 +55,7 @@ public static Resource createEnvironmentResource() { * @return the resource. */ public static Resource createEnvironmentResource(ConfigProperties config) { + Objects.requireNonNull(config, "config"); return EnvironmentResource.createEnvironmentResource(config); } diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfiguration.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfiguration.java index 9628f238176..297c8d6e79a 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfiguration.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfiguration.java @@ -124,6 +124,7 @@ private DeclarativeConfiguration() {} * @throws DeclarativeConfigException if unable to parse or interpret */ public static DeclarativeConfigResult parseAndCreate(InputStream inputStream) { + Objects.requireNonNull(inputStream, "inputStream"); OpenTelemetryConfigurationModel configurationModel = parse(inputStream); return create(configurationModel); } @@ -137,6 +138,7 @@ public static DeclarativeConfigResult parseAndCreate(InputStream inputStream) { * @throws DeclarativeConfigException if unable to interpret */ public static DeclarativeConfigResult create(OpenTelemetryConfigurationModel configurationModel) { + Objects.requireNonNull(configurationModel, "configurationModel"); return create(configurationModel, DEFAULT_COMPONENT_LOADER); } @@ -152,6 +154,8 @@ public static DeclarativeConfigResult create(OpenTelemetryConfigurationModel con */ public static DeclarativeConfigResult create( OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) { + Objects.requireNonNull(configurationModel, "configurationModel"); + Objects.requireNonNull(componentLoader, "componentLoader"); return create(configurationModel, new DeclarativeConfigContext(componentLoader)); } @@ -185,6 +189,7 @@ private static DeclarativeConfigResult create( * @throws DeclarativeConfigException if unable to parse */ public static OpenTelemetryConfigurationModel parse(InputStream configuration) { + Objects.requireNonNull(configuration, "configuration"); try { return parse(configuration, System.getenv(), System.getProperties()); } catch (RuntimeException e) { @@ -228,6 +233,7 @@ public static DeclarativeConfigProperties toConfigProperties(Object model) { * @return a generic {@link DeclarativeConfigProperties} representation of the model */ public static DeclarativeConfigProperties toConfigProperties(InputStream configuration) { + Objects.requireNonNull(configuration, "configuration"); Object yamlObj = loadYaml(configuration, System.getenv(), System.getProperties()); return toConfigProperties(yamlObj, DEFAULT_COMPONENT_LOADER); } @@ -253,6 +259,7 @@ static DeclarativeConfigProperties toConfigProperties( // TODO(jack-berg): add create methods for all SDK extension components supported by // ComponentProvider public static Sampler createSampler(DeclarativeConfigProperties genericSamplerModel) { + Objects.requireNonNull(genericSamplerModel, "genericSamplerModel"); YamlDeclarativeConfigProperties yamlDeclarativeConfigProperties = requireYamlDeclarativeConfigProperties(genericSamplerModel); SamplerModel samplerModel = diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigurationBuilder.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigurationBuilder.java index 8c6b85890df..ef5f985c492 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigurationBuilder.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigurationBuilder.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.function.BiFunction; import java.util.function.Function; import java.util.logging.Level; @@ -34,24 +35,31 @@ public class DeclarativeConfigurationBuilder implements DeclarativeConfiguration @Override public void addModelCustomizer( Function customizer) { + Objects.requireNonNull(customizer, "customizer"); modelCustomizer = mergeCustomizer(modelCustomizer, customizer); } @Override public void addSpanExporterCustomizer( Class exporterType, BiFunction customizer) { + Objects.requireNonNull(exporterType, "exporterType"); + Objects.requireNonNull(customizer, "customizer"); spanExporterCustomizers.add(new Customizer<>(exporterType, customizer)); } @Override public void addMetricExporterCustomizer( Class exporterType, BiFunction customizer) { + Objects.requireNonNull(exporterType, "exporterType"); + Objects.requireNonNull(customizer, "customizer"); metricExporterCustomizers.add(new Customizer<>(exporterType, customizer)); } @Override public void addLogRecordExporterCustomizer( Class exporterType, BiFunction customizer) { + Objects.requireNonNull(exporterType, "exporterType"); + Objects.requireNonNull(customizer, "customizer"); logRecordExporterCustomizers.add(new Customizer<>(exporterType, customizer)); } @@ -78,6 +86,7 @@ private static Function mergeCustomizer( /** Customize the configuration model. */ public OpenTelemetryConfigurationModel customizeModel( OpenTelemetryConfigurationModel configurationModel) { + Objects.requireNonNull(configurationModel, "configurationModel"); return modelCustomizer.apply(configurationModel); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfig.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfig.java index ec18190df9d..cf2012e4126 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfig.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfig.java @@ -94,6 +94,8 @@ private ViewConfig() {} */ public static void registerViews( SdkMeterProviderBuilder meterProviderBuilder, InputStream inputStream) { + requireNonNull(meterProviderBuilder, "meterProviderBuilder"); + requireNonNull(inputStream, "inputStream"); List viewConfigSpecs = loadViewConfig(inputStream); for (ViewConfigSpecification viewConfigSpec : viewConfigSpecs) { diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnStartSpanProcessor.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnStartSpanProcessor.java index 1ef96c2e883..6fda1933576 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnStartSpanProcessor.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnStartSpanProcessor.java @@ -9,6 +9,7 @@ import io.opentelemetry.sdk.trace.ReadWriteSpan; import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.sdk.trace.SpanProcessor; +import java.util.Objects; /** A SpanProcessor that only handles onStart(). */ public final class OnStartSpanProcessor implements SpanProcessor { @@ -20,6 +21,7 @@ private OnStartSpanProcessor(OnStart onStart) { } public static SpanProcessor create(OnStart onStart) { + Objects.requireNonNull(onStart, "onStart"); return new OnStartSpanProcessor(onStart); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/AlwaysRecordSampler.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/AlwaysRecordSampler.java index a9f6905bc78..9ee7c96f8de 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/AlwaysRecordSampler.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/AlwaysRecordSampler.java @@ -18,6 +18,7 @@ import io.opentelemetry.sdk.trace.samplers.SamplingDecision; import io.opentelemetry.sdk.trace.samplers.SamplingResult; import java.util.List; +import java.util.Objects; import javax.annotation.concurrent.Immutable; /** @@ -41,6 +42,7 @@ public final class AlwaysRecordSampler implements Sampler { private final Sampler rootSampler; public static AlwaysRecordSampler create(Sampler rootSampler) { + Objects.requireNonNull(rootSampler, "rootSampler"); return new AlwaysRecordSampler(rootSampler); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableRuleBasedSamplerBuilder.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableRuleBasedSamplerBuilder.java index 1dd70d246bf..1b9310f20b6 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableRuleBasedSamplerBuilder.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableRuleBasedSamplerBuilder.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** A builder for a composable rule-based sampler. */ public final class ComposableRuleBasedSamplerBuilder { @@ -20,6 +21,8 @@ public final class ComposableRuleBasedSamplerBuilder { */ public ComposableRuleBasedSamplerBuilder add( SamplingPredicate predicate, ComposableSampler sampler) { + Objects.requireNonNull(predicate, "predicate"); + Objects.requireNonNull(sampler, "sampler"); rules.add(ImmutableSamplingRule.create(predicate, sampler)); return this; } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableSampler.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableSampler.java index ec8fb4c91ed..b03ee42692d 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableSampler.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableSampler.java @@ -10,6 +10,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import java.util.List; +import java.util.Objects; /** A sampler that can be composed to make a final sampling decision. */ public interface ComposableSampler { @@ -33,6 +34,7 @@ static ComposableSampler probability(double ratio) { * falls back to the given sampler if it is a root span. */ static ComposableSampler parentThreshold(ComposableSampler rootSampler) { + Objects.requireNonNull(rootSampler, "rootSampler"); return new ComposableParentThresholdSampler(rootSampler); } @@ -50,6 +52,8 @@ static ComposableRuleBasedSamplerBuilder ruleBasedBuilder() { * spans. */ static ComposableSampler annotating(ComposableSampler sampler, Attributes attributes) { + Objects.requireNonNull(sampler, "sampler"); + Objects.requireNonNull(attributes, "attributes"); return new ComposableAnnotatingSampler(sampler, attributes); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/CompositeSampler.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/CompositeSampler.java index 48b4f77ca68..945210c4de7 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/CompositeSampler.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/CompositeSampler.java @@ -22,6 +22,7 @@ import io.opentelemetry.sdk.trace.samplers.SamplingDecision; import io.opentelemetry.sdk.trace.samplers.SamplingResult; import java.util.List; +import java.util.Objects; /** * A sampler that uses a {@link ComposableSampler} to make its sampling decisions while handlign @@ -32,6 +33,7 @@ public final class CompositeSampler implements Sampler { * Returns a new composite {@link Sampler} that delegates to the given {@link ComposableSampler}. */ public static Sampler wrap(ComposableSampler delegate) { + Objects.requireNonNull(delegate, "delegate"); return new CompositeSampler(delegate); } diff --git a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java index 2e32f566273..2c5c78d5c8d 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java +++ b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java @@ -19,6 +19,7 @@ import java.io.Closeable; import java.io.IOException; import java.util.List; +import java.util.Objects; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -65,6 +66,12 @@ public SamplingResult shouldSample( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); return sampler.shouldSample(parentContext, traceId, name, spanKind, attributes, parentLinks); } diff --git a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerProvider.java b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerProvider.java index 422a3b3f4e4..1eaf85dfe5f 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerProvider.java +++ b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerProvider.java @@ -9,6 +9,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSamplerProvider; import io.opentelemetry.sdk.trace.samplers.Sampler; import java.util.Map; +import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; @@ -29,6 +30,7 @@ public class JaegerRemoteSamplerProvider implements ConfigurableSamplerProvider @Override public Sampler createSampler(ConfigProperties config) { + Objects.requireNonNull(config, "config"); JaegerRemoteSamplerBuilder builder = JaegerRemoteSampler.builder(); String serviceName = config.getString(SERVICE_NAME_PROPERTY); diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java b/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java index 600ec73a48e..357df35518a 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -51,6 +52,7 @@ public static CompletableResultCode ofExceptionalFailure(Throwable throwable) { * exceptionally with the first {@link Throwable} from {@code codes}. */ public static CompletableResultCode ofAll(Collection codes) { + Objects.requireNonNull(codes, "codes"); if (codes.isEmpty()) { return ofSuccess(); } @@ -179,6 +181,7 @@ public Throwable getFailureThrowable() { * @return this completable result so that it may be further composed */ public CompletableResultCode whenComplete(Runnable action) { + Objects.requireNonNull(action, "action"); boolean runNow = false; synchronized (lock) { if (succeeded != null) { diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationScopeInfo.java b/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationScopeInfo.java index 249840b05d6..00c96079ed7 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationScopeInfo.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationScopeInfo.java @@ -55,6 +55,7 @@ static InstrumentationScopeInfo create( * @since 1.18.0 */ public static InstrumentationScopeInfoBuilder builder(String name) { + requireNonNull(name, "name"); return new InstrumentationScopeInfoBuilder(name); } diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationScopeInfoBuilder.java b/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationScopeInfoBuilder.java index 15729b78cf7..1a5b69f9ff5 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationScopeInfoBuilder.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationScopeInfoBuilder.java @@ -6,6 +6,7 @@ package io.opentelemetry.sdk.common; import io.opentelemetry.api.common.Attributes; +import java.util.Objects; import javax.annotation.Nullable; /** @@ -26,18 +27,21 @@ public final class InstrumentationScopeInfoBuilder { /** Set the version. */ public InstrumentationScopeInfoBuilder setVersion(String version) { + Objects.requireNonNull(version, "version"); this.version = version; return this; } /** Set the schema URL. */ public InstrumentationScopeInfoBuilder setSchemaUrl(String schemaUrl) { + Objects.requireNonNull(schemaUrl, "schemaUrl"); this.schemaUrl = schemaUrl; return this; } /** Set the attributes. */ public InstrumentationScopeInfoBuilder setAttributes(Attributes attributes) { + Objects.requireNonNull(attributes, "attributes"); this.attributes = attributes; return this; } diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/common/export/ProxyOptions.java b/sdk/common/src/main/java/io/opentelemetry/sdk/common/export/ProxyOptions.java index 5e4ad463a92..43ea154c265 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/common/export/ProxyOptions.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/common/export/ProxyOptions.java @@ -13,6 +13,7 @@ import java.net.URI; import java.util.Collections; import java.util.List; +import java.util.Objects; /** * Configuration for proxy settings. @@ -28,6 +29,7 @@ private ProxyOptions(ProxySelector proxySelector) { /** Create proxy options with the {@code proxySelector}. */ public static ProxyOptions create(ProxySelector proxySelector) { + Objects.requireNonNull(proxySelector, "proxySelector"); return new ProxyOptions(proxySelector); } @@ -36,6 +38,7 @@ public static ProxyOptions create(ProxySelector proxySelector) { * proxy with the {@code socketAddress}. */ public static ProxyOptions create(InetSocketAddress socketAddress) { + Objects.requireNonNull(socketAddress, "socketAddress"); return new ProxyOptions(new SimpleProxySelector(new Proxy(Proxy.Type.HTTP, socketAddress))); } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java index a99165d33e5..f9aebaf9d28 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java @@ -10,6 +10,7 @@ import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.common.internal.AttributesMap; @@ -46,18 +47,30 @@ class SdkLogRecordBuilder implements LogRecordBuilder { @Override public SdkLogRecordBuilder setEventName(String eventName) { + if (eventName == null) { + ApiUsageLogger.logNullParam(SdkLogRecordBuilder.class, "setEventName", "eventName"); + return this; + } this.eventName = eventName; return this; } @Override public SdkLogRecordBuilder setTimestamp(long timestamp, TimeUnit unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(SdkLogRecordBuilder.class, "setTimestamp", "unit"); + return this; + } this.timestampEpochNanos = unit.toNanos(timestamp); return this; } @Override public SdkLogRecordBuilder setTimestamp(Instant instant) { + if (instant == null) { + ApiUsageLogger.logNullParam(SdkLogRecordBuilder.class, "setTimestamp", "instant"); + return this; + } this.timestampEpochNanos = TimeUnit.SECONDS.toNanos(instant.getEpochSecond()) + instant.getNano(); return this; @@ -65,12 +78,20 @@ public SdkLogRecordBuilder setTimestamp(Instant instant) { @Override public LogRecordBuilder setObservedTimestamp(long timestamp, TimeUnit unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(SdkLogRecordBuilder.class, "setObservedTimestamp", "unit"); + return this; + } this.observedTimestampEpochNanos = unit.toNanos(timestamp); return this; } @Override public LogRecordBuilder setObservedTimestamp(Instant instant) { + if (instant == null) { + ApiUsageLogger.logNullParam(SdkLogRecordBuilder.class, "setObservedTimestamp", "instant"); + return this; + } this.observedTimestampEpochNanos = TimeUnit.SECONDS.toNanos(instant.getEpochSecond()) + instant.getNano(); return this; @@ -84,6 +105,10 @@ public SdkLogRecordBuilder setContext(Context context) { @Override public SdkLogRecordBuilder setSeverity(Severity severity) { + if (severity == null) { + ApiUsageLogger.logNullParam(SdkLogRecordBuilder.class, "setSeverity", "severity"); + return this; + } this.severity = severity; return this; } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java index 20c74169d80..5e621f83dab 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.internal.LoggerConfig; @@ -61,6 +62,14 @@ static SdkLogger create( @Override public boolean isEnabled(Severity severity, Context context) { + if (severity == null) { + ApiUsageLogger.logNullParam(SdkLogger.class, "isEnabled", "severity"); + return false; + } + if (context == null) { + ApiUsageLogger.logNullParam(SdkLogger.class, "isEnabled", "context"); + return false; + } if (!loggerEnabled) { return false; } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java index 317f79f324d..d31825b52ee 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java @@ -6,6 +6,7 @@ package io.opentelemetry.sdk.logs.export; import io.opentelemetry.api.metrics.MeterProvider; +import java.util.Objects; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InternalTelemetryVersion; @@ -85,9 +86,7 @@ public static BatchLogRecordProcessorBuilder builder(LogRecordExporter logRecord @Override public void onEmit(Context context, ReadWriteLogRecord logRecord) { - if (logRecord == null) { - return; - } + Objects.requireNonNull(logRecord, "logRecord"); worker.addLog(logRecord); } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java index f3d44de8d4a..168320c3739 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java @@ -85,6 +85,7 @@ public static SimpleLogRecordProcessorBuilder builder(LogRecordExporter exporter @Override public void onEmit(Context context, ReadWriteLogRecord logRecord) { + requireNonNull(logRecord, "logRecord"); try { List logs = Collections.singletonList(logRecord.toLogRecordData()); CompletableResultCode result; diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/LoggerConfigBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/LoggerConfigBuilder.java index af77cce7c9c..e916ed7bfd7 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/LoggerConfigBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/LoggerConfigBuilder.java @@ -6,6 +6,7 @@ package io.opentelemetry.sdk.logs.internal; import io.opentelemetry.api.logs.Severity; +import java.util.Objects; /** * Builder for {@link LoggerConfig}. @@ -42,6 +43,7 @@ public LoggerConfigBuilder setEnabled(boolean enabled) { * @return this builder */ public LoggerConfigBuilder setMinimumSeverity(Severity minimumSeverity) { + Objects.requireNonNull(minimumSeverity, "minimumSeverity"); this.minimumSeverity = minimumSeverity; return this; } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/Aggregation.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/Aggregation.java index 2f64416973e..c6a49c7f778 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/Aggregation.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/Aggregation.java @@ -14,6 +14,7 @@ import io.opentelemetry.sdk.metrics.internal.view.LastValueAggregation; import io.opentelemetry.sdk.metrics.internal.view.SumAggregation; import java.util.List; +import java.util.Objects; /** * Configures how instrument measurements are combined into metrics. @@ -80,6 +81,7 @@ static Aggregation explicitBucketHistogram(List bucketBoundaries) { * @since 1.60.0 */ static Aggregation explicitBucketHistogram(ExplicitBucketHistogramOptions options) { + Objects.requireNonNull(options, "options"); List boundaries = options.getBucketBoundaries(); if (boundaries == null) { boundaries = ExplicitBucketHistogramUtils.DEFAULT_HISTOGRAM_BUCKET_BOUNDARIES; @@ -126,6 +128,7 @@ static Aggregation base2ExponentialBucketHistogram(int maxBuckets, int maxScale) * @since 1.60.0 */ static Aggregation base2ExponentialBucketHistogram(Base2ExponentialHistogramOptions options) { + Objects.requireNonNull(options, "options"); return Base2ExponentialHistogramAggregation.create( options.getMaxBuckets(), options.getMaxScale(), options.getRecordMinMax()); } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeterProviderBuilder.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeterProviderBuilder.java index 149d8c5b9c4..141131410b1 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeterProviderBuilder.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeterProviderBuilder.java @@ -87,6 +87,7 @@ public SdkMeterProviderBuilder addResource(Resource resource) { * @since 1.56.0 */ public SdkMeterProviderBuilder setExemplarFilter(ExemplarFilter filter) { + Objects.requireNonNull(filter, "filter"); this.exemplarFilter = ExemplarFilterInternal.asExemplarFilterInternal(filter); return this; } @@ -130,6 +131,7 @@ public SdkMeterProviderBuilder registerView(InstrumentSelector selector, View vi /** Registers a {@link MetricReader}. */ public SdkMeterProviderBuilder registerMetricReader(MetricReader reader) { + Objects.requireNonNull(reader, "reader"); metricReaders.put(reader, CardinalityLimitSelector.defaultCardinalityLimitSelector()); return this; } @@ -144,6 +146,8 @@ public SdkMeterProviderBuilder registerMetricReader(MetricReader reader) { */ public SdkMeterProviderBuilder registerMetricReader( MetricReader reader, CardinalityLimitSelector cardinalityLimitSelector) { + Objects.requireNonNull(reader, "reader"); + Objects.requireNonNull(cardinalityLimitSelector, "cardinalityLimitSelector"); metricReaders.put(reader, cardinalityLimitSelector); return this; } @@ -154,6 +158,7 @@ public SdkMeterProviderBuilder registerMetricReader( * @since 1.31.0 */ public SdkMeterProviderBuilder registerMetricProducer(MetricProducer metricProducer) { + Objects.requireNonNull(metricProducer, "metricProducer"); metricProducers.add(metricProducer); return this; } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/ViewBuilder.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/ViewBuilder.java index b387481b474..8cbac457965 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/ViewBuilder.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/ViewBuilder.java @@ -59,6 +59,7 @@ public ViewBuilder setDescription(String description) { * @param aggregation aggregation to use. */ public ViewBuilder setAggregation(Aggregation aggregation) { + Objects.requireNonNull(aggregation, "aggregation"); if (!(aggregation instanceof AggregatorFactory)) { throw new IllegalArgumentException( "Custom Aggregation implementations are currently not supported. " diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReader.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReader.java index 25e0bc0b2f1..9895dd76907 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReader.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReader.java @@ -18,6 +18,7 @@ import io.opentelemetry.sdk.metrics.data.MetricData; import java.util.Collection; import java.util.Iterator; +import java.util.Objects; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -59,11 +60,13 @@ public final class PeriodicMetricReader implements MetricReader { * minute. */ public static PeriodicMetricReader create(MetricExporter exporter) { + Objects.requireNonNull(exporter, "exporter"); return builder(exporter).build(); } /** Returns a new {@link PeriodicMetricReaderBuilder}. */ public static PeriodicMetricReaderBuilder builder(MetricExporter exporter) { + Objects.requireNonNull(exporter, "exporter"); return new PeriodicMetricReaderBuilder(exporter); } @@ -149,6 +152,7 @@ public CompletableResultCode shutdown() { @Override public void register(CollectionRegistration collectionRegistration) { + Objects.requireNonNull(collectionRegistration, "collectionRegistration"); this.collectionRegistration = collectionRegistration; start(); } diff --git a/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/DictionaryTable.java b/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/DictionaryTable.java index 3b103f1d3b6..61c8c06d4f8 100644 --- a/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/DictionaryTable.java +++ b/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/DictionaryTable.java @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; /** * This data structure is effectively an indexed Set. @@ -42,6 +43,7 @@ public class DictionaryTable { * @return the index of the added or existing element. */ public Integer putIfAbsent(T value) { + Objects.requireNonNull(value, "value"); Integer index = map.computeIfAbsent(value, k -> map.size()); if (map.size() != table.size()) { table.add(value); diff --git a/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/ProfilesDictionaryCompositor.java b/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/ProfilesDictionaryCompositor.java index 972112e1710..c4f868cbd52 100644 --- a/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/ProfilesDictionaryCompositor.java +++ b/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/ProfilesDictionaryCompositor.java @@ -14,6 +14,7 @@ import io.opentelemetry.sdk.profiles.data.ProfilesDictionaryData; import io.opentelemetry.sdk.profiles.data.StackData; import java.util.Collections; +import java.util.Objects; /** * This class allows for the assembly of the reference tables which form a ProfilesDictionaryData. @@ -86,6 +87,7 @@ public ProfilesDictionaryData getProfileDictionaryData() { * @return the index of the added or existing element. */ public int putIfAbsent(MappingData mappingData) { + Objects.requireNonNull(mappingData, "mappingData"); return mappingTable.putIfAbsent(mappingData); } @@ -96,6 +98,7 @@ public int putIfAbsent(MappingData mappingData) { * @return the index of the added or existing element. */ public int putIfAbsent(LocationData locationData) { + Objects.requireNonNull(locationData, "locationData"); return locationTable.putIfAbsent(locationData); } @@ -106,6 +109,7 @@ public int putIfAbsent(LocationData locationData) { * @return the index of the added or existing element. */ public int putIfAbsent(FunctionData functionData) { + Objects.requireNonNull(functionData, "functionData"); return functionTable.putIfAbsent(functionData); } @@ -116,6 +120,7 @@ public int putIfAbsent(FunctionData functionData) { * @return the index of the added or existing element. */ public int putIfAbsent(LinkData linkData) { + Objects.requireNonNull(linkData, "linkData"); return linkTable.putIfAbsent(linkData); } @@ -126,6 +131,7 @@ public int putIfAbsent(LinkData linkData) { * @return the index of the added or existing element. */ public int putIfAbsent(String string) { + Objects.requireNonNull(string, "string"); return stringTable.putIfAbsent(string); } @@ -136,6 +142,7 @@ public int putIfAbsent(String string) { * @return the index of the added or existing element. */ public int putIfAbsent(KeyValueAndUnitData keyValueAndUnitData) { + Objects.requireNonNull(keyValueAndUnitData, "keyValueAndUnitData"); return attributeTable.putIfAbsent(keyValueAndUnitData); } @@ -146,6 +153,7 @@ public int putIfAbsent(KeyValueAndUnitData keyValueAndUnitData) { * @return the index of the added or existing element. */ public int putIfAbsent(StackData stackData) { + Objects.requireNonNull(stackData, "stackData"); return stackTable.putIfAbsent(stackData); } } diff --git a/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/SampleCompositionBuilder.java b/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/SampleCompositionBuilder.java index c389a407ff8..2223af56779 100644 --- a/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/SampleCompositionBuilder.java +++ b/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/SampleCompositionBuilder.java @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import javax.annotation.Nullable; /** @@ -58,6 +59,7 @@ public List build() { * @param timestamp the time of the observation. */ public void add(SampleCompositionKey key, @Nullable Long value, @Nullable Long timestamp) { + Objects.requireNonNull(key, "key"); SampleCompositionValue v = map.computeIfAbsent(key, key1 -> new SampleCompositionValue()); v.add(value, timestamp); } diff --git a/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/SampleCompositionKey.java b/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/SampleCompositionKey.java index 3a5eeddb582..5617c18598d 100644 --- a/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/SampleCompositionKey.java +++ b/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/SampleCompositionKey.java @@ -27,6 +27,7 @@ public class SampleCompositionKey { private final int linkIndex; public SampleCompositionKey(int stackIndex, List attributeIndices, int linkIndex) { + Objects.requireNonNull(attributeIndices, "attributeIndices"); this.stackIndex = stackIndex; List tmp = new ArrayList<>(attributeIndices); Collections.sort(tmp); diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessor.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessor.java index f264128696e..aac8aa78b70 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessor.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessor.java @@ -6,6 +6,7 @@ package io.opentelemetry.sdk.trace.export; import io.opentelemetry.api.metrics.MeterProvider; +import java.util.Objects; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InternalTelemetryVersion; @@ -99,7 +100,8 @@ public boolean isStartRequired() { @Override public void onEnd(ReadableSpan span) { - if (span != null && (exportUnsampledSpans || span.getSpanContext().isSampled())) { + Objects.requireNonNull(span, "span"); + if (exportUnsampledSpans || span.getSpanContext().isSampled()) { worker.addSpan(span); } } diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessor.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessor.java index f369f872b41..4cb373937ed 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessor.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessor.java @@ -8,6 +8,7 @@ import static java.util.Objects.requireNonNull; import io.opentelemetry.api.metrics.MeterProvider; +import java.util.Objects; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InternalTelemetryVersion; @@ -98,7 +99,8 @@ public boolean isStartRequired() { @Override public void onEnd(ReadableSpan span) { - if (span != null && (exportUnsampledSpans || span.getSpanContext().isSampled())) { + Objects.requireNonNull(span, "span"); + if (exportUnsampledSpans || span.getSpanContext().isSampled()) { try { List spans = Collections.singletonList(span.toSpanData()); CompletableResultCode result; diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/ParentBasedSamplerBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/ParentBasedSamplerBuilder.java index 4944ff5e0a9..9d3c4c0c5d7 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/ParentBasedSamplerBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/ParentBasedSamplerBuilder.java @@ -5,6 +5,7 @@ package io.opentelemetry.sdk.trace.samplers; +import java.util.Objects; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -32,6 +33,7 @@ public final class ParentBasedSamplerBuilder { * @return this Builder */ public ParentBasedSamplerBuilder setRemoteParentSampled(Sampler remoteParentSampled) { + Objects.requireNonNull(remoteParentSampled, "remoteParentSampled"); maybeLogTraceIdSamplerWarning(remoteParentSampled, "remoteParentSampled"); this.remoteParentSampled = remoteParentSampled; return this; @@ -44,6 +46,7 @@ public ParentBasedSamplerBuilder setRemoteParentSampled(Sampler remoteParentSamp * @return this Builder */ public ParentBasedSamplerBuilder setRemoteParentNotSampled(Sampler remoteParentNotSampled) { + Objects.requireNonNull(remoteParentNotSampled, "remoteParentNotSampled"); maybeLogTraceIdSamplerWarning(remoteParentNotSampled, "remoteParentNotSampled"); this.remoteParentNotSampled = remoteParentNotSampled; return this; @@ -56,6 +59,7 @@ public ParentBasedSamplerBuilder setRemoteParentNotSampled(Sampler remoteParentN * @return this Builder */ public ParentBasedSamplerBuilder setLocalParentSampled(Sampler localParentSampled) { + Objects.requireNonNull(localParentSampled, "localParentSampled"); maybeLogTraceIdSamplerWarning(localParentSampled, "localParentSampled"); this.localParentSampled = localParentSampled; return this; @@ -68,6 +72,7 @@ public ParentBasedSamplerBuilder setLocalParentSampled(Sampler localParentSample * @return this Builder */ public ParentBasedSamplerBuilder setLocalParentNotSampled(Sampler localParentNotSampled) { + Objects.requireNonNull(localParentNotSampled, "localParentNotSampled"); maybeLogTraceIdSamplerWarning(localParentNotSampled, "localParentNotSampled"); this.localParentNotSampled = localParentNotSampled; return this; From 2309177a97b07d7237fda60f88300ce292b3d6ca Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Thu, 23 Apr 2026 08:53:40 -0500 Subject: [PATCH 02/10] Second pass --- .../io/opentelemetry/context/Context.java | 32 +++++++ .../context/ContextExecutorService.java | 9 ++ .../io/opentelemetry/context/ContextKey.java | 3 + .../ContextScheduledExecutorService.java | 5 ++ .../CurrentContextExecutorService.java | 9 ++ ...urrentContextScheduledExecutorService.java | 5 ++ .../context/StrictContextStorage.java | 2 + .../propagation/MultiTextMapPropagator.java | 10 ++- .../propagation/NoopTextMapPropagator.java | 17 +++- .../OtlpJsonLoggingLogRecordExporter.java | 2 +- .../otlp/OtlpJsonLoggingMetricExporter.java | 2 +- .../otlp/OtlpJsonLoggingSpanExporter.java | 2 +- .../logging/LoggingMetricExporter.java | 2 +- .../exporter/logging/LoggingSpanExporter.java | 2 +- .../logging/SystemOutLogRecordExporter.java | 2 +- .../http/logs/OtlpHttpLogRecordExporter.java | 2 + .../http/metrics/OtlpHttpMetricExporter.java | 4 + .../otlp/http/trace/OtlpHttpSpanExporter.java | 2 + .../otlp/logs/OtlpGrpcLogRecordExporter.java | 2 + .../OtlpGrpcLogRecordExporterBuilder.java | 1 + .../otlp/metrics/OtlpGrpcMetricExporter.java | 4 + .../OtlpGrpcMetricExporterBuilder.java | 1 + .../otlp/trace/OtlpGrpcSpanExporter.java | 2 + .../trace/OtlpGrpcSpanExporterBuilder.java | 1 + .../profiles/OtlpGrpcProfileExporter.java | 2 + .../OtlpGrpcProfilesExporterBuilder.java | 1 + .../prometheus/PrometheusHttpServer.java | 2 + .../prometheus/PrometheusMetricReader.java | 1 + .../exporter/zipkin/ZipkinSpanExporter.java | 2 +- .../trace/propagation/JaegerPropagator.java | 5 ++ .../trace/propagation/OtTracePropagator.java | 10 ++- .../OpenTelemetryNoRecordEventsSpanImpl.java | 89 +++++++++++++++++++ .../opencensusshim/OpenTelemetrySpanImpl.java | 9 ++ .../opentracingshim/Propagation.java | 5 ++ .../opentracingshim/SpanBuilderShim.java | 13 +++ .../opentracingshim/SpanShim.java | 24 ++++- .../opentracingshim/TracerShim.java | 6 +- .../ComposableRuleBasedSamplerFactory.java | 7 ++ .../DeclarativeConfigContext.java | 1 + .../ServiceResourceDetector.java | 2 + .../YamlDeclarativeConfigProperties.java | 1 + .../viewconfig/ViewConfigCustomizer.java | 2 + .../ServiceInstanceIdResourceProvider.java | 4 + .../trace/LeakDetectingSpanProcessor.java | 4 + .../incubator/trace/OnEndSpanProcessor.java | 4 + .../incubator/trace/OnStartSpanProcessor.java | 3 + .../trace/samplers/AlwaysRecordSampler.java | 7 ++ .../samplers/ComposableAlwaysOffSampler.java | 7 ++ .../samplers/ComposableAlwaysOnSampler.java | 7 ++ .../samplers/ComposableAnnotatingSampler.java | 7 ++ .../ComposableParentThresholdSampler.java | 7 ++ .../ComposableProbabilitySampler.java | 7 ++ .../samplers/ComposableRuleBasedSampler.java | 7 ++ .../trace/samplers/CompositeSampler.java | 7 ++ .../trace/samplers/SamplingIntent.java | 3 + .../sampler/JaegerRemoteSamplerBuilder.java | 2 + .../jaeger/sampler/PerOperationSampler.java | 7 ++ .../jaeger/sampler/RateLimitingSampler.java | 7 ++ .../sdk/common/CompletableResultCode.java | 1 + .../opentelemetry/sdk/resources/Resource.java | 1 + .../sdk/resources/ResourceBuilder.java | 3 + .../sdk/logs/MultiLogRecordProcessor.java | 2 + .../sdk/logs/NoopLogRecordProcessor.java | 6 +- .../sdk/logs/SdkLogRecordBuilder.java | 4 + .../logs/export/BatchLogRecordProcessor.java | 2 +- .../logs/export/MultiLogRecordExporter.java | 2 + .../logs/export/NoopLogRecordExporter.java | 2 + .../sdk/trace/ExtendedSdkSpanBuilder.java | 35 ++++++++ .../sdk/trace/MultiSpanProcessor.java | 3 + .../sdk/trace/NoopSpanProcessor.java | 10 ++- .../io/opentelemetry/sdk/trace/SdkSpan.java | 24 ++++- .../sdk/trace/SdkSpanBuilder.java | 25 +++++- .../sdk/trace/SdkTracerBuilder.java | 3 + .../sdk/trace/export/BatchSpanProcessor.java | 7 +- .../sdk/trace/export/MultiSpanExporter.java | 2 + .../sdk/trace/export/NoopSpanExporter.java | 2 + .../sdk/trace/export/SimpleSpanProcessor.java | 5 +- .../sdk/trace/samplers/AlwaysOffSampler.java | 7 ++ .../sdk/trace/samplers/AlwaysOnSampler.java | 7 ++ .../trace/samplers/ParentBasedSampler.java | 7 ++ .../samplers/TraceIdRatioBasedSampler.java | 7 ++ .../trace/export/BatchSpanProcessorTest.java | 10 +-- 82 files changed, 541 insertions(+), 31 deletions(-) diff --git a/context/src/main/java/io/opentelemetry/context/Context.java b/context/src/main/java/io/opentelemetry/context/Context.java index ac8dbbc4367..a409eeedad7 100644 --- a/context/src/main/java/io/opentelemetry/context/Context.java +++ b/context/src/main/java/io/opentelemetry/context/Context.java @@ -245,6 +245,10 @@ default Scope makeCurrent() { * and then invokes the input {@link Runnable}. */ default Runnable wrap(Runnable runnable) { + if (runnable == null) { + ApiUsageLogger.logNullParam(Context.class, "wrap", "runnable"); + return () -> {}; + } return () -> { try (Scope ignored = makeCurrent()) { runnable.run(); @@ -257,6 +261,10 @@ default Runnable wrap(Runnable runnable) { * and then invokes the input {@link Runnable}. */ default Callable wrap(Callable callable) { + if (callable == null) { + ApiUsageLogger.logNullParam(Context.class, "wrap", "callable"); + return () -> null; + } return () -> { try (Scope ignored = makeCurrent()) { return callable.call(); @@ -269,6 +277,10 @@ default Callable wrap(Callable callable) { * this the {@linkplain Context#current() current context} before each execution. */ default Executor wrap(Executor executor) { + if (executor == null) { + ApiUsageLogger.logNullParam(Context.class, "wrap", "executor"); + return command -> {}; + } return command -> executor.execute(wrap(command)); } @@ -300,6 +312,10 @@ default ScheduledExecutorService wrap(ScheduledExecutorService executor) { * and then invokes the input {@link Function}. */ default Function wrapFunction(Function function) { + if (function == null) { + ApiUsageLogger.logNullParam(Context.class, "wrapFunction", "function"); + return t -> null; + } return t -> { try (Scope ignored = makeCurrent()) { return function.apply(t); @@ -312,6 +328,10 @@ default Function wrapFunction(Function function) { * and then invokes the input {@link BiFunction}. */ default BiFunction wrapFunction(BiFunction function) { + if (function == null) { + ApiUsageLogger.logNullParam(Context.class, "wrapFunction", "function"); + return (t, u) -> null; + } return (t, u) -> { try (Scope ignored = makeCurrent()) { return function.apply(t, u); @@ -324,6 +344,10 @@ default BiFunction wrapFunction(BiFunction function) * and then invokes the input {@link Consumer}. */ default Consumer wrapConsumer(Consumer consumer) { + if (consumer == null) { + ApiUsageLogger.logNullParam(Context.class, "wrapConsumer", "consumer"); + return t -> {}; + } return t -> { try (Scope ignored = makeCurrent()) { consumer.accept(t); @@ -336,6 +360,10 @@ default Consumer wrapConsumer(Consumer consumer) { * and then invokes the input {@link BiConsumer}. */ default BiConsumer wrapConsumer(BiConsumer consumer) { + if (consumer == null) { + ApiUsageLogger.logNullParam(Context.class, "wrapConsumer", "consumer"); + return (t, u) -> {}; + } return (t, u) -> { try (Scope ignored = makeCurrent()) { consumer.accept(t, u); @@ -348,6 +376,10 @@ default BiConsumer wrapConsumer(BiConsumer consumer) { * and then invokes the input {@link Supplier}. */ default Supplier wrapSupplier(Supplier supplier) { + if (supplier == null) { + ApiUsageLogger.logNullParam(Context.class, "wrapSupplier", "supplier"); + return () -> null; + } return () -> { try (Scope ignored = makeCurrent()) { return supplier.get(); diff --git a/context/src/main/java/io/opentelemetry/context/ContextExecutorService.java b/context/src/main/java/io/opentelemetry/context/ContextExecutorService.java index 7b9153d33fc..7938d00474a 100644 --- a/context/src/main/java/io/opentelemetry/context/ContextExecutorService.java +++ b/context/src/main/java/io/opentelemetry/context/ContextExecutorService.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -29,22 +30,26 @@ final Context context() { @Override public Future submit(Callable task) { + Objects.requireNonNull(task, "task"); return delegate().submit(context.wrap(task)); } @Override public Future submit(Runnable task, T result) { + Objects.requireNonNull(task, "task"); return delegate().submit(context.wrap(task), result); } @Override public Future submit(Runnable task) { + Objects.requireNonNull(task, "task"); return delegate().submit(context.wrap(task)); } @Override public List> invokeAll(Collection> tasks) throws InterruptedException { + Objects.requireNonNull(tasks, "tasks"); return delegate().invokeAll(wrap(context, tasks)); } @@ -52,23 +57,27 @@ public List> invokeAll(Collection> tasks) public List> invokeAll( Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException { + Objects.requireNonNull(tasks, "tasks"); return delegate().invokeAll(wrap(context, tasks), timeout, unit); } @Override public T invokeAny(Collection> tasks) throws InterruptedException, ExecutionException { + Objects.requireNonNull(tasks, "tasks"); return delegate().invokeAny(wrap(context, tasks)); } @Override public T invokeAny(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + Objects.requireNonNull(tasks, "tasks"); return delegate().invokeAny(wrap(context, tasks), timeout, unit); } @Override public void execute(Runnable command) { + Objects.requireNonNull(command, "command"); delegate().execute(context.wrap(command)); } } diff --git a/context/src/main/java/io/opentelemetry/context/ContextKey.java b/context/src/main/java/io/opentelemetry/context/ContextKey.java index da5c294c48a..6e124296641 100644 --- a/context/src/main/java/io/opentelemetry/context/ContextKey.java +++ b/context/src/main/java/io/opentelemetry/context/ContextKey.java @@ -5,6 +5,8 @@ package io.opentelemetry.context; +import java.util.Objects; + /** * Key for indexing values of type {@link T} stored in a {@link Context}. {@link ContextKey} are * compared by reference, so it is expected that only one {@link ContextKey} is created for a @@ -39,6 +41,7 @@ public interface ContextKey { * keys. */ static ContextKey named(String name) { + Objects.requireNonNull(name, "name"); return new DefaultContextKey<>(name); } } diff --git a/context/src/main/java/io/opentelemetry/context/ContextScheduledExecutorService.java b/context/src/main/java/io/opentelemetry/context/ContextScheduledExecutorService.java index a17ed89731a..2c55c616909 100644 --- a/context/src/main/java/io/opentelemetry/context/ContextScheduledExecutorService.java +++ b/context/src/main/java/io/opentelemetry/context/ContextScheduledExecutorService.java @@ -5,6 +5,7 @@ package io.opentelemetry.context; +import java.util.Objects; import java.util.concurrent.Callable; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -24,23 +25,27 @@ ScheduledExecutorService delegate() { @Override public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) { + Objects.requireNonNull(command, "command"); return delegate().schedule(context().wrap(command), delay, unit); } @Override public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) { + Objects.requireNonNull(callable, "callable"); return delegate().schedule(context().wrap(callable), delay, unit); } @Override public ScheduledFuture scheduleAtFixedRate( Runnable command, long initialDelay, long period, TimeUnit unit) { + Objects.requireNonNull(command, "command"); return delegate().scheduleAtFixedRate(context().wrap(command), initialDelay, period, unit); } @Override public ScheduledFuture scheduleWithFixedDelay( Runnable command, long initialDelay, long delay, TimeUnit unit) { + Objects.requireNonNull(command, "command"); return delegate().scheduleWithFixedDelay(context().wrap(command), initialDelay, delay, unit); } } diff --git a/context/src/main/java/io/opentelemetry/context/CurrentContextExecutorService.java b/context/src/main/java/io/opentelemetry/context/CurrentContextExecutorService.java index f3e5f3aa81b..c27668580de 100644 --- a/context/src/main/java/io/opentelemetry/context/CurrentContextExecutorService.java +++ b/context/src/main/java/io/opentelemetry/context/CurrentContextExecutorService.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -22,22 +23,26 @@ class CurrentContextExecutorService extends ForwardingExecutorService { @Override public Future submit(Callable task) { + Objects.requireNonNull(task, "task"); return delegate().submit(Context.current().wrap(task)); } @Override public Future submit(Runnable task, T result) { + Objects.requireNonNull(task, "task"); return delegate().submit(Context.current().wrap(task), result); } @Override public Future submit(Runnable task) { + Objects.requireNonNull(task, "task"); return delegate().submit(Context.current().wrap(task)); } @Override public List> invokeAll(Collection> tasks) throws InterruptedException { + Objects.requireNonNull(tasks, "tasks"); return delegate().invokeAll(wrap(Context.current(), tasks)); } @@ -45,23 +50,27 @@ public List> invokeAll(Collection> tasks) public List> invokeAll( Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException { + Objects.requireNonNull(tasks, "tasks"); return delegate().invokeAll(wrap(Context.current(), tasks), timeout, unit); } @Override public T invokeAny(Collection> tasks) throws InterruptedException, ExecutionException { + Objects.requireNonNull(tasks, "tasks"); return delegate().invokeAny(wrap(Context.current(), tasks)); } @Override public T invokeAny(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + Objects.requireNonNull(tasks, "tasks"); return delegate().invokeAny(wrap(Context.current(), tasks), timeout, unit); } @Override public void execute(Runnable command) { + Objects.requireNonNull(command, "command"); delegate().execute(Context.current().wrap(command)); } } diff --git a/context/src/main/java/io/opentelemetry/context/CurrentContextScheduledExecutorService.java b/context/src/main/java/io/opentelemetry/context/CurrentContextScheduledExecutorService.java index f32b1faf2a8..0d688023c6b 100644 --- a/context/src/main/java/io/opentelemetry/context/CurrentContextScheduledExecutorService.java +++ b/context/src/main/java/io/opentelemetry/context/CurrentContextScheduledExecutorService.java @@ -5,6 +5,7 @@ package io.opentelemetry.context; +import java.util.Objects; import java.util.concurrent.Callable; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -22,23 +23,27 @@ final class CurrentContextScheduledExecutorService extends CurrentContextExecuto @Override public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) { + Objects.requireNonNull(command, "command"); return delegate.schedule(Context.current().wrap(command), delay, unit); } @Override public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) { + Objects.requireNonNull(callable, "callable"); return delegate.schedule(Context.current().wrap(callable), delay, unit); } @Override public ScheduledFuture scheduleAtFixedRate( Runnable command, long initialDelay, long period, TimeUnit unit) { + Objects.requireNonNull(command, "command"); return delegate.scheduleAtFixedRate(command, initialDelay, period, unit); } @Override public ScheduledFuture scheduleWithFixedDelay( Runnable command, long initialDelay, long delay, TimeUnit unit) { + Objects.requireNonNull(command, "command"); return delegate.scheduleWithFixedDelay(command, initialDelay, delay, unit); } } diff --git a/context/src/main/java/io/opentelemetry/context/StrictContextStorage.java b/context/src/main/java/io/opentelemetry/context/StrictContextStorage.java index 3c8fa72c2e5..dc7ac587781 100644 --- a/context/src/main/java/io/opentelemetry/context/StrictContextStorage.java +++ b/context/src/main/java/io/opentelemetry/context/StrictContextStorage.java @@ -26,6 +26,7 @@ import java.lang.ref.Reference; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.logging.Level; @@ -63,6 +64,7 @@ private StrictContextStorage(ContextStorage delegate) { @Override public Scope attach(Context context) { + Objects.requireNonNull(context, "context"); Scope scope = delegate.attach(context); CallerStackTrace caller = new CallerStackTrace(context); diff --git a/context/src/main/java/io/opentelemetry/context/propagation/MultiTextMapPropagator.java b/context/src/main/java/io/opentelemetry/context/propagation/MultiTextMapPropagator.java index cee960af923..c10ac04f8f2 100644 --- a/context/src/main/java/io/opentelemetry/context/propagation/MultiTextMapPropagator.java +++ b/context/src/main/java/io/opentelemetry/context/propagation/MultiTextMapPropagator.java @@ -5,6 +5,7 @@ package io.opentelemetry.context.propagation; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import java.util.ArrayList; import java.util.Arrays; @@ -45,7 +46,12 @@ private static List getAllFields(TextMapPropagator[] textPropagators) { @Override public void inject(Context context, @Nullable C carrier, TextMapSetter setter) { - if (context == null || setter == null) { + if (context == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "inject", "context"); + return; + } + if (setter == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "inject", "setter"); return; } for (TextMapPropagator textPropagator : textMapPropagators) { @@ -56,9 +62,11 @@ public void inject(Context context, @Nullable C carrier, TextMapSetter se @Override public Context extract(Context context, @Nullable C carrier, TextMapGetter getter) { if (context == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "extract", "context"); return Context.root(); } if (getter == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "extract", "getter"); return context; } for (TextMapPropagator textPropagator : textMapPropagators) { diff --git a/context/src/main/java/io/opentelemetry/context/propagation/NoopTextMapPropagator.java b/context/src/main/java/io/opentelemetry/context/propagation/NoopTextMapPropagator.java index 2040ddec36b..5ce16b1488e 100644 --- a/context/src/main/java/io/opentelemetry/context/propagation/NoopTextMapPropagator.java +++ b/context/src/main/java/io/opentelemetry/context/propagation/NoopTextMapPropagator.java @@ -5,6 +5,7 @@ package io.opentelemetry.context.propagation; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import java.util.Collection; import java.util.Collections; @@ -23,13 +24,27 @@ public Collection fields() { } @Override - public void inject(Context context, @Nullable C carrier, TextMapSetter setter) {} + public void inject(Context context, @Nullable C carrier, TextMapSetter setter) { + if (context == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "inject", "context"); + return; + } + if (setter == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "inject", "setter"); + return; + } + } @Override public Context extract(Context context, @Nullable C carrier, TextMapGetter getter) { if (context == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "extract", "context"); return Context.root(); } + if (getter == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "extract", "getter"); + return context; + } return context; } diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java index adbdeb8274b..2a2134ee655 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java @@ -5,13 +5,13 @@ package io.opentelemetry.exporter.logging.otlp; -import java.util.Objects; import io.opentelemetry.exporter.logging.otlp.internal.logs.OtlpStdoutLogRecordExporter; import io.opentelemetry.exporter.logging.otlp.internal.logs.OtlpStdoutLogRecordExporterBuilder; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.logs.export.LogRecordExporter; import java.util.Collection; +import java.util.Objects; import java.util.logging.Logger; /** diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java index e8506427f98..3845263b849 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java @@ -5,7 +5,6 @@ package io.opentelemetry.exporter.logging.otlp; -import java.util.Objects; import io.opentelemetry.exporter.logging.otlp.internal.metrics.OtlpStdoutMetricExporter; import io.opentelemetry.exporter.logging.otlp.internal.metrics.OtlpStdoutMetricExporterBuilder; import io.opentelemetry.sdk.common.CompletableResultCode; @@ -83,6 +82,7 @@ public AggregationTemporality getPreferredTemporality() { @Override public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return aggregationTemporality; } } diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java index 345ab7b4024..5840c99041b 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java @@ -5,13 +5,13 @@ package io.opentelemetry.exporter.logging.otlp; -import java.util.Objects; import io.opentelemetry.exporter.logging.otlp.internal.traces.OtlpStdoutSpanExporter; import io.opentelemetry.exporter.logging.otlp.internal.traces.OtlpStdoutSpanExporterBuilder; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.SpanExporter; import java.util.Collection; +import java.util.Objects; import java.util.logging.Logger; /** diff --git a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingMetricExporter.java b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingMetricExporter.java index afb7e2e72ad..50db97d6010 100644 --- a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingMetricExporter.java +++ b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingMetricExporter.java @@ -5,7 +5,6 @@ package io.opentelemetry.exporter.logging; -import java.util.Objects; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.metrics.InstrumentType; import io.opentelemetry.sdk.metrics.data.AggregationTemporality; @@ -64,6 +63,7 @@ public AggregationTemporality getPreferredTemporality() { @Override public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return aggregationTemporality; } diff --git a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingSpanExporter.java b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingSpanExporter.java index 86f2cd05b9c..6c80c68bea4 100644 --- a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingSpanExporter.java +++ b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/LoggingSpanExporter.java @@ -5,12 +5,12 @@ package io.opentelemetry.exporter.logging; -import java.util.Objects; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.SpanExporter; import java.util.Collection; +import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Handler; import java.util.logging.Level; diff --git a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java index 690fc4d0d74..395851a7a4d 100644 --- a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java +++ b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java @@ -8,7 +8,6 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS; import io.opentelemetry.api.common.Value; -import java.util.Objects; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogRecordData; @@ -17,6 +16,7 @@ import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.Collection; +import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; /** diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporter.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporter.java index 459ed970ae5..74ea87626db 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporter.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporter.java @@ -13,6 +13,7 @@ import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.logs.export.LogRecordExporter; import java.util.Collection; +import java.util.Objects; import java.util.StringJoiner; import javax.annotation.concurrent.ThreadSafe; @@ -75,6 +76,7 @@ public OtlpHttpLogRecordExporterBuilder toBuilder() { */ @Override public CompletableResultCode export(Collection logs) { + Objects.requireNonNull(logs, "logs"); return marshaler.export(logs); } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporter.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporter.java index 0f65acd3472..e1776ae9468 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporter.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporter.java @@ -18,6 +18,7 @@ import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector; import io.opentelemetry.sdk.metrics.export.MetricExporter; import java.util.Collection; +import java.util.Objects; import java.util.StringJoiner; import javax.annotation.concurrent.ThreadSafe; @@ -88,11 +89,13 @@ public OtlpHttpMetricExporterBuilder toBuilder() { @Override public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return aggregationTemporalitySelector.getAggregationTemporality(instrumentType); } @Override public Aggregation getDefaultAggregation(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return defaultAggregationSelector.getDefaultAggregation(instrumentType); } @@ -109,6 +112,7 @@ public MemoryMode getMemoryMode() { */ @Override public CompletableResultCode export(Collection metrics) { + Objects.requireNonNull(metrics, "metrics"); return marshaler.export(metrics); } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporter.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporter.java index 9a2f7df798f..b4c4c6d7553 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporter.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporter.java @@ -13,6 +13,7 @@ import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.SpanExporter; import java.util.Collection; +import java.util.Objects; import java.util.StringJoiner; import javax.annotation.concurrent.ThreadSafe; @@ -74,6 +75,7 @@ public OtlpHttpSpanExporterBuilder toBuilder() { */ @Override public CompletableResultCode export(Collection spans) { + Objects.requireNonNull(spans, "spans"); return marshaler.export(spans); } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporter.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporter.java index 4a5cd7ea3d3..ff3a9a9001a 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporter.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporter.java @@ -13,6 +13,7 @@ import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.logs.export.LogRecordExporter; import java.util.Collection; +import java.util.Objects; import java.util.StringJoiner; import javax.annotation.concurrent.ThreadSafe; @@ -75,6 +76,7 @@ public OtlpGrpcLogRecordExporterBuilder toBuilder() { */ @Override public CompletableResultCode export(Collection logs) { + Objects.requireNonNull(logs, "logs"); return marshaler.export(logs); } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java index f5c61f054dd..be58b510a52 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java @@ -79,6 +79,7 @@ public final class OtlpGrpcLogRecordExporterBuilder { */ @Deprecated public OtlpGrpcLogRecordExporterBuilder setChannel(ManagedChannel channel) { + requireNonNull(channel, "channel"); delegate.setChannel(channel); return this; } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporter.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporter.java index 75fe1d461d0..2657d80d89c 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporter.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporter.java @@ -18,6 +18,7 @@ import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector; import io.opentelemetry.sdk.metrics.export.MetricExporter; import java.util.Collection; +import java.util.Objects; import java.util.StringJoiner; import javax.annotation.concurrent.ThreadSafe; @@ -88,11 +89,13 @@ public OtlpGrpcMetricExporterBuilder toBuilder() { @Override public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return aggregationTemporalitySelector.getAggregationTemporality(instrumentType); } @Override public Aggregation getDefaultAggregation(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return defaultAggregationSelector.getDefaultAggregation(instrumentType); } @@ -109,6 +112,7 @@ public MemoryMode getMemoryMode() { */ @Override public CompletableResultCode export(Collection metrics) { + Objects.requireNonNull(metrics, "metrics"); return marshaler.export(metrics); } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java index e8debab7bf6..8eb68ba6287 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java @@ -98,6 +98,7 @@ public final class OtlpGrpcMetricExporterBuilder { */ @Deprecated public OtlpGrpcMetricExporterBuilder setChannel(ManagedChannel channel) { + requireNonNull(channel, "channel"); delegate.setChannel(channel); return this; } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporter.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporter.java index 5e0ee18759f..8790ee90176 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporter.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporter.java @@ -13,6 +13,7 @@ import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.SpanExporter; import java.util.Collection; +import java.util.Objects; import java.util.StringJoiner; import javax.annotation.concurrent.ThreadSafe; @@ -70,6 +71,7 @@ public OtlpGrpcSpanExporterBuilder toBuilder() { */ @Override public CompletableResultCode export(Collection spans) { + Objects.requireNonNull(spans, "spans"); return marshaler.export(spans); } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java index 398c544945d..7fc45765781 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java @@ -76,6 +76,7 @@ public final class OtlpGrpcSpanExporterBuilder { */ @Deprecated public OtlpGrpcSpanExporterBuilder setChannel(ManagedChannel channel) { + requireNonNull(channel, "channel"); delegate.setChannel(channel); return this; } diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfileExporter.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfileExporter.java index b47fddd39c1..c92890f1e26 100644 --- a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfileExporter.java +++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfileExporter.java @@ -11,6 +11,7 @@ import io.opentelemetry.sdk.profiles.ProfileExporter; import io.opentelemetry.sdk.profiles.data.ProfileData; import java.util.Collection; +import java.util.Objects; import java.util.StringJoiner; import javax.annotation.concurrent.ThreadSafe; @@ -64,6 +65,7 @@ public OtlpGrpcProfilesExporterBuilder toBuilder() { */ @Override public CompletableResultCode export(Collection profiles) { + Objects.requireNonNull(profiles, "profiles"); ProfilesRequestMarshaler request = ProfilesRequestMarshaler.create(profiles); return delegate.export(request, profiles.size()); } diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java index 9e76b765ac0..3f91435f6f4 100644 --- a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java +++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java @@ -71,6 +71,7 @@ public final class OtlpGrpcProfilesExporterBuilder { */ @Deprecated public OtlpGrpcProfilesExporterBuilder setChannel(ManagedChannel channel) { + requireNonNull(channel, "channel"); delegate.setChannel(channel); return this; } diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java index 1a17fa7d80e..99b98206b7a 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java @@ -113,11 +113,13 @@ public static PrometheusHttpServerBuilder builder() { @Override public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return prometheusMetricReader.getAggregationTemporality(instrumentType); } @Override public Aggregation getDefaultAggregation(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return defaultAggregationSelector.getDefaultAggregation(instrumentType); } diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java index 564539ebcc9..8882b7940d9 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java @@ -82,6 +82,7 @@ public PrometheusMetricReader(@Nullable Predicate allowedResourceAttribu @Override public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return AggregationTemporality.CUMULATIVE; } diff --git a/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporter.java b/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporter.java index 8ff67638da7..4c073713814 100644 --- a/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporter.java +++ b/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporter.java @@ -7,7 +7,6 @@ import io.opentelemetry.api.internal.InstrumentationUtil; import io.opentelemetry.api.metrics.MeterProvider; -import java.util.Objects; import io.opentelemetry.exporter.internal.metrics.ExporterInstrumentation; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InternalTelemetryVersion; @@ -21,6 +20,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; import java.util.logging.Level; diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java index 8db82ff2b8c..51dd8be7f61 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java @@ -16,6 +16,7 @@ import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.TraceState; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapPropagator; @@ -91,9 +92,11 @@ public Collection fields() { @Override public void inject(Context context, @Nullable C carrier, TextMapSetter setter) { if (context == null) { + ApiUsageLogger.logNullParam(JaegerPropagator.class, "inject", "context"); return; } if (setter == null) { + ApiUsageLogger.logNullParam(JaegerPropagator.class, "inject", "setter"); return; } @@ -133,9 +136,11 @@ private static void injectBaggage( @Override public Context extract(Context context, @Nullable C carrier, TextMapGetter getter) { if (context == null) { + ApiUsageLogger.logNullParam(JaegerPropagator.class, "extract", "context"); return Context.root(); } if (getter == null) { + ApiUsageLogger.logNullParam(JaegerPropagator.class, "extract", "getter"); return context; } diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java index b1df98877de..630eeef61ff 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java @@ -16,6 +16,7 @@ import io.opentelemetry.api.trace.SpanId; import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapPropagator; @@ -67,7 +68,12 @@ public Collection fields() { @Override public void inject(Context context, @Nullable C carrier, TextMapSetter setter) { - if (context == null || setter == null) { + if (context == null) { + ApiUsageLogger.logNullParam(OtTracePropagator.class, "inject", "context"); + return; + } + if (setter == null) { + ApiUsageLogger.logNullParam(OtTracePropagator.class, "inject", "setter"); return; } SpanContext spanContext = Span.fromContext(context).getSpanContext(); @@ -94,9 +100,11 @@ public void inject(Context context, @Nullable C carrier, TextMapSetter se @Override public Context extract(Context context, @Nullable C carrier, TextMapGetter getter) { if (context == null) { + ApiUsageLogger.logNullParam(OtTracePropagator.class, "extract", "context"); return Context.root(); } if (getter == null) { + ApiUsageLogger.logNullParam(OtTracePropagator.class, "extract", "getter"); return context; } String incomingTraceId = getter.get(carrier, TRACE_ID_HEADER); diff --git a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetryNoRecordEventsSpanImpl.java b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetryNoRecordEventsSpanImpl.java index a1e48f5eb40..dfd94561c54 100644 --- a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetryNoRecordEventsSpanImpl.java +++ b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetryNoRecordEventsSpanImpl.java @@ -34,6 +34,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.common.ApiUsageLogger; import java.util.EnumSet; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -91,11 +92,26 @@ public void setStatus(Status status) { @Override public io.opentelemetry.api.trace.Span setStatus(StatusCode canonicalCode) { + if (canonicalCode == null) { + ApiUsageLogger.logNullParam( + OpenTelemetryNoRecordEventsSpanImpl.class, "setStatus", "canonicalCode"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span setStatus(StatusCode canonicalCode, String description) { + if (canonicalCode == null) { + ApiUsageLogger.logNullParam( + OpenTelemetryNoRecordEventsSpanImpl.class, "setStatus", "canonicalCode"); + return this; + } + if (description == null) { + ApiUsageLogger.logNullParam( + OpenTelemetryNoRecordEventsSpanImpl.class, "setStatus", "description"); + return this; + } return this; } @@ -111,63 +127,136 @@ public void end(long timestamp, TimeUnit unit) { @Override public io.opentelemetry.api.trace.Span setAttribute(String key, @Nullable String value) { + if (key == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "setAttribute", "key"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span setAttribute(String key, long value) { + if (key == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "setAttribute", "key"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span setAttribute(String key, double value) { + if (key == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "setAttribute", "key"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span setAttribute(String key, boolean value) { + if (key == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "setAttribute", "key"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span setAttribute(AttributeKey key, @Nullable T value) { + if (key == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "setAttribute", "key"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span addEvent(String name) { + if (name == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "addEvent", "name"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span addEvent(String name, long timestamp, TimeUnit unit) { + if (name == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "addEvent", "name"); + return this; + } + if (unit == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "addEvent", "unit"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span addEvent(String name, Attributes attributes) { + if (name == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "addEvent", "name"); + return this; + } + if (attributes == null) { + ApiUsageLogger.logNullParam( + OpenTelemetryNoRecordEventsSpanImpl.class, "addEvent", "attributes"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span addEvent( String name, Attributes attributes, long timestamp, TimeUnit unit) { + if (name == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "addEvent", "name"); + return this; + } + if (attributes == null) { + ApiUsageLogger.logNullParam( + OpenTelemetryNoRecordEventsSpanImpl.class, "addEvent", "attributes"); + return this; + } + if (unit == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "addEvent", "unit"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span recordException(Throwable exception) { + if (exception == null) { + ApiUsageLogger.logNullParam( + OpenTelemetryNoRecordEventsSpanImpl.class, "recordException", "exception"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span recordException( Throwable exception, Attributes additionalAttributes) { + if (exception == null) { + ApiUsageLogger.logNullParam( + OpenTelemetryNoRecordEventsSpanImpl.class, "recordException", "exception"); + return this; + } + if (additionalAttributes == null) { + ApiUsageLogger.logNullParam( + OpenTelemetryNoRecordEventsSpanImpl.class, "recordException", "additionalAttributes"); + return this; + } return this; } @Override public io.opentelemetry.api.trace.Span updateName(String name) { + if (name == null) { + ApiUsageLogger.logNullParam(OpenTelemetryNoRecordEventsSpanImpl.class, "updateName", "name"); + return this; + } return this; } diff --git a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java index 8d25f722786..9c91eb1d387 100644 --- a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java +++ b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java @@ -44,6 +44,7 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.common.ApiUsageLogger; import java.util.EnumSet; import java.util.Map; import java.util.logging.Logger; @@ -128,6 +129,14 @@ public void setStatus(Status status) { @Override public io.opentelemetry.api.trace.Span setStatus(StatusCode canonicalCode, String description) { + if (canonicalCode == null) { + ApiUsageLogger.logNullParam(OpenTelemetrySpanImpl.class, "setStatus", "canonicalCode"); + return this; + } + if (description == null) { + ApiUsageLogger.logNullParam(OpenTelemetrySpanImpl.class, "setStatus", "description"); + return this; + } return DelegatingSpan.super.setStatus(canonicalCode, description); } diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/Propagation.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/Propagation.java index a9cc5636e90..f249f6019ea 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/Propagation.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/Propagation.java @@ -14,6 +14,7 @@ import io.opentracing.propagation.TextMapInject; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import javax.annotation.Nullable; final class Propagation { @@ -67,6 +68,8 @@ private TextMapSetter() {} @Override public void set(@Nullable TextMapInject carrier, String key, String value) { + Objects.requireNonNull(key, "key"); + Objects.requireNonNull(value, "value"); if (carrier != null) { carrier.put(key, value); } @@ -81,12 +84,14 @@ private TextMapGetter() {} @Override public Iterable keys(Map carrier) { + Objects.requireNonNull(carrier, "carrier"); return carrier.keySet(); } @Override @Nullable public String get(@Nullable Map carrier, String key) { + Objects.requireNonNull(key, "key"); if (carrier == null) { return null; } diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java index 9a0b845bc40..b7fe27cb5f8 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java @@ -17,6 +17,7 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentracing.References; import io.opentracing.Span; @@ -118,6 +119,10 @@ public SpanBuilder ignoreActiveSpan() { @Override public SpanBuilder withTag(String key, String value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilderShim.class, "withTag", "key"); + return this; + } if (Tags.ERROR.getKey().equals(key)) { error = Boolean.parseBoolean(value); } else { @@ -130,6 +135,10 @@ public SpanBuilder withTag(String key, String value) { @Override public SpanBuilder withTag(String key, boolean value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilderShim.class, "withTag", "key"); + return this; + } if (Tags.ERROR.getKey().equals(key)) { error = value; } else { @@ -141,6 +150,10 @@ public SpanBuilder withTag(String key, boolean value) { @Override public SpanBuilder withTag(String key, Number value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilderShim.class, "withTag", "key"); + return this; + } if (value == null) { return this; } diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java index f6cd26b25a0..37a1aa39cdb 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java @@ -121,6 +121,10 @@ public Span setTag(String key, boolean value) { @Override public Span setTag(String key, Number value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanShim.class, "setTag", "key"); + return this; + } if (value == null) { return this; } @@ -170,20 +174,32 @@ public Span log(long timestampMicroseconds, Map fields) { @Override public Span log(String event) { + if (event == null) { + ApiUsageLogger.logNullParam(SpanShim.class, "log", "event"); + return this; + } span.addEvent(event); return this; } @Override public Span log(long timestampMicroseconds, String event) { + if (event == null) { + ApiUsageLogger.logNullParam(SpanShim.class, "log", "event"); + return this; + } span.addEvent(event, timestampMicroseconds, TimeUnit.MICROSECONDS); return this; } @Override public Span setBaggageItem(String key, String value) { - // TagKey nor TagValue can be created with null values. - if (key == null || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanShim.class, "setBaggageItem", "key"); + return this; + } + if (value == null) { + ApiUsageLogger.logNullParam(SpanShim.class, "setBaggageItem", "value"); return this; } @@ -206,6 +222,10 @@ public String getBaggageItem(String key) { @Override public Span setOperationName(String operationName) { + if (operationName == null) { + ApiUsageLogger.logNullParam(SpanShim.class, "setOperationName", "operationName"); + return this; + } span.updateName(operationName); return this; } diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java index 3d3ca72edc5..5002372a4d4 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java @@ -85,7 +85,11 @@ public SpanBuilder buildSpan(String operationName) { @Override public void inject(SpanContext context, Format format, C carrier) { if (context == null) { - logger.log(Level.WARNING, "Cannot inject a null span context."); + ApiUsageLogger.logNullParam(TracerShim.class, "inject", "context"); + return; + } + if (format == null) { + ApiUsageLogger.logNullParam(TracerShim.class, "inject", "format"); return; } diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/ComposableRuleBasedSamplerFactory.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/ComposableRuleBasedSamplerFactory.java index 1cedf988f5f..ac4d7088192 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/ComposableRuleBasedSamplerFactory.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/ComposableRuleBasedSamplerFactory.java @@ -26,6 +26,7 @@ import io.opentelemetry.sdk.trace.data.LinkData; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.StringJoiner; import java.util.function.Predicate; @@ -140,6 +141,12 @@ public boolean matches( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); // all conditions must match // check attribute value condition diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigContext.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigContext.java index 607a4397df0..c2df11edea8 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigContext.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/DeclarativeConfigContext.java @@ -199,6 +199,7 @@ T loadComponent(Class type, ConfigKeyValue configKeyValue) { @Override public Iterable load(Class spiClass) { + Objects.requireNonNull(spiClass, "spiClass"); List result = ComponentLoader.loadList(componentLoader, spiClass); result.forEach( entry -> { diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/ServiceResourceDetector.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/ServiceResourceDetector.java index f09d44a6275..c1f037c1c4c 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/ServiceResourceDetector.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/ServiceResourceDetector.java @@ -13,6 +13,7 @@ import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.resources.ResourceBuilder; import java.util.Collections; +import java.util.Objects; import java.util.UUID; public class ServiceResourceDetector implements ComponentProvider { @@ -36,6 +37,7 @@ public String getName() { @Override public Resource create(DeclarativeConfigProperties config) { + Objects.requireNonNull(config, "config"); ResourceBuilder builder = Resource.builder(); ConfigProperties properties = diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/YamlDeclarativeConfigProperties.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/YamlDeclarativeConfigProperties.java index 44ba67f890e..8a15640c414 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/YamlDeclarativeConfigProperties.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/YamlDeclarativeConfigProperties.java @@ -202,6 +202,7 @@ public Double getDouble(String name) { @Override public List getScalarList(String name, Class scalarType) { Objects.requireNonNull(name, "Null configuration property name"); + Objects.requireNonNull(scalarType, "scalarType"); if (!SUPPORTED_SCALAR_TYPES.contains(scalarType)) { throw new DeclarativeConfigException( "Unsupported scalar type " diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfigCustomizer.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfigCustomizer.java index 13f5fbda742..3c43debc206 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfigCustomizer.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfigCustomizer.java @@ -15,6 +15,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.List; +import java.util.Objects; import java.util.logging.Logger; /** @@ -33,6 +34,7 @@ public final class ViewConfigCustomizer implements AutoConfigurationCustomizerPr @Override public void customize(AutoConfigurationCustomizer autoConfiguration) { + Objects.requireNonNull(autoConfiguration, "autoConfiguration"); autoConfiguration.addMeterProviderCustomizer(ViewConfigCustomizer::customizeMeterProvider); } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/resources/ServiceInstanceIdResourceProvider.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/resources/ServiceInstanceIdResourceProvider.java index 97e84f3c686..c7b55aeae40 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/resources/ServiceInstanceIdResourceProvider.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/resources/ServiceInstanceIdResourceProvider.java @@ -11,6 +11,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; import io.opentelemetry.sdk.autoconfigure.spi.internal.ConditionalResourceProvider; import io.opentelemetry.sdk.resources.Resource; +import java.util.Objects; import java.util.UUID; /** @@ -30,11 +31,14 @@ public final class ServiceInstanceIdResourceProvider implements ConditionalResou @Override public Resource createResource(ConfigProperties config) { + Objects.requireNonNull(config, "config"); return RANDOM; } @Override public boolean shouldApply(ConfigProperties config, Resource existing) { + Objects.requireNonNull(config, "config"); + Objects.requireNonNull(existing, "existing"); return existing.getAttribute(SERVICE_INSTANCE_ID) == null; } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/LeakDetectingSpanProcessor.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/LeakDetectingSpanProcessor.java index 9adcba424da..6e0ab637446 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/LeakDetectingSpanProcessor.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/LeakDetectingSpanProcessor.java @@ -14,6 +14,7 @@ import io.opentelemetry.sdk.trace.SpanProcessor; import java.lang.ref.Reference; import java.util.Arrays; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.logging.Level; @@ -49,6 +50,8 @@ public static LeakDetectingSpanProcessor create() { @Override public void onStart(Context parentContext, ReadWriteSpan span) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(span, "span"); CallerStackTrace caller = new CallerStackTrace(span); StackTraceElement[] stackTrace = caller.getStackTrace(); @@ -66,6 +69,7 @@ public boolean isStartRequired() { @Override public void onEnd(ReadableSpan span) { + Objects.requireNonNull(span, "span"); pendingSpans.remove(span).ended = true; } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnEndSpanProcessor.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnEndSpanProcessor.java index 4a207277201..bb086d79eb0 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnEndSpanProcessor.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnEndSpanProcessor.java @@ -9,6 +9,7 @@ import io.opentelemetry.sdk.trace.ReadWriteSpan; import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.sdk.trace.SpanProcessor; +import java.util.Objects; /** A SpanProcessor implementation that is only capable of processing spans when they end. */ public final class OnEndSpanProcessor implements SpanProcessor { @@ -24,6 +25,7 @@ static SpanProcessor create(OnEnd onEnd) { @Override public void onEnd(ReadableSpan span) { + Objects.requireNonNull(span, "span"); onEnd.apply(span); } @@ -34,6 +36,8 @@ public boolean isEndRequired() { @Override public void onStart(Context parentContext, ReadWriteSpan span) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(span, "span"); // nop } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnStartSpanProcessor.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnStartSpanProcessor.java index 6fda1933576..6ec620e1f91 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnStartSpanProcessor.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/OnStartSpanProcessor.java @@ -27,6 +27,8 @@ public static SpanProcessor create(OnStart onStart) { @Override public void onStart(Context parentContext, ReadWriteSpan span) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(span, "span"); onStart.apply(parentContext, span); } @@ -37,6 +39,7 @@ public boolean isStartRequired() { @Override public void onEnd(ReadableSpan span) { + Objects.requireNonNull(span, "span"); // nop } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/AlwaysRecordSampler.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/AlwaysRecordSampler.java index 9ee7c96f8de..e8c46cf7343 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/AlwaysRecordSampler.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/AlwaysRecordSampler.java @@ -58,6 +58,12 @@ public SamplingResult shouldSample( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); SamplingResult result = rootSampler.shouldSample(parentContext, traceId, name, spanKind, attributes, parentLinks); if (result.getDecision() != SamplingDecision.DROP) { @@ -91,6 +97,7 @@ public Attributes getAttributes() { @Override public TraceState getUpdatedTraceState(TraceState parentTraceState) { + Objects.requireNonNull(parentTraceState, "parentTraceState"); return delegate.getUpdatedTraceState(parentTraceState); } } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAlwaysOffSampler.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAlwaysOffSampler.java index 0566cf4730f..c4ff337313f 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAlwaysOffSampler.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAlwaysOffSampler.java @@ -12,6 +12,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import java.util.List; +import java.util.Objects; enum ComposableAlwaysOffSampler implements ComposableSampler { INSTANCE; @@ -24,6 +25,12 @@ public SamplingIntent getSamplingIntent( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); return NON_SAMPLING_INTENT; } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAlwaysOnSampler.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAlwaysOnSampler.java index 0ccbf3feb98..4e4266c5085 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAlwaysOnSampler.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAlwaysOnSampler.java @@ -10,6 +10,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import java.util.List; +import java.util.Objects; import java.util.function.Function; enum ComposableAlwaysOnSampler implements ComposableSampler { @@ -30,6 +31,12 @@ public SamplingIntent getSamplingIntent( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); return INTENT; } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAnnotatingSampler.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAnnotatingSampler.java index 562b55f3208..0b78d02d1a9 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAnnotatingSampler.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableAnnotatingSampler.java @@ -10,6 +10,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import java.util.List; +import java.util.Objects; final class ComposableAnnotatingSampler implements ComposableSampler { private final ComposableSampler delegate; @@ -32,6 +33,12 @@ public SamplingIntent getSamplingIntent( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); SamplingIntent intent = delegate.getSamplingIntent(parentContext, traceId, name, spanKind, attributes, parentLinks); return SamplingIntent.create( diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableParentThresholdSampler.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableParentThresholdSampler.java index 5f3c8830ab4..23a084db66c 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableParentThresholdSampler.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableParentThresholdSampler.java @@ -16,6 +16,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import java.util.List; +import java.util.Objects; import java.util.function.Function; final class ComposableParentThresholdSampler implements ComposableSampler { @@ -36,6 +37,12 @@ public SamplingIntent getSamplingIntent( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); SpanContext parentSpanContext = Span.fromContext(parentContext).getSpanContext(); if (!parentSpanContext.isValid()) { return rootSampler.getSamplingIntent( diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableProbabilitySampler.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableProbabilitySampler.java index f8cc4c56084..2541d907e8a 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableProbabilitySampler.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableProbabilitySampler.java @@ -10,6 +10,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import java.util.List; +import java.util.Objects; import java.util.function.Function; final class ComposableProbabilitySampler implements ComposableSampler { @@ -57,6 +58,12 @@ public SamplingIntent getSamplingIntent( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); return intent; } diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableRuleBasedSampler.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableRuleBasedSampler.java index d3659572f57..2fddf8889b5 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableRuleBasedSampler.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/ComposableRuleBasedSampler.java @@ -12,6 +12,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import java.util.List; +import java.util.Objects; final class ComposableRuleBasedSampler implements ComposableSampler { @@ -46,6 +47,12 @@ public SamplingIntent getSamplingIntent( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); for (SamplingRule rule : rules) { if (rule.predicate() .matches(parentContext, traceId, name, spanKind, attributes, parentLinks)) { diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/CompositeSampler.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/CompositeSampler.java index 945210c4de7..89410bf55e8 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/CompositeSampler.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/CompositeSampler.java @@ -51,6 +51,12 @@ public SamplingResult shouldSample( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); TraceState traceState = Span.fromContext(parentContext).getSpanContext().getTraceState(); OtelTraceState otelTraceState = OtelTraceState.parse(traceState); @@ -101,6 +107,7 @@ public Attributes getAttributes() { @Override public TraceState getUpdatedTraceState(TraceState parentTraceState) { + Objects.requireNonNull(parentTraceState, "parentTraceState"); TraceState newTraceState = intent.getTraceStateUpdater().apply(traceState); if (!serializedState.isEmpty()) { newTraceState = diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/SamplingIntent.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/SamplingIntent.java index 6e91db5aa34..7026033a2fa 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/SamplingIntent.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/trace/samplers/SamplingIntent.java @@ -7,6 +7,7 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.TraceState; +import java.util.Objects; import java.util.function.Function; /** Information to make a sampling decision. */ @@ -18,6 +19,8 @@ static SamplingIntent create( boolean thresholdReliable, Attributes attributes, Function traceStateUpdater) { + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(traceStateUpdater, "traceStateUpdater"); return ImmutableSamplingIntent.create( threshold, thresholdReliable, attributes, traceStateUpdater); } diff --git a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerBuilder.java b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerBuilder.java index 96af5497c4d..f46ecdf02e6 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerBuilder.java +++ b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerBuilder.java @@ -105,6 +105,8 @@ public JaegerRemoteSamplerBuilder setClientTls(byte[] privateKeyPem, byte[] cert */ public JaegerRemoteSamplerBuilder setSslContext( SSLContext sslContext, X509TrustManager trustManager) { + requireNonNull(sslContext, "sslContext"); + requireNonNull(trustManager, "trustManager"); tlsConfigHelper.setSslContext(sslContext, trustManager); return this; } diff --git a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/PerOperationSampler.java b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/PerOperationSampler.java index 156e04ff90f..0c46a30a493 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/PerOperationSampler.java +++ b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/PerOperationSampler.java @@ -14,6 +14,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; /** {@link PerOperationSampler} samples spans per operation. */ class PerOperationSampler implements Sampler { @@ -42,6 +43,12 @@ public SamplingResult shouldSample( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); Sampler sampler = this.perOperationSampler.get(name); if (sampler == null) { sampler = this.defaultSampler; diff --git a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/RateLimitingSampler.java b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/RateLimitingSampler.java index e5148526aa2..adaf92dabee 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/RateLimitingSampler.java +++ b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/RateLimitingSampler.java @@ -22,6 +22,7 @@ import java.text.DecimalFormatSymbols; import java.util.List; import java.util.Locale; +import java.util.Objects; /** * {@link RateLimitingSampler} sampler uses a leaky bucket rate limiter to ensure that traces are @@ -60,6 +61,12 @@ public SamplingResult shouldSample( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); return this.rateLimiter.trySpend(1.0) ? onSamplingResult : offSamplingResult; } diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java b/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java index 357df35518a..9b810c8fbf3 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/common/CompletableResultCode.java @@ -211,6 +211,7 @@ public boolean isDone() { * @return this {@link CompletableResultCode} */ public CompletableResultCode join(long timeout, TimeUnit unit) { + Objects.requireNonNull(unit, "unit"); if (isDone()) { return this; } diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/resources/Resource.java b/sdk/common/src/main/java/io/opentelemetry/sdk/resources/Resource.java index c406ef87a5e..a191fc9864d 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/resources/Resource.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/resources/Resource.java @@ -135,6 +135,7 @@ public static Resource create(Attributes attributes, @Nullable String schemaUrl) */ @Nullable public T getAttribute(AttributeKey key) { + Objects.requireNonNull(key, "key"); return getAttributes().get(key); } diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java b/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java index b01437bd6fc..6d2574f1657 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import java.util.Objects; import java.util.function.Predicate; import javax.annotation.Nullable; @@ -176,6 +177,7 @@ public ResourceBuilder putAll(Resource resource) { /** Remove all attributes that satisfy the given predicate from {@link Resource}. */ public ResourceBuilder removeIf(Predicate> filter) { + Objects.requireNonNull(filter, "filter"); attributesBuilder.removeIf(filter); return this; } @@ -188,6 +190,7 @@ public ResourceBuilder removeIf(Predicate> filter) { * @since 1.4.0 */ public ResourceBuilder setSchemaUrl(String schemaUrl) { + Objects.requireNonNull(schemaUrl, "schemaUrl"); this.schemaUrl = schemaUrl; return this; } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/MultiLogRecordProcessor.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/MultiLogRecordProcessor.java index e84b38c86b6..05944d44957 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/MultiLogRecordProcessor.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/MultiLogRecordProcessor.java @@ -35,6 +35,8 @@ static LogRecordProcessor create(List logRecordProcessorsLis @Override public void onEmit(Context context, ReadWriteLogRecord logRecord) { + Objects.requireNonNull(context, "context"); + Objects.requireNonNull(logRecord, "logRecord"); for (LogRecordProcessor logRecordProcessor : logRecordProcessors) { logRecordProcessor.onEmit(context, logRecord); } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/NoopLogRecordProcessor.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/NoopLogRecordProcessor.java index 31f3350f13e..c55b170cc80 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/NoopLogRecordProcessor.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/NoopLogRecordProcessor.java @@ -6,6 +6,7 @@ package io.opentelemetry.sdk.logs; import io.opentelemetry.context.Context; +import java.util.Objects; final class NoopLogRecordProcessor implements LogRecordProcessor { private static final NoopLogRecordProcessor INSTANCE = new NoopLogRecordProcessor(); @@ -17,7 +18,10 @@ static LogRecordProcessor getInstance() { private NoopLogRecordProcessor() {} @Override - public void onEmit(Context context, ReadWriteLogRecord logRecord) {} + public void onEmit(Context context, ReadWriteLogRecord logRecord) { + Objects.requireNonNull(context, "context"); + Objects.requireNonNull(logRecord, "logRecord"); + } @Override public String toString() { diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java index f9aebaf9d28..8fea28c6724 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java @@ -99,6 +99,10 @@ public LogRecordBuilder setObservedTimestamp(Instant instant) { @Override public SdkLogRecordBuilder setContext(Context context) { + if (context == null) { + ApiUsageLogger.logNullParam(SdkLogRecordBuilder.class, "setContext", "context"); + return this; + } this.context = context; return this; } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java index d31825b52ee..9b135d1004e 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java @@ -6,7 +6,6 @@ package io.opentelemetry.sdk.logs.export; import io.opentelemetry.api.metrics.MeterProvider; -import java.util.Objects; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InternalTelemetryVersion; @@ -18,6 +17,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporter.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporter.java index 33d1a1b726a..e483cef8cf3 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporter.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporter.java @@ -11,6 +11,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; @@ -41,6 +42,7 @@ static LogRecordExporter create(List logRecordExporters) { @Override public CompletableResultCode export(Collection logs) { + Objects.requireNonNull(logs, "logs"); List results = new ArrayList<>(logRecordExporters.length); for (LogRecordExporter logRecordExporter : logRecordExporters) { CompletableResultCode exportResult; diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/NoopLogRecordExporter.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/NoopLogRecordExporter.java index 8c0018826f4..04ca159a7ef 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/NoopLogRecordExporter.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/NoopLogRecordExporter.java @@ -8,6 +8,7 @@ import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.logs.data.LogRecordData; import java.util.Collection; +import java.util.Objects; final class NoopLogRecordExporter implements LogRecordExporter { @@ -19,6 +20,7 @@ static LogRecordExporter getInstance() { @Override public CompletableResultCode export(Collection logs) { + Objects.requireNonNull(logs, "logs"); return CompletableResultCode.ofSuccess(); } diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ExtendedSdkSpanBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ExtendedSdkSpanBuilder.java index 8ddf5a4a957..5ef62c151e9 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ExtendedSdkSpanBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ExtendedSdkSpanBuilder.java @@ -15,6 +15,7 @@ import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.context.propagation.ContextPropagators; @@ -104,19 +105,41 @@ public ExtendedSpanBuilder setStartTimestamp(long startTimestamp, TimeUnit unit) @Override public ExtendedSpanBuilder setParentFrom( ContextPropagators propagators, Map carrier) { + if (propagators == null) { + ApiUsageLogger.logNullParam(ExtendedSdkSpanBuilder.class, "setParentFrom", "propagators"); + return this; + } + if (carrier == null) { + ApiUsageLogger.logNullParam(ExtendedSdkSpanBuilder.class, "setParentFrom", "carrier"); + return this; + } super.setParent( ExtendedContextPropagators.extractTextMapPropagationContext(carrier, propagators)); return this; } + @SuppressWarnings("NullAway") @Override public T startAndCall(SpanCallable spanCallable) throws E { + if (spanCallable == null) { + ApiUsageLogger.logNullParam(ExtendedSdkSpanBuilder.class, "startAndCall", "spanCallable"); + return null; + } return startAndCall(spanCallable, ExtendedSdkSpanBuilder::setSpanError); } + @SuppressWarnings("NullAway") @Override public T startAndCall( SpanCallable spanCallable, BiConsumer handleException) throws E { + if (spanCallable == null) { + ApiUsageLogger.logNullParam(ExtendedSdkSpanBuilder.class, "startAndCall", "spanCallable"); + return null; + } + if (handleException == null) { + ApiUsageLogger.logNullParam(ExtendedSdkSpanBuilder.class, "startAndCall", "handleException"); + return null; + } Span span = startSpan(); //noinspection unused @@ -132,6 +155,10 @@ public T startAndCall( @Override public void startAndRun(SpanRunnable runnable) throws E { + if (runnable == null) { + ApiUsageLogger.logNullParam(ExtendedSdkSpanBuilder.class, "startAndRun", "runnable"); + return; + } startAndRun(runnable, ExtendedSdkSpanBuilder::setSpanError); } @@ -139,6 +166,14 @@ public void startAndRun(SpanRunnable runnable) throws E @Override public void startAndRun( SpanRunnable runnable, BiConsumer handleException) throws E { + if (runnable == null) { + ApiUsageLogger.logNullParam(ExtendedSdkSpanBuilder.class, "startAndRun", "runnable"); + return; + } + if (handleException == null) { + ApiUsageLogger.logNullParam(ExtendedSdkSpanBuilder.class, "startAndRun", "handleException"); + return; + } startAndCall( () -> { runnable.runInSpan(); diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/MultiSpanProcessor.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/MultiSpanProcessor.java index 65b37096568..347c7a59356 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/MultiSpanProcessor.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/MultiSpanProcessor.java @@ -38,6 +38,8 @@ static SpanProcessor create(List spanProcessorList) { @Override public void onStart(Context parentContext, ReadWriteSpan readWriteSpan) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(readWriteSpan, "readWriteSpan"); for (SpanProcessor spanProcessor : spanProcessorsStart) { spanProcessor.onStart(parentContext, readWriteSpan); } @@ -50,6 +52,7 @@ public boolean isStartRequired() { @Override public void onEnd(ReadableSpan readableSpan) { + Objects.requireNonNull(readableSpan, "readableSpan"); for (SpanProcessor spanProcessor : spanProcessorsEnd) { spanProcessor.onEnd(readableSpan); } diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/NoopSpanProcessor.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/NoopSpanProcessor.java index ce19470f7fa..cdb2688d1fb 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/NoopSpanProcessor.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/NoopSpanProcessor.java @@ -6,6 +6,7 @@ package io.opentelemetry.sdk.trace; import io.opentelemetry.context.Context; +import java.util.Objects; final class NoopSpanProcessor implements SpanProcessor { private static final NoopSpanProcessor INSTANCE = new NoopSpanProcessor(); @@ -15,7 +16,10 @@ static SpanProcessor getInstance() { } @Override - public void onStart(Context parentContext, ReadWriteSpan span) {} + public void onStart(Context parentContext, ReadWriteSpan span) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(span, "span"); + } @Override public boolean isStartRequired() { @@ -23,7 +27,9 @@ public boolean isStartRequired() { } @Override - public void onEnd(ReadableSpan span) {} + public void onEnd(ReadableSpan span) { + Objects.requireNonNull(span, "span"); + } @Override public boolean isEndRequired() { diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java index e3381b06a3d..75fe201600f 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java @@ -12,6 +12,7 @@ import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.Clock; import io.opentelemetry.sdk.common.InstrumentationLibraryInfo; @@ -359,6 +360,7 @@ private boolean isModifiableByCurrentThread() { @Override public ReadWriteSpan addEvent(String name) { if (name == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "addEvent", "name"); return this; } addTimedEvent(EventData.create(clock.now(), name, Attributes.empty(), 0)); @@ -367,7 +369,12 @@ public ReadWriteSpan addEvent(String name) { @Override public ReadWriteSpan addEvent(String name, long timestamp, TimeUnit unit) { - if (name == null || unit == null) { + if (name == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "addEvent", "name"); + return this; + } + if (unit == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "addEvent", "unit"); return this; } addTimedEvent(EventData.create(unit.toNanos(timestamp), name, Attributes.empty(), 0)); @@ -377,6 +384,7 @@ public ReadWriteSpan addEvent(String name, long timestamp, TimeUnit unit) { @Override public ReadWriteSpan addEvent(String name, Attributes attributes) { if (name == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "addEvent", "name"); return this; } if (attributes == null) { @@ -397,7 +405,12 @@ public ReadWriteSpan addEvent(String name, Attributes attributes) { @Override public ReadWriteSpan addEvent(String name, Attributes attributes, long timestamp, TimeUnit unit) { - if (name == null || unit == null) { + if (name == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "addEvent", "name"); + return this; + } + if (unit == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "addEvent", "unit"); return this; } if (attributes == null) { @@ -435,6 +448,7 @@ private void addTimedEvent(EventData timedEvent) { @Override public ReadWriteSpan setStatus(StatusCode statusCode, @Nullable String description) { if (statusCode == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "setStatus", "statusCode"); return this; } synchronized (lock) { @@ -468,6 +482,10 @@ public ReadWriteSpan setStatus(StatusCode statusCode, @Nullable String descripti @Override public ReadWriteSpan recordException(Throwable exception) { + if (exception == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "recordException", "exception"); + return this; + } recordException(exception, Attributes.empty()); return this; } @@ -475,6 +493,7 @@ public ReadWriteSpan recordException(Throwable exception) { @Override public ReadWriteSpan recordException(Throwable exception, Attributes additionalAttributes) { if (exception == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "recordException", "exception"); return this; } if (additionalAttributes == null) { @@ -500,6 +519,7 @@ public ReadWriteSpan recordException(Throwable exception, Attributes additionalA @Override public ReadWriteSpan updateName(String name) { if (name == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "updateName", "name"); return this; } synchronized (lock) { diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java index 8a9df5cb2e4..771f6f33c4a 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java @@ -21,6 +21,7 @@ import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.common.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.common.internal.AttributeUtil; @@ -75,6 +76,7 @@ class SdkSpanBuilder implements SpanBuilder { @Override public SpanBuilder setParent(Context context) { if (context == null) { + ApiUsageLogger.logNullParam(SdkSpanBuilder.class, "setParent", "context"); return this; } this.parent = context; @@ -90,6 +92,7 @@ public SpanBuilder setNoParent() { @Override public SpanBuilder setSpanKind(SpanKind spanKind) { if (spanKind == null) { + ApiUsageLogger.logNullParam(SdkSpanBuilder.class, "setSpanKind", "spanKind"); return this; } this.spanKind = spanKind; @@ -141,21 +144,37 @@ private void addLink(LinkData link) { @Override public SpanBuilder setAttribute(String key, @Nullable String value) { + if (key == null) { + ApiUsageLogger.logNullParam(SdkSpanBuilder.class, "setAttribute", "key"); + return this; + } return setAttribute(stringKey(key), value); } @Override public SpanBuilder setAttribute(String key, long value) { + if (key == null) { + ApiUsageLogger.logNullParam(SdkSpanBuilder.class, "setAttribute", "key"); + return this; + } return setAttribute(longKey(key), value); } @Override public SpanBuilder setAttribute(String key, double value) { + if (key == null) { + ApiUsageLogger.logNullParam(SdkSpanBuilder.class, "setAttribute", "key"); + return this; + } return setAttribute(doubleKey(key), value); } @Override public SpanBuilder setAttribute(String key, boolean value) { + if (key == null) { + ApiUsageLogger.logNullParam(SdkSpanBuilder.class, "setAttribute", "key"); + return this; + } return setAttribute(booleanKey(key), value); } @@ -170,7 +189,11 @@ public SpanBuilder setAttribute(AttributeKey key, @Nullable T value) { @Override public SpanBuilder setStartTimestamp(long startTimestamp, TimeUnit unit) { - if (startTimestamp < 0 || unit == null) { + if (unit == null) { + ApiUsageLogger.logNullParam(SdkSpanBuilder.class, "setStartTimestamp", "unit"); + return this; + } + if (startTimestamp < 0) { return this; } startEpochNanos = unit.toNanos(startTimestamp); diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerBuilder.java index 39489f751fc..8546161efbd 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerBuilder.java @@ -9,6 +9,7 @@ import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.TracerBuilder; import io.opentelemetry.sdk.common.internal.ComponentRegistry; +import java.util.Objects; import javax.annotation.Nullable; class SdkTracerBuilder implements TracerBuilder { @@ -25,12 +26,14 @@ class SdkTracerBuilder implements TracerBuilder { @Override public TracerBuilder setSchemaUrl(String schemaUrl) { + Objects.requireNonNull(schemaUrl, "schemaUrl"); this.schemaUrl = schemaUrl; return this; } @Override public TracerBuilder setInstrumentationVersion(String instrumentationScopeVersion) { + Objects.requireNonNull(instrumentationScopeVersion, "instrumentationScopeVersion"); this.instrumentationScopeVersion = instrumentationScopeVersion; return this; } diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessor.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessor.java index aac8aa78b70..e9acacee9f3 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessor.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessor.java @@ -6,7 +6,6 @@ package io.opentelemetry.sdk.trace.export; import io.opentelemetry.api.metrics.MeterProvider; -import java.util.Objects; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InternalTelemetryVersion; @@ -21,6 +20,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; @@ -91,7 +91,10 @@ public static BatchSpanProcessorBuilder builder(SpanExporter spanExporter) { } @Override - public void onStart(Context parentContext, ReadWriteSpan span) {} + public void onStart(Context parentContext, ReadWriteSpan span) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(span, "span"); + } @Override public boolean isStartRequired() { diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/MultiSpanExporter.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/MultiSpanExporter.java index 22afba92935..76ea10b3133 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/MultiSpanExporter.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/MultiSpanExporter.java @@ -12,6 +12,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; @@ -38,6 +39,7 @@ static SpanExporter create(List spanExporters) { @Override public CompletableResultCode export(Collection spans) { + Objects.requireNonNull(spans, "spans"); List results = new ArrayList<>(spanExporters.length); for (SpanExporter spanExporter : spanExporters) { CompletableResultCode exportResult; diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/NoopSpanExporter.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/NoopSpanExporter.java index 74ae8d02bae..407780a8004 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/NoopSpanExporter.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/NoopSpanExporter.java @@ -8,6 +8,7 @@ import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.trace.data.SpanData; import java.util.Collection; +import java.util.Objects; final class NoopSpanExporter implements SpanExporter { @@ -19,6 +20,7 @@ static SpanExporter getInstance() { @Override public CompletableResultCode export(Collection spans) { + Objects.requireNonNull(spans, "spans"); return CompletableResultCode.ofSuccess(); } diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessor.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessor.java index 4cb373937ed..e8a2868ebac 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessor.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessor.java @@ -8,7 +8,6 @@ import static java.util.Objects.requireNonNull; import io.opentelemetry.api.metrics.MeterProvider; -import java.util.Objects; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InternalTelemetryVersion; @@ -19,6 +18,7 @@ import io.opentelemetry.sdk.trace.data.SpanData; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; @@ -89,7 +89,8 @@ public static SimpleSpanProcessorBuilder builder(SpanExporter exporter) { @Override public void onStart(Context parentContext, ReadWriteSpan span) { - // Do nothing. + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(span, "span"); } @Override diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/AlwaysOffSampler.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/AlwaysOffSampler.java index 7a818e92ac2..8066b3ca123 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/AlwaysOffSampler.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/AlwaysOffSampler.java @@ -10,6 +10,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import java.util.List; +import java.util.Objects; import javax.annotation.concurrent.Immutable; @Immutable @@ -25,6 +26,12 @@ public SamplingResult shouldSample( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); return ImmutableSamplingResult.EMPTY_NOT_SAMPLED_OR_RECORDED_SAMPLING_RESULT; } diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/AlwaysOnSampler.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/AlwaysOnSampler.java index 6315e50aee6..8e1a69353e4 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/AlwaysOnSampler.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/AlwaysOnSampler.java @@ -10,6 +10,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import java.util.List; +import java.util.Objects; import javax.annotation.concurrent.Immutable; @Immutable @@ -25,6 +26,12 @@ public SamplingResult shouldSample( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); return ImmutableSamplingResult.EMPTY_RECORDED_AND_SAMPLED_SAMPLING_RESULT; } diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/ParentBasedSampler.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/ParentBasedSampler.java index 0b54cf2180f..d69c27a8389 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/ParentBasedSampler.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/ParentBasedSampler.java @@ -12,6 +12,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import java.util.List; +import java.util.Objects; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @@ -55,6 +56,12 @@ public SamplingResult shouldSample( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); SpanContext parentSpanContext = Span.fromContext(parentContext).getSpanContext(); if (!parentSpanContext.isValid()) { return this.root.shouldSample( diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/TraceIdRatioBasedSampler.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/TraceIdRatioBasedSampler.java index 9a7490931af..387d5f917bb 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/TraceIdRatioBasedSampler.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/TraceIdRatioBasedSampler.java @@ -14,6 +14,7 @@ import java.text.DecimalFormatSymbols; import java.util.List; import java.util.Locale; +import java.util.Objects; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @@ -66,6 +67,12 @@ public SamplingResult shouldSample( SpanKind spanKind, Attributes attributes, List parentLinks) { + Objects.requireNonNull(parentContext, "parentContext"); + Objects.requireNonNull(traceId, "traceId"); + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(spanKind, "spanKind"); + Objects.requireNonNull(attributes, "attributes"); + Objects.requireNonNull(parentLinks, "parentLinks"); // Always sample if we are within probability range. This is true even for child spans (that // may have had a different sampling samplingResult made) to allow for different sampling // policies, diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java index 0ba9812ec86..e8620d81924 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java @@ -450,15 +450,11 @@ void exportMoreSpansThanTheMaximumLimit() { } @Test - void ignoresNullSpans() { + void rejectsNullSpanOnEnd() { BatchSpanProcessor processor = BatchSpanProcessor.builder(mockSpanExporter).build(); try { - assertThatCode( - () -> { - processor.onStart(null, null); - processor.onEnd(null); - }) - .doesNotThrowAnyException(); + assertThatCode(() -> processor.onStart(null, null)).doesNotThrowAnyException(); + assertThatThrownBy(() -> processor.onEnd(null)).isInstanceOf(NullPointerException.class); } finally { processor.shutdown(); } From 531a0e744f4205b9b95bd476c2f48e0bfe469fe1 Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 8 May 2026 10:48:24 -0500 Subject: [PATCH 03/10] Fix build rebase --- .../io/opentelemetry/api/logs/DefaultLogger.java | 2 +- .../io/opentelemetry/api/metrics/DefaultMeter.java | 2 +- .../io/opentelemetry/api/trace/PropagatedSpan.java | 2 +- .../io/opentelemetry/context/ArrayBasedContext.java | 2 +- .../main/java/io/opentelemetry/context/Context.java | 2 +- .../context/propagation/MultiTextMapPropagator.java | 2 +- .../context/propagation/NoopTextMapPropagator.java | 2 +- docs/knowledge/api-design.md | 5 +++++ .../extension/trace/propagation/B3Propagator.java | 2 +- .../trace/propagation/JaegerPropagator.java | 2 +- .../trace/propagation/OtTracePropagator.java | 2 +- .../OpenTelemetryNoRecordEventsSpanImpl.java | 2 +- .../opencensusshim/OpenTelemetrySpanImpl.java | 2 +- .../opentracingshim/SpanBuilderShim.java | 2 +- .../io/opentelemetry/opentracingshim/SpanShim.java | 12 +++++++----- .../io/opentelemetry/opentracingshim/TracerShim.java | 2 +- .../opentelemetry/sdk/resources/ResourceBuilder.java | 6 +++++- .../opentelemetry/sdk/logs/SdkLogRecordBuilder.java | 2 +- .../java/io/opentelemetry/sdk/logs/SdkLogger.java | 2 +- .../sdk/logs/export/BatchLogRecordProcessorTest.java | 12 ------------ .../sdk/trace/ExtendedSdkSpanBuilder.java | 2 +- .../java/io/opentelemetry/sdk/trace/SdkSpan.java | 2 +- .../io/opentelemetry/sdk/trace/SdkSpanBuilder.java | 2 +- .../sdk/trace/SdkTracerProviderTest.java | 7 +------ .../sdk/trace/export/BatchSpanProcessorTest.java | 2 +- 25 files changed, 38 insertions(+), 44 deletions(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java index d0c5d5c6c4c..3c27c8cf726 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java @@ -7,7 +7,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Value; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import java.time.Instant; import java.util.concurrent.TimeUnit; diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java index 3638882d27e..19c71f1d8fc 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java @@ -6,7 +6,7 @@ package io.opentelemetry.api.metrics; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import java.util.Objects; import java.util.function.Consumer; diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/PropagatedSpan.java b/api/all/src/main/java/io/opentelemetry/api/trace/PropagatedSpan.java index b7b659b1d77..d1e37b9543f 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/PropagatedSpan.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/PropagatedSpan.java @@ -7,7 +7,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; diff --git a/context/src/main/java/io/opentelemetry/context/ArrayBasedContext.java b/context/src/main/java/io/opentelemetry/context/ArrayBasedContext.java index a377c4a7d0d..09d27f9f0fe 100644 --- a/context/src/main/java/io/opentelemetry/context/ArrayBasedContext.java +++ b/context/src/main/java/io/opentelemetry/context/ArrayBasedContext.java @@ -22,7 +22,7 @@ package io.opentelemetry.context; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.Arrays; import javax.annotation.Nullable; diff --git a/context/src/main/java/io/opentelemetry/context/Context.java b/context/src/main/java/io/opentelemetry/context/Context.java index a409eeedad7..9f583f55b80 100644 --- a/context/src/main/java/io/opentelemetry/context/Context.java +++ b/context/src/main/java/io/opentelemetry/context/Context.java @@ -23,7 +23,7 @@ package io.opentelemetry.context; import com.google.errorprone.annotations.MustBeClosed; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.Objects; import java.util.concurrent.Callable; import java.util.concurrent.Executor; diff --git a/context/src/main/java/io/opentelemetry/context/propagation/MultiTextMapPropagator.java b/context/src/main/java/io/opentelemetry/context/propagation/MultiTextMapPropagator.java index c10ac04f8f2..26dc536349f 100644 --- a/context/src/main/java/io/opentelemetry/context/propagation/MultiTextMapPropagator.java +++ b/context/src/main/java/io/opentelemetry/context/propagation/MultiTextMapPropagator.java @@ -5,7 +5,7 @@ package io.opentelemetry.context.propagation; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import java.util.ArrayList; import java.util.Arrays; diff --git a/context/src/main/java/io/opentelemetry/context/propagation/NoopTextMapPropagator.java b/context/src/main/java/io/opentelemetry/context/propagation/NoopTextMapPropagator.java index 5ce16b1488e..39b8f9eebe7 100644 --- a/context/src/main/java/io/opentelemetry/context/propagation/NoopTextMapPropagator.java +++ b/context/src/main/java/io/opentelemetry/context/propagation/NoopTextMapPropagator.java @@ -5,7 +5,7 @@ package io.opentelemetry.context.propagation; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import java.util.Collection; import java.util.Collections; diff --git a/docs/knowledge/api-design.md b/docs/knowledge/api-design.md index c0a3e69aef3..9c91faaf72e 100644 --- a/docs/knowledge/api-design.md +++ b/docs/knowledge/api-design.md @@ -77,6 +77,11 @@ public SdkTracerProviderBuilder setResource(Resource resource) { These APIs are called once during startup, so a hard failure surfaces the bug immediately and unambiguously. +> **Grey area — Resource construction is used both by application code at +> startup *and* by `ResourceProvider` implementations that detect environment information at +> initialization time (similar to instrumentation). Treat `Resource` and `ResourceBuilder` as an +> instrumentation-time boundary: use `ApiUsageLogger` and degrade gracefully rather than throwing. + ### Runtime / instrumentation-time boundaries (Span methods, metric recordings, log builders) Do **not** throw. Log the violation via diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3Propagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3Propagator.java index 7b892d16684..0c42b37bc07 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3Propagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3Propagator.java @@ -5,7 +5,7 @@ package io.opentelemetry.extension.trace.propagation; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.ContextKey; import io.opentelemetry.context.propagation.TextMapGetter; diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java index 51dd8be7f61..ca487e4e8a2 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java @@ -16,7 +16,7 @@ import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.TraceState; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapPropagator; diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java index 630eeef61ff..f0563102db6 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java @@ -16,7 +16,7 @@ import io.opentelemetry.api.trace.SpanId; import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapPropagator; diff --git a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetryNoRecordEventsSpanImpl.java b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetryNoRecordEventsSpanImpl.java index dfd94561c54..029d986ed25 100644 --- a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetryNoRecordEventsSpanImpl.java +++ b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetryNoRecordEventsSpanImpl.java @@ -34,7 +34,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.StatusCode; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.EnumSet; import java.util.Map; import java.util.concurrent.TimeUnit; diff --git a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java index 9c91eb1d387..313a68aa63c 100644 --- a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java +++ b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java @@ -44,7 +44,7 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.StatusCode; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.EnumSet; import java.util.Map; import java.util.logging.Logger; diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java index b7fe27cb5f8..4e05a0fefab 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java @@ -17,7 +17,7 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.Tracer; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentracing.References; import io.opentracing.Span; diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java index 37a1aa39cdb..7f1dd902eb5 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java @@ -15,7 +15,7 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.trace.StatusCode; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.ContextKey; import io.opentelemetry.context.ImplicitContextKeyed; @@ -48,6 +48,8 @@ final class SpanShim implements Span, ImplicitContextKeyed { private static final ContextKey SPAN_SHIM_KEY = ContextKey.named("opentracing-shim-key"); + private static final String LOG_METHOD_NAME = "log"; + private final io.opentelemetry.api.trace.Span span; private final Object spanContextShimLock; private volatile SpanContextShim spanContextShim; @@ -155,7 +157,7 @@ public Span setTag(Tag tag, T value) { @Override public Span log(Map fields) { if (fields == null) { - ApiUsageLogger.logNullParam(SpanShim.class, "log", "fields"); + ApiUsageLogger.logNullParam(SpanShim.class, LOG_METHOD_NAME, "fields"); return this; } logInternal(-1, fields); @@ -165,7 +167,7 @@ public Span log(Map fields) { @Override public Span log(long timestampMicroseconds, Map fields) { if (fields == null) { - ApiUsageLogger.logNullParam(SpanShim.class, "log", "fields"); + ApiUsageLogger.logNullParam(SpanShim.class, LOG_METHOD_NAME, "fields"); return this; } logInternal(timestampMicroseconds, fields); @@ -175,7 +177,7 @@ public Span log(long timestampMicroseconds, Map fields) { @Override public Span log(String event) { if (event == null) { - ApiUsageLogger.logNullParam(SpanShim.class, "log", "event"); + ApiUsageLogger.logNullParam(SpanShim.class, LOG_METHOD_NAME, "event"); return this; } span.addEvent(event); @@ -185,7 +187,7 @@ public Span log(String event) { @Override public Span log(long timestampMicroseconds, String event) { if (event == null) { - ApiUsageLogger.logNullParam(SpanShim.class, "log", "event"); + ApiUsageLogger.logNullParam(SpanShim.class, LOG_METHOD_NAME, "event"); return this; } span.addEvent(event, timestampMicroseconds, TimeUnit.MICROSECONDS); diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java index 5002372a4d4..7590849c8b4 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/TracerShim.java @@ -6,7 +6,7 @@ package io.opentelemetry.opentracingshim; import io.opentelemetry.api.trace.TracerProvider; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.opentracing.shim.internal.OtelVersion; import io.opentracing.Scope; diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java b/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java index 6d2574f1657..19daf8a5447 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.Objects; import java.util.function.Predicate; import javax.annotation.Nullable; @@ -190,7 +191,10 @@ public ResourceBuilder removeIf(Predicate> filter) { * @since 1.4.0 */ public ResourceBuilder setSchemaUrl(String schemaUrl) { - Objects.requireNonNull(schemaUrl, "schemaUrl"); + if (schemaUrl == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "setSchemaUrl", "schemaUrl"); + return this; + } this.schemaUrl = schemaUrl; return this; } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java index 8fea28c6724..14c8f35eb69 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java @@ -10,7 +10,7 @@ import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.common.internal.AttributesMap; diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java index 5e621f83dab..56fd54d3254 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java @@ -11,7 +11,7 @@ import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.internal.LoggerConfig; diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessorTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessorTest.java index 144ab7c35f6..129d775a31b 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessorTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessorTest.java @@ -8,7 +8,6 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; import static org.awaitility.Awaitility.await; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; @@ -334,17 +333,6 @@ void emitMoreLogsThanTheMaximumLimit() { assertThat(exported).hasSize(maxQueuedLogs); } - @Test - void ignoresNullLogs() { - BatchLogRecordProcessor processor = - BatchLogRecordProcessor.builder(mockLogRecordExporter).build(); - try { - assertThatCode(() -> processor.onEmit(null, null)).doesNotThrowAnyException(); - } finally { - processor.shutdown(); - } - } - @Test @SuppressLogger(MultiLogRecordExporter.class) void exporterThrowsException() { diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ExtendedSdkSpanBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ExtendedSdkSpanBuilder.java index 5ef62c151e9..6ff4fab95dd 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ExtendedSdkSpanBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ExtendedSdkSpanBuilder.java @@ -15,7 +15,7 @@ import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.StatusCode; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.context.propagation.ContextPropagators; diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java index 75fe201600f..92c082dd4c7 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java @@ -12,7 +12,7 @@ import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.StatusCode; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.Clock; import io.opentelemetry.sdk.common.InstrumentationLibraryInfo; diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java index 771f6f33c4a..5d08739e518 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java @@ -21,7 +21,7 @@ import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.TraceState; -import io.opentelemetry.common.ApiUsageLogger; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.common.internal.AttributeUtil; diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkTracerProviderTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkTracerProviderTest.java index b007fe06b22..e26bfdc9f43 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkTracerProviderTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkTracerProviderTest.java @@ -147,9 +147,8 @@ void defaultGet() { @Test void getSameInstanceForSameName_WithoutVersion() { - assertThat(tracerProvider.get("test")).isSameAs(tracerProvider.get("test")); assertThat(tracerProvider.get("test")) - .isSameAs(tracerProvider.get("test", null)) + .isSameAs(tracerProvider.get("test")) .isSameAs(tracerProvider.tracerBuilder("test").build()); } @@ -271,10 +270,6 @@ void suppliesDefaultTracerForNullName() { SdkTracer tracer = (SdkTracer) tracerProvider.get(null); assertThat(tracer.getInstrumentationScopeInfo().getName()) .isEqualTo(SdkTracerProvider.DEFAULT_TRACER_NAME); - - tracer = (SdkTracer) tracerProvider.get(null, null); - assertThat(tracer.getInstrumentationScopeInfo().getName()) - .isEqualTo(SdkTracerProvider.DEFAULT_TRACER_NAME); } @Test diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java index e8620d81924..9bb11509ae4 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java @@ -453,7 +453,7 @@ void exportMoreSpansThanTheMaximumLimit() { void rejectsNullSpanOnEnd() { BatchSpanProcessor processor = BatchSpanProcessor.builder(mockSpanExporter).build(); try { - assertThatCode(() -> processor.onStart(null, null)).doesNotThrowAnyException(); + assertThatCode(() -> processor.onStart(null, null)).isInstanceOf(NullPointerException.class); assertThatThrownBy(() -> processor.onEnd(null)).isInstanceOf(NullPointerException.class); } finally { processor.shutdown(); From 20efcb593c107c533d8491660ea76d108035fc1b Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 8 May 2026 14:20:03 -0500 Subject: [PATCH 04/10] third pass --- .../config/InstrumentationConfigUtil.java | 68 +++++++++ .../incubator/logs/ExtendedDefaultLogger.java | 42 ++++++ .../logs/ExtendedDefaultLoggerProvider.java | 15 ++ .../metrics/ExtendedDefaultMeter.java | 129 +++++++++++++++--- .../metrics/ExtendedDefaultMeterProvider.java | 15 ++ .../ExtendedContextPropagators.java | 17 ++- .../propagation/PassThroughPropagator.java | 17 +++ .../trace/ExtendedDefaultTracer.java | 72 ++++++++++ .../trace/ExtendedDefaultTracerBuilder.java | 10 ++ .../trace/ExtendedDefaultTracerProvider.java | 13 ++ .../current_vs_latest/opentelemetry-api.txt | 2 +- .../opentelemetry-common.txt | 8 +- .../opentelemetry-context.txt | 2 +- .../opentelemetry-exporter-common.txt | 2 +- .../opentelemetry-exporter-logging-otlp.txt | 2 +- .../opentelemetry-exporter-logging.txt | 2 +- .../opentelemetry-exporter-otlp-common.txt | 2 +- .../opentelemetry-exporter-otlp.txt | 2 +- ...y-exporter-sender-grpc-managed-channel.txt | 2 +- .../opentelemetry-exporter-sender-jdk.txt | 2 +- .../opentelemetry-exporter-sender-okhttp.txt | 2 +- .../opentelemetry-exporter-zipkin.txt | 2 +- .../opentelemetry-extension-kotlin.txt | 2 +- ...ntelemetry-extension-trace-propagators.txt | 2 +- .../opentelemetry-opentracing-shim.txt | 2 +- .../opentelemetry-sdk-common.txt | 2 +- ...emetry-sdk-extension-autoconfigure-spi.txt | 2 +- ...ntelemetry-sdk-extension-autoconfigure.txt | 2 +- ...ry-sdk-extension-jaeger-remote-sampler.txt | 2 +- .../opentelemetry-sdk-logs.txt | 2 +- .../opentelemetry-sdk-metrics.txt | 2 +- .../opentelemetry-sdk-testing.txt | 44 +----- .../opentelemetry-sdk-trace.txt | 2 +- .../current_vs_latest/opentelemetry-sdk.txt | 2 +- docs/knowledge/api-design.md | 34 +++++ .../profiles/ProfilesRequestMarshaler.java | 2 + .../jfr/JfrExecutionSampleEventConverter.java | 6 + .../sdk/profiles/jfr/JfrExportExample.java | 2 + .../jfr/JfrLocationDataCompositor.java | 2 + .../YamlDeclarativeConfigProperties.java | 2 + .../logs/EventToSpanEventBridge.java | 3 + .../sdk/OpenTelemetrySdkBuilder.java | 3 + .../sdk/resources/ResourceBuilder.java | 96 ++++++++++--- .../sdk/metrics/SdkDoubleCounter.java | 9 ++ .../sdk/metrics/SdkDoubleGauge.java | 11 +- .../sdk/metrics/SdkDoubleHistogram.java | 9 ++ .../sdk/metrics/SdkDoubleUpDownCounter.java | 9 ++ .../sdk/metrics/SdkLongCounter.java | 9 ++ .../sdk/metrics/SdkLongGauge.java | 11 +- .../sdk/metrics/SdkLongHistogram.java | 9 ++ .../sdk/metrics/SdkLongUpDownCounter.java | 9 ++ .../sdk/metrics/SdkDoubleCounterTest.java | 8 +- .../sdk/metrics/SdkDoubleGaugeTest.java | 7 +- .../sdk/metrics/SdkDoubleHistogramTest.java | 7 +- .../metrics/SdkDoubleUpDownCounterTest.java | 7 +- .../sdk/metrics/SdkLongCounterTest.java | 7 +- .../sdk/metrics/SdkLongGaugeTest.java | 7 +- .../sdk/metrics/SdkLongHistogramTest.java | 7 +- .../sdk/metrics/SdkLongUpDownCounterTest.java | 7 +- .../sdk/profiles/data/ProfileData.java | 2 +- 60 files changed, 631 insertions(+), 148 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java index 4ec91325f46..622b4c6acad 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java @@ -6,6 +6,7 @@ package io.opentelemetry.api.incubator.config; import com.fasterxml.jackson.databind.ObjectMapper; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -30,6 +31,11 @@ public class InstrumentationConfigUtil { @Deprecated @Nullable public static Map peerServiceMapping(ConfigProvider configProvider) { + if (configProvider == null) { + ApiUsageLogger.logNullParam( + InstrumentationConfigUtil.class, "peerServiceMapping", "configProvider"); + return null; + } List serviceMappingList = getOrNull( configProvider, @@ -59,6 +65,11 @@ public static Map peerServiceMapping(ConfigProvider configProvid */ @Nullable public static List httpClientRequestCapturedHeaders(ConfigProvider configProvider) { + if (configProvider == null) { + ApiUsageLogger.logNullParam( + InstrumentationConfigUtil.class, "httpClientRequestCapturedHeaders", "configProvider"); + return null; + } return getOrNull( configProvider, config -> config.getScalarList("request_captured_headers", String.class), @@ -75,6 +86,11 @@ public static List httpClientRequestCapturedHeaders(ConfigProvider confi */ @Nullable public static List httpClientResponseCapturedHeaders(ConfigProvider configProvider) { + if (configProvider == null) { + ApiUsageLogger.logNullParam( + InstrumentationConfigUtil.class, "httpClientResponseCapturedHeaders", "configProvider"); + return null; + } return getOrNull( configProvider, config -> config.getScalarList("response_captured_headers", String.class), @@ -91,6 +107,11 @@ public static List httpClientResponseCapturedHeaders(ConfigProvider conf */ @Nullable public static List httpServerRequestCapturedHeaders(ConfigProvider configProvider) { + if (configProvider == null) { + ApiUsageLogger.logNullParam( + InstrumentationConfigUtil.class, "httpServerRequestCapturedHeaders", "configProvider"); + return null; + } return getOrNull( configProvider, config -> config.getScalarList("request_captured_headers", String.class), @@ -107,6 +128,11 @@ public static List httpServerRequestCapturedHeaders(ConfigProvider confi */ @Nullable public static List httpServerResponseCapturedHeaders(ConfigProvider configProvider) { + if (configProvider == null) { + ApiUsageLogger.logNullParam( + InstrumentationConfigUtil.class, "httpServerResponseCapturedHeaders", "configProvider"); + return null; + } return getOrNull( configProvider, config -> config.getScalarList("response_captured_headers", String.class), @@ -123,6 +149,16 @@ public static List httpServerResponseCapturedHeaders(ConfigProvider conf @Nullable public static DeclarativeConfigProperties javaInstrumentationConfig( ConfigProvider configProvider, String instrumentationName) { + if (configProvider == null) { + ApiUsageLogger.logNullParam( + InstrumentationConfigUtil.class, "javaInstrumentationConfig", "configProvider"); + return null; + } + if (instrumentationName == null) { + ApiUsageLogger.logNullParam( + InstrumentationConfigUtil.class, "javaInstrumentationConfig", "instrumentationName"); + return null; + } return getOrNull(configProvider, config -> config.getStructured(instrumentationName), "java"); } @@ -139,6 +175,18 @@ public static T getOrNull( ConfigProvider configProvider, Function accessor, String... segments) { + if (configProvider == null) { + ApiUsageLogger.logNullParam(InstrumentationConfigUtil.class, "getOrNull", "configProvider"); + return null; + } + if (accessor == null) { + ApiUsageLogger.logNullParam(InstrumentationConfigUtil.class, "getOrNull", "accessor"); + return null; + } + if (segments == null) { + ApiUsageLogger.logNullParam(InstrumentationConfigUtil.class, "getOrNull", "segments"); + return null; + } DeclarativeConfigProperties config = configProvider.getInstrumentationConfig(); for (String segment : segments) { config = config.getStructured(segment); @@ -187,6 +235,26 @@ public static T getInstrumentationConfigModel( String instrumentationName, ObjectMapper objectMapper, Class modelType) { + if (configProvider == null) { + ApiUsageLogger.logNullParam( + InstrumentationConfigUtil.class, "getInstrumentationConfigModel", "configProvider"); + return null; + } + if (instrumentationName == null) { + ApiUsageLogger.logNullParam( + InstrumentationConfigUtil.class, "getInstrumentationConfigModel", "instrumentationName"); + return null; + } + if (objectMapper == null) { + ApiUsageLogger.logNullParam( + InstrumentationConfigUtil.class, "getInstrumentationConfigModel", "objectMapper"); + return null; + } + if (modelType == null) { + ApiUsageLogger.logNullParam( + InstrumentationConfigUtil.class, "getInstrumentationConfigModel", "modelType"); + return null; + } DeclarativeConfigProperties properties = javaInstrumentationConfig(configProvider, instrumentationName); if (properties == null) { diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java index 77b7970ecf0..06df5ecdd09 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java @@ -10,6 +10,7 @@ import io.opentelemetry.api.incubator.common.ExtendedAttributeKey; import io.opentelemetry.api.logs.Logger; import io.opentelemetry.api.logs.Severity; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import java.time.Instant; import java.util.concurrent.TimeUnit; @@ -44,66 +45,107 @@ private NoopExtendedLogRecordBuilder() {} @Override public ExtendedLogRecordBuilder setEventName(String eventName) { + if (eventName == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setEventName", "eventName"); + } return this; } @Override public ExtendedLogRecordBuilder setException(Throwable throwable) { + if (throwable == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setException", "throwable"); + } return this; } @Override public ExtendedLogRecordBuilder setAttribute(ExtendedAttributeKey key, T value) { + if (key == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setAttribute", "key"); + } return this; } @Override public ExtendedLogRecordBuilder setAttribute(AttributeKey key, @Nullable T value) { + if (key == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setAttribute", "key"); + } return this; } @Override public ExtendedLogRecordBuilder setTimestamp(long timestamp, TimeUnit unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setTimestamp", "unit"); + } return this; } @Override public ExtendedLogRecordBuilder setTimestamp(Instant instant) { + if (instant == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setTimestamp", "instant"); + } return this; } @Override public ExtendedLogRecordBuilder setObservedTimestamp(long timestamp, TimeUnit unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setObservedTimestamp", "unit"); + } return this; } @Override public ExtendedLogRecordBuilder setObservedTimestamp(Instant instant) { + if (instant == null) { + ApiUsageLogger.logNullParam( + ExtendedLogRecordBuilder.class, "setObservedTimestamp", "instant"); + } return this; } @Override public ExtendedLogRecordBuilder setContext(Context context) { + if (context == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setContext", "context"); + } return this; } @Override public ExtendedLogRecordBuilder setSeverity(Severity severity) { + if (severity == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setSeverity", "severity"); + } return this; } @Override public ExtendedLogRecordBuilder setSeverityText(String severityText) { + if (severityText == null) { + ApiUsageLogger.logNullParam( + ExtendedLogRecordBuilder.class, "setSeverityText", "severityText"); + } return this; } @Override public ExtendedLogRecordBuilder setBody(String body) { + if (body == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setBody", "body"); + } return this; } @Override public ExtendedLogRecordBuilder setBody(Value body) { + if (body == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setBody", "body"); + } return this; } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLoggerProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLoggerProvider.java index 6cf93296689..1a2d7bf1666 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLoggerProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLoggerProvider.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.logs.Logger; import io.opentelemetry.api.logs.LoggerBuilder; import io.opentelemetry.api.logs.LoggerProvider; +import io.opentelemetry.common.impl.ApiUsageLogger; public class ExtendedDefaultLoggerProvider implements LoggerProvider { @@ -22,6 +23,10 @@ public static LoggerProvider getNoop() { @Override public LoggerBuilder loggerBuilder(String instrumentationScopeName) { + if (instrumentationScopeName == null) { + ApiUsageLogger.logNullParam( + ExtendedDefaultLoggerProvider.class, "loggerBuilder", "instrumentationScopeName"); + } return NOOP_BUILDER; } @@ -29,11 +34,21 @@ private static class NoopLoggerBuilder implements LoggerBuilder { @Override public LoggerBuilder setSchemaUrl(String schemaUrl) { + if (schemaUrl == null) { + ApiUsageLogger.logNullParam( + ExtendedDefaultLoggerProvider.class, "setSchemaUrl", "schemaUrl"); + } return this; } @Override public LoggerBuilder setInstrumentationVersion(String instrumentationVersion) { + if (instrumentationVersion == null) { + ApiUsageLogger.logNullParam( + ExtendedDefaultLoggerProvider.class, + "setInstrumentationVersion", + "instrumentationVersion"); + } return this; } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java index 8283c7bb0b6..31e1393c325 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java @@ -33,6 +33,7 @@ import io.opentelemetry.api.metrics.ObservableLongMeasurement; import io.opentelemetry.api.metrics.ObservableLongUpDownCounter; import io.opentelemetry.api.metrics.ObservableMeasurement; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import java.util.function.Consumer; import javax.annotation.concurrent.ThreadSafe; @@ -65,21 +66,33 @@ static Meter getNoop() { @Override public LongCounterBuilder counterBuilder(String name) { + if (name == null) { + ApiUsageLogger.logNullParam(Meter.class, "counterBuilder", "name"); + } return NOOP_LONG_COUNTER_BUILDER; } @Override public LongUpDownCounterBuilder upDownCounterBuilder(String name) { + if (name == null) { + ApiUsageLogger.logNullParam(Meter.class, "upDownCounterBuilder", "name"); + } return NOOP_LONG_UP_DOWN_COUNTER_BUILDER; } @Override public DoubleHistogramBuilder histogramBuilder(String name) { + if (name == null) { + ApiUsageLogger.logNullParam(Meter.class, "histogramBuilder", "name"); + } return NOOP_DOUBLE_HISTOGRAM_BUILDER; } @Override public DoubleGaugeBuilder gaugeBuilder(String name) { + if (name == null) { + ApiUsageLogger.logNullParam(Meter.class, "gaugeBuilder", "name"); + } return NOOP_DOUBLE_GAUGE_BUILDER; } @@ -100,10 +113,19 @@ public boolean isEnabled() { } @Override - public void add(long value, Attributes attributes, Context context) {} + public void add(long value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongCounter.class, "add", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(LongCounter.class, "add", "context"); + } + } @Override - public void add(long value, Attributes attributes) {} + public void add(long value, Attributes attributes) { + add(value, attributes, Context.current()); + } @Override public void add(long value) {} @@ -116,10 +138,19 @@ public boolean isEnabled() { } @Override - public void add(double value, Attributes attributes, Context context) {} + public void add(double value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleCounter.class, "add", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleCounter.class, "add", "context"); + } + } @Override - public void add(double value, Attributes attributes) {} + public void add(double value, Attributes attributes) { + add(value, attributes, Context.current()); + } @Override public void add(double value) {} @@ -202,10 +233,19 @@ public boolean isEnabled() { } @Override - public void add(long value, Attributes attributes, Context context) {} + public void add(long value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongUpDownCounter.class, "add", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(LongUpDownCounter.class, "add", "context"); + } + } @Override - public void add(long value, Attributes attributes) {} + public void add(long value, Attributes attributes) { + add(value, attributes, Context.current()); + } @Override public void add(long value) {} @@ -218,10 +258,19 @@ public boolean isEnabled() { } @Override - public void add(double value, Attributes attributes, Context context) {} + public void add(double value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleUpDownCounter.class, "add", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleUpDownCounter.class, "add", "context"); + } + } @Override - public void add(double value, Attributes attributes) {} + public void add(double value, Attributes attributes) { + add(value, attributes, Context.current()); + } @Override public void add(double value) {} @@ -307,10 +356,19 @@ public boolean isEnabled() { } @Override - public void record(double value, Attributes attributes, Context context) {} + public void record(double value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleHistogram.class, "record", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleHistogram.class, "record", "context"); + } + } @Override - public void record(double value, Attributes attributes) {} + public void record(double value, Attributes attributes) { + record(value, attributes, Context.current()); + } @Override public void record(double value) {} @@ -323,10 +381,19 @@ public boolean isEnabled() { } @Override - public void record(long value, Attributes attributes, Context context) {} + public void record(long value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongHistogram.class, "record", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(LongHistogram.class, "record", "context"); + } + } @Override - public void record(long value, Attributes attributes) {} + public void record(long value, Attributes attributes) { + record(value, attributes, Context.current()); + } @Override public void record(long value) {} @@ -424,10 +491,19 @@ public boolean isEnabled() { public void set(double value) {} @Override - public void set(double value, Attributes attributes) {} + public void set(double value, Attributes attributes) { + set(value, attributes, Context.current()); + } @Override - public void set(double value, Attributes attributes, Context context) {} + public void set(double value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleGauge.class, "set", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleGauge.class, "set", "context"); + } + } } private static class NoopLongGaugeBuilder implements ExtendedLongGaugeBuilder { @@ -470,10 +546,19 @@ public boolean isEnabled() { public void set(long value) {} @Override - public void set(long value, Attributes attributes) {} + public void set(long value, Attributes attributes) { + set(value, attributes, Context.current()); + } @Override - public void set(long value, Attributes attributes, Context context) {} + public void set(long value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongGauge.class, "set", "attributes"); + } + if (context == null) { + ApiUsageLogger.logNullParam(LongGauge.class, "set", "context"); + } + } } private static class NoopObservableDoubleMeasurement implements ObservableDoubleMeasurement { @@ -481,7 +566,11 @@ private static class NoopObservableDoubleMeasurement implements ObservableDouble public void record(double value) {} @Override - public void record(double value, Attributes attributes) {} + public void record(double value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(ObservableDoubleMeasurement.class, "record", "attributes"); + } + } } private static class NoopObservableLongMeasurement implements ObservableLongMeasurement { @@ -489,6 +578,10 @@ private static class NoopObservableLongMeasurement implements ObservableLongMeas public void record(long value) {} @Override - public void record(long value, Attributes attributes) {} + public void record(long value, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(ObservableLongMeasurement.class, "record", "attributes"); + } + } } } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeterProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeterProvider.java index 3eeca2081f8..9b9299ed133 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeterProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeterProvider.java @@ -8,11 +8,16 @@ import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.MeterBuilder; import io.opentelemetry.api.metrics.MeterProvider; +import io.opentelemetry.common.impl.ApiUsageLogger; /** A {@link MeterProvider} that does nothing. */ public class ExtendedDefaultMeterProvider implements MeterProvider { @Override public MeterBuilder meterBuilder(String instrumentationScopeName) { + if (instrumentationScopeName == null) { + ApiUsageLogger.logNullParam( + ExtendedDefaultMeterProvider.class, "meterBuilder", "instrumentationScopeName"); + } return BUILDER_INSTANCE; } @@ -29,11 +34,21 @@ private static class NoopMeterBuilder implements MeterBuilder { @Override public MeterBuilder setSchemaUrl(String schemaUrl) { + if (schemaUrl == null) { + ApiUsageLogger.logNullParam( + ExtendedDefaultMeterProvider.class, "setSchemaUrl", "schemaUrl"); + } return this; } @Override public MeterBuilder setInstrumentationVersion(String instrumentationScopeVersion) { + if (instrumentationScopeVersion == null) { + ApiUsageLogger.logNullParam( + ExtendedDefaultMeterProvider.class, + "setInstrumentationVersion", + "instrumentationScopeVersion"); + } return this; } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/ExtendedContextPropagators.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/ExtendedContextPropagators.java index 2af3cae35ed..36fa5e219cb 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/ExtendedContextPropagators.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/ExtendedContextPropagators.java @@ -6,6 +6,7 @@ package io.opentelemetry.api.incubator.propagation; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.context.propagation.TextMapGetter; @@ -47,6 +48,11 @@ public String get(@Nullable Map carrier, String key) { * @param propagators provide the propagators from {@link OpenTelemetry#getPropagators()} */ public static Map getTextMapPropagationContext(ContextPropagators propagators) { + if (propagators == null) { + ApiUsageLogger.logNullParam( + ExtendedContextPropagators.class, "getTextMapPropagationContext", "propagators"); + return Collections.emptyMap(); + } Map carrier = new HashMap<>(); propagators .getTextMapPropagator() @@ -71,10 +77,17 @@ public static Map getTextMapPropagationContext(ContextPropagator */ public static Context extractTextMapPropagationContext( Map carrier, ContextPropagators propagators) { - Context current = Context.current(); + if (propagators == null) { + ApiUsageLogger.logNullParam( + ExtendedContextPropagators.class, "extractTextMapPropagationContext", "propagators"); + return Context.current(); + } if (carrier == null) { - return current; + ApiUsageLogger.logNullParam( + ExtendedContextPropagators.class, "extractTextMapPropagationContext", "carrier"); + return Context.current(); } + Context current = Context.current(); CaseInsensitiveMap caseInsensitiveMap = new CaseInsensitiveMap(carrier); return propagators.getTextMapPropagator().extract(current, caseInsensitiveMap, TEXT_MAP_GETTER); } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/PassThroughPropagator.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/PassThroughPropagator.java index a5f8507a13f..1fe179cd19e 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/PassThroughPropagator.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/PassThroughPropagator.java @@ -7,6 +7,7 @@ import static java.util.Objects.requireNonNull; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.ContextKey; import io.opentelemetry.context.propagation.ContextPropagators; @@ -76,6 +77,14 @@ public Collection fields() { @Override public void inject(Context context, @Nullable C carrier, TextMapSetter setter) { + if (context == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "inject", "context"); + return; + } + if (setter == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "inject", "setter"); + return; + } List extracted = context.get(EXTRACTED_KEY_VALUES); if (extracted != null) { for (int i = 0; i < extracted.size(); i += 2) { @@ -86,6 +95,14 @@ public void inject(Context context, @Nullable C carrier, TextMapSetter se @Override public Context extract(Context context, @Nullable C carrier, TextMapGetter getter) { + if (context == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "extract", "context"); + return Context.root(); + } + if (getter == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "extract", "getter"); + return context; + } List extracted = null; for (String field : fields) { String value = getter.get(carrier, field); diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracer.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracer.java index 40d72caba86..295aaded77f 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracer.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracer.java @@ -39,6 +39,9 @@ public boolean isEnabled() { @Override public ExtendedSpanBuilder spanBuilder(String spanName) { + if (spanName == null) { + ApiUsageLogger.logNullParam(Tracer.class, "spanBuilder", "spanName"); + } return NoopSpanBuilder.create(); } @@ -74,6 +77,14 @@ public NoopSpanBuilder setParent(Context context) { @Override public NoopSpanBuilder setParentFrom( ContextPropagators propagators, Map carrier) { + if (propagators == null) { + ApiUsageLogger.logNullParam(ExtendedSpanBuilder.class, "setParentFrom", "propagators"); + return this; + } + if (carrier == null) { + ApiUsageLogger.logNullParam(ExtendedSpanBuilder.class, "setParentFrom", "carrier"); + return this; + } setParent(ExtendedContextPropagators.extractTextMapPropagationContext(carrier, propagators)); return this; } @@ -86,51 +97,95 @@ public NoopSpanBuilder setNoParent() { @Override public NoopSpanBuilder addLink(SpanContext spanContext) { + if (spanContext == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "addLink", "spanContext"); + return this; + } return this; } @Override public NoopSpanBuilder addLink(SpanContext spanContext, Attributes attributes) { + if (spanContext == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "addLink", "spanContext"); + return this; + } + if (attributes == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "addLink", "attributes"); + return this; + } return this; } @Override public NoopSpanBuilder setAttribute(String key, @Nullable String value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAttribute", "key"); + return this; + } return this; } @Override public NoopSpanBuilder setAttribute(String key, long value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAttribute", "key"); + return this; + } return this; } @Override public NoopSpanBuilder setAttribute(String key, double value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAttribute", "key"); + return this; + } return this; } @Override public NoopSpanBuilder setAttribute(String key, boolean value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAttribute", "key"); + return this; + } return this; } @Override public NoopSpanBuilder setAttribute(AttributeKey key, @Nullable T value) { + if (key == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAttribute", "key"); + return this; + } return this; } @Override public NoopSpanBuilder setAllAttributes(Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAllAttributes", "attributes"); + return this; + } return this; } @Override public NoopSpanBuilder setSpanKind(SpanKind spanKind) { + if (spanKind == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setSpanKind", "spanKind"); + return this; + } return this; } @Override public NoopSpanBuilder setStartTimestamp(long startTimestamp, TimeUnit unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setStartTimestamp", "unit"); + return this; + } return this; } @@ -142,17 +197,34 @@ public T startAndCall(SpanCallable spanCallable) @Override public T startAndCall( SpanCallable spanCallable, BiConsumer handleException) throws E { + if (handleException == null) { + ApiUsageLogger.logNullParam(ExtendedSpanBuilder.class, "startAndCall", "handleException"); + return spanCallable.callInSpan(); + } return spanCallable.callInSpan(); } @Override public void startAndRun(SpanRunnable runnable) throws E { + if (runnable == null) { + ApiUsageLogger.logNullParam(ExtendedSpanBuilder.class, "startAndRun", "runnable"); + return; + } runnable.runInSpan(); } @Override public void startAndRun( SpanRunnable runnable, BiConsumer handleException) throws E { + if (runnable == null) { + ApiUsageLogger.logNullParam(ExtendedSpanBuilder.class, "startAndRun", "runnable"); + return; + } + if (handleException == null) { + ApiUsageLogger.logNullParam(ExtendedSpanBuilder.class, "startAndRun", "handleException"); + runnable.runInSpan(); + return; + } runnable.runInSpan(); } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerBuilder.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerBuilder.java index 20469674ae5..d1fb8fc063b 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerBuilder.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerBuilder.java @@ -7,6 +7,7 @@ import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.TracerBuilder; +import io.opentelemetry.common.impl.ApiUsageLogger; final class ExtendedDefaultTracerBuilder implements TracerBuilder { private static final ExtendedDefaultTracerBuilder INSTANCE = new ExtendedDefaultTracerBuilder(); @@ -17,11 +18,20 @@ static TracerBuilder getInstance() { @Override public TracerBuilder setSchemaUrl(String schemaUrl) { + if (schemaUrl == null) { + ApiUsageLogger.logNullParam(ExtendedDefaultTracerBuilder.class, "setSchemaUrl", "schemaUrl"); + } return this; } @Override public TracerBuilder setInstrumentationVersion(String instrumentationScopeVersion) { + if (instrumentationScopeVersion == null) { + ApiUsageLogger.logNullParam( + ExtendedDefaultTracerBuilder.class, + "setInstrumentationVersion", + "instrumentationScopeVersion"); + } return this; } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerProvider.java index b7bd2133ad7..add4a30cd2d 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerProvider.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.TracerBuilder; import io.opentelemetry.api.trace.TracerProvider; +import io.opentelemetry.common.impl.ApiUsageLogger; import javax.annotation.concurrent.ThreadSafe; @ThreadSafe @@ -21,16 +22,28 @@ public static TracerProvider getNoop() { @Override public Tracer get(String instrumentationScopeName) { + if (instrumentationScopeName == null) { + ApiUsageLogger.logNullParam( + ExtendedDefaultTracerProvider.class, "get", "instrumentationScopeName"); + } return ExtendedDefaultTracer.getNoop(); } @Override public Tracer get(String instrumentationScopeName, String instrumentationScopeVersion) { + if (instrumentationScopeName == null) { + ApiUsageLogger.logNullParam( + ExtendedDefaultTracerProvider.class, "get", "instrumentationScopeName"); + } return ExtendedDefaultTracer.getNoop(); } @Override public TracerBuilder tracerBuilder(String instrumentationScopeName) { + if (instrumentationScopeName == null) { + ApiUsageLogger.logNullParam( + ExtendedDefaultTracerProvider.class, "tracerBuilder", "instrumentationScopeName"); + } return ExtendedDefaultTracerBuilder.getInstance(); } diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt index 4883d2787cc..2ef55a6d17f 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-api-1.62.0-SNAPSHOT.jar against opentelemetry-api-1.61.0.jar +Comparing source compatibility of opentelemetry-api-1.62.0-SNAPSHOT.jar against opentelemetry-api-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-common.txt b/docs/apidiffs/current_vs_latest/opentelemetry-common.txt index 80201246f3b..9033ffed914 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-common.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-common.txt @@ -1,6 +1,2 @@ -Comparing source compatibility of opentelemetry-common-1.62.0-SNAPSHOT.jar against opentelemetry-common-1.61.0.jar -+++ NEW CLASS: PUBLIC(+) FINAL(+) io.opentelemetry.common.impl.ApiUsageLogger (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) STATIC(+) void logNullParam(java.lang.Class, java.lang.String, java.lang.String) - +++ NEW METHOD: PUBLIC(+) STATIC(+) void logUsageIssue(java.lang.Class, java.lang.String, java.lang.String) +Comparing source compatibility of opentelemetry-common-1.62.0-SNAPSHOT.jar against opentelemetry-common-1.62.0.jar +No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-context.txt b/docs/apidiffs/current_vs_latest/opentelemetry-context.txt index 96fe5ab9ea7..fd7aa7c16d3 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-context.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-context.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-context-1.62.0-SNAPSHOT.jar against opentelemetry-context-1.61.0.jar +Comparing source compatibility of opentelemetry-context-1.62.0-SNAPSHOT.jar against opentelemetry-context-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-common.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-common.txt index 4733dbc35f4..3a02c0ba471 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-common.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-common.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-common-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-common-1.61.0.jar +Comparing source compatibility of opentelemetry-exporter-common-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-common-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging-otlp.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging-otlp.txt index 191768ca62d..207c760ad5e 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging-otlp.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging-otlp.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-logging-otlp-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-logging-otlp-1.61.0.jar +Comparing source compatibility of opentelemetry-exporter-logging-otlp-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-logging-otlp-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging.txt index 5839a85004d..30cf21d5739 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-logging-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-logging-1.61.0.jar +Comparing source compatibility of opentelemetry-exporter-logging-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-logging-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp-common.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp-common.txt index 3436ab83e0a..84d6ea944db 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp-common.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp-common.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-otlp-common-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-common-1.61.0.jar +Comparing source compatibility of opentelemetry-exporter-otlp-common-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-common-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt index 2320b14ba96..dbd44b091a0 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-otlp-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-1.61.0.jar +Comparing source compatibility of opentelemetry-exporter-otlp-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-grpc-managed-channel.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-grpc-managed-channel.txt index 815f7a1ab1c..cbe2d83a42b 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-grpc-managed-channel.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-grpc-managed-channel.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-sender-grpc-managed-channel-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-sender-grpc-managed-channel-1.61.0.jar +Comparing source compatibility of opentelemetry-exporter-sender-grpc-managed-channel-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-sender-grpc-managed-channel-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-jdk.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-jdk.txt index 40e0bab7205..d177cf0c2b9 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-jdk.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-jdk.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-sender-jdk-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-sender-jdk-1.61.0.jar +Comparing source compatibility of opentelemetry-exporter-sender-jdk-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-sender-jdk-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-okhttp.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-okhttp.txt index c25cd961eb6..6610e798c60 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-okhttp.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-okhttp.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-sender-okhttp-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-sender-okhttp-1.61.0.jar +Comparing source compatibility of opentelemetry-exporter-sender-okhttp-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-sender-okhttp-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt index b489f117461..426e3dd363f 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-zipkin-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-zipkin-1.61.0.jar +Comparing source compatibility of opentelemetry-exporter-zipkin-1.62.0-SNAPSHOT.jar against opentelemetry-exporter-zipkin-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-extension-kotlin.txt b/docs/apidiffs/current_vs_latest/opentelemetry-extension-kotlin.txt index e34f4f154e7..5b7a2434ba3 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-extension-kotlin.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-extension-kotlin.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-extension-kotlin-1.62.0-SNAPSHOT.jar against opentelemetry-extension-kotlin-1.61.0.jar +Comparing source compatibility of opentelemetry-extension-kotlin-1.62.0-SNAPSHOT.jar against opentelemetry-extension-kotlin-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-extension-trace-propagators.txt b/docs/apidiffs/current_vs_latest/opentelemetry-extension-trace-propagators.txt index 26371a3afc3..3e848f2cfcf 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-extension-trace-propagators.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-extension-trace-propagators.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-extension-trace-propagators-1.62.0-SNAPSHOT.jar against opentelemetry-extension-trace-propagators-1.61.0.jar +Comparing source compatibility of opentelemetry-extension-trace-propagators-1.62.0-SNAPSHOT.jar against opentelemetry-extension-trace-propagators-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-opentracing-shim.txt b/docs/apidiffs/current_vs_latest/opentelemetry-opentracing-shim.txt index f7b6cc9ce58..ca27fcdc9bd 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-opentracing-shim.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-opentracing-shim.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-opentracing-shim-1.62.0-SNAPSHOT.jar against opentelemetry-opentracing-shim-1.61.0.jar +Comparing source compatibility of opentelemetry-opentracing-shim-1.62.0-SNAPSHOT.jar against opentelemetry-opentracing-shim-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-common.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-common.txt index eb8372e2658..9b6b23cdf8f 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-common.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-common.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-common-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-common-1.61.0.jar +Comparing source compatibility of opentelemetry-sdk-common-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-common-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure-spi.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure-spi.txt index 73948123f81..cdbf75c8c40 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure-spi.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure-spi.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-spi-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-spi-1.61.0.jar +Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-spi-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-spi-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure.txt index 4125dc70f37..4a325f21ccb 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-1.61.0.jar +Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-jaeger-remote-sampler.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-jaeger-remote-sampler.txt index cebfc747e5e..7b84d250dbd 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-jaeger-remote-sampler.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-jaeger-remote-sampler.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-extension-jaeger-remote-sampler-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-extension-jaeger-remote-sampler-1.61.0.jar +Comparing source compatibility of opentelemetry-sdk-extension-jaeger-remote-sampler-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-extension-jaeger-remote-sampler-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt index 38f40be798a..083d2e08edd 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-logs-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-logs-1.61.0.jar +Comparing source compatibility of opentelemetry-sdk-logs-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-logs-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-metrics.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-metrics.txt index a874b822c9f..27e52e2cc57 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-metrics.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-metrics.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-metrics-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-metrics-1.61.0.jar +Comparing source compatibility of opentelemetry-sdk-metrics-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-metrics-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt index e6213f43ccf..e5ab3f62a95 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt @@ -1,42 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-testing-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-testing-1.61.0.jar -*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.DoubleGaugeAssert (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) FINAL(+) io.opentelemetry.sdk.testing.assertj.DoubleGaugeAssert containsPointsSatisfying(java.util.function.Consumer[]) - +++ NEW ANNOTATION: java.lang.SafeVarargs - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.assertj.DoubleGaugeAssert containsPointsSatisfying(java.lang.Iterable>) -*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.DoublePointAssert (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.assertj.DoublePointAssert hasValueSatisfying(java.util.function.Consumer>) -*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.DoubleSumAssert (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) FINAL(+) io.opentelemetry.sdk.testing.assertj.DoubleSumAssert containsPointsSatisfying(java.util.function.Consumer[]) - +++ NEW ANNOTATION: java.lang.SafeVarargs - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.assertj.DoubleSumAssert containsPointsSatisfying(java.lang.Iterable>) -*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.ExponentialHistogramAssert (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) FINAL(+) io.opentelemetry.sdk.testing.assertj.ExponentialHistogramAssert containsPointsSatisfying(java.util.function.Consumer[]) - +++ NEW ANNOTATION: java.lang.SafeVarargs - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.assertj.ExponentialHistogramAssert containsPointsSatisfying(java.lang.Iterable>) -*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.HistogramAssert (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) FINAL(+) io.opentelemetry.sdk.testing.assertj.HistogramAssert containsPointsSatisfying(java.util.function.Consumer[]) - +++ NEW ANNOTATION: java.lang.SafeVarargs - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.assertj.HistogramAssert containsPointsSatisfying(java.lang.Iterable>) -*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.LongGaugeAssert (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) FINAL(+) io.opentelemetry.sdk.testing.assertj.LongGaugeAssert containsPointsSatisfying(java.util.function.Consumer[]) - +++ NEW ANNOTATION: java.lang.SafeVarargs - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.assertj.LongGaugeAssert containsPointsSatisfying(java.lang.Iterable>) -*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.LongPointAssert (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.assertj.LongPointAssert hasValueSatisfying(java.util.function.Consumer>) -*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.LongSumAssert (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) FINAL(+) io.opentelemetry.sdk.testing.assertj.LongSumAssert containsPointsSatisfying(java.util.function.Consumer[]) - +++ NEW ANNOTATION: java.lang.SafeVarargs - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.assertj.LongSumAssert containsPointsSatisfying(java.lang.Iterable>) -*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.SummaryAssert (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) FINAL(+) io.opentelemetry.sdk.testing.assertj.SummaryAssert containsPointsSatisfying(java.util.function.Consumer[]) - +++ NEW ANNOTATION: java.lang.SafeVarargs - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.assertj.SummaryAssert containsPointsSatisfying(java.lang.Iterable>) +Comparing source compatibility of opentelemetry-sdk-testing-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-testing-1.62.0.jar +No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt index 67cfec2fda6..aadba67f1fb 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-trace-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-trace-1.61.0.jar +Comparing source compatibility of opentelemetry-sdk-trace-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-trace-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt index 89bf7a6cacd..4b76b6cb758 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-1.61.0.jar +Comparing source compatibility of opentelemetry-sdk-1.62.0-SNAPSHOT.jar against opentelemetry-sdk-1.62.0.jar No changes. \ No newline at end of file diff --git a/docs/knowledge/api-design.md b/docs/knowledge/api-design.md index 9c91faaf72e..03e8a9beaec 100644 --- a/docs/knowledge/api-design.md +++ b/docs/knowledge/api-design.md @@ -108,6 +108,32 @@ To investigate misuse, enable the logger named `io.opentelemetry.usage` at `FINE development, or periodically in staging/production. Check each argument once, at the first public entry point — internal methods called by that entry point do not need to re-validate. +When a public method with fewer arguments delegates immediately to an overload with more +arguments, only the most-args overload needs the null guard — the shorter overload passes +through without risk of NPE before the check fires: + +```java +// 2-arg overload — no check needed, delegates immediately +@Override +public void add(long increment, Attributes attributes) { + add(increment, attributes, Context.current()); +} + +// 3-arg overload — check all new parameters here +@Override +public void add(long increment, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongCounter.class, "add", "attributes"); + return; + } + if (context == null) { + ApiUsageLogger.logNullParam(LongCounter.class, "add", "context"); + return; + } + // ... normal implementation +} +``` + ### SDK extension interfaces and SPIs These interfaces are called by the SDK, not directly by application developers. @@ -121,6 +147,14 @@ not misuse by an application developer. Use `Objects.requireNonNull` — a hard the bug immediately and unambiguously, which is preferable to silent degradation that would mask the underlying SDK defect. +Static `create(...)` factory methods on SDK data interfaces (`LinkData`, `EventData`, +`StatusData`, `ProfileData`, etc.) follow the same rule. User-written exporters and processors +also call these factories and are not NullAway-verified; and there is no meaningful noop return +value — returning a structurally-valid but semantically-empty object would silently corrupt the +export pipeline rather than surface the bug. Note: if the factory delegates immediately to an +AutoValue constructor (`new AutoValue_Immutable*`), the generated constructor already checks +every non-`@Nullable` field — adding `requireNonNull` before the call is redundant. + ### Where to implement guards Add guards in the concrete implementation class, or in an existing `default` interface method diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/ProfilesRequestMarshaler.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/ProfilesRequestMarshaler.java index ae1f3cc905e..27c71206801 100644 --- a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/ProfilesRequestMarshaler.java +++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/ProfilesRequestMarshaler.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.util.Collection; import java.util.Collections; +import java.util.Objects; /** * {@link Marshaler} to convert SDK {@link ProfileData} to OTLP ExportProfilesServiceRequest. @@ -48,6 +49,7 @@ public final class ProfilesRequestMarshaler extends MarshalerWithSize { * ProfileData} into a serialized OTLP ExportProfilesServiceRequest. */ public static ProfilesRequestMarshaler create(Collection profileList) { + Objects.requireNonNull(profileList, "profileList"); // Verify all profiles in batch have identical dictionary ProfilesDictionaryData profilesDictionaryData = null; for (ProfileData profileData : profileList) { diff --git a/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrExecutionSampleEventConverter.java b/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrExecutionSampleEventConverter.java index 326e7ab7807..80aa7d3cadc 100644 --- a/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrExecutionSampleEventConverter.java +++ b/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrExecutionSampleEventConverter.java @@ -5,6 +5,7 @@ package io.opentelemetry.sdk.profiles.jfr; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.sdk.profiles.ProfilesDictionaryCompositor; import io.opentelemetry.sdk.profiles.SampleCompositionBuilder; import io.opentelemetry.sdk.profiles.SampleCompositionKey; @@ -64,6 +65,11 @@ public static JfrExecutionSampleEventConverter create() { * @param recordedEvent the event to process. */ public void accept(RecordedEvent recordedEvent) { + if (recordedEvent == null) { + ApiUsageLogger.logNullParam( + JfrExecutionSampleEventConverter.class, "accept", "recordedEvent"); + return; + } if (!"jdk.ExecutionSample".equals(recordedEvent.getEventType().getName())) { return; } diff --git a/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrExportExample.java b/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrExportExample.java index 379015d176d..41244e50b2d 100644 --- a/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrExportExample.java +++ b/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrExportExample.java @@ -20,6 +20,7 @@ import java.nio.file.Path; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.concurrent.TimeUnit; import jdk.jfr.consumer.RecordingFile; @@ -60,6 +61,7 @@ public static void main(String[] args) throws IOException { * @throws IOException if the conversion fails. */ public static ProfileData convertJfrFile(Path jfrFilePath) throws IOException { + Objects.requireNonNull(jfrFilePath, "jfrFilePath"); JfrExecutionSampleEventConverter converter = JfrExecutionSampleEventConverter.create(); diff --git a/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrLocationDataCompositor.java b/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrLocationDataCompositor.java index 7f505de0938..fb35f713504 100644 --- a/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrLocationDataCompositor.java +++ b/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrLocationDataCompositor.java @@ -12,6 +12,7 @@ import io.opentelemetry.sdk.profiles.data.StackData; import java.util.Collections; import java.util.List; +import java.util.Objects; import jdk.jfr.consumer.RecordedFrame; /** @@ -36,6 +37,7 @@ public class JfrLocationDataCompositor { */ public static JfrLocationDataCompositor create( ProfilesDictionaryCompositor profilesDictionaryCompositor) { + Objects.requireNonNull(profilesDictionaryCompositor, "profilesDictionaryCompositor"); return new JfrLocationDataCompositor(profilesDictionaryCompositor); } diff --git a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/YamlDeclarativeConfigProperties.java b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/YamlDeclarativeConfigProperties.java index 8a15640c414..8ea8faca9f0 100644 --- a/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/YamlDeclarativeConfigProperties.java +++ b/sdk-extensions/declarative-config/src/main/java/io/opentelemetry/sdk/autoconfigure/declarativeconfig/YamlDeclarativeConfigProperties.java @@ -76,6 +76,8 @@ private YamlDeclarativeConfigProperties( @SuppressWarnings("unchecked") public static YamlDeclarativeConfigProperties create( Map properties, ComponentLoader componentLoader) { + Objects.requireNonNull(properties, "properties"); + Objects.requireNonNull(componentLoader, "componentLoader"); Map simpleEntries = new LinkedHashMap<>(); Map> listEntries = new LinkedHashMap<>(); Map mapEntries = new LinkedHashMap<>(); diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/logs/EventToSpanEventBridge.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/logs/EventToSpanEventBridge.java index 7e646499a27..354d5830351 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/logs/EventToSpanEventBridge.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/logs/EventToSpanEventBridge.java @@ -11,6 +11,7 @@ import io.opentelemetry.sdk.logs.LogRecordProcessor; import io.opentelemetry.sdk.logs.ReadWriteLogRecord; import io.opentelemetry.sdk.logs.data.LogRecordData; +import java.util.Objects; import java.util.concurrent.TimeUnit; /** @@ -51,6 +52,8 @@ public static EventToSpanEventBridge create() { @Override public void onEmit(Context context, ReadWriteLogRecord logRecord) { + Objects.requireNonNull(context, "context"); + Objects.requireNonNull(logRecord, "logRecord"); LogRecordData logRecordData = logRecord.toLogRecordData(); String eventName = logRecordData.getEventName(); if (eventName == null || eventName.isEmpty()) { diff --git a/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdkBuilder.java b/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdkBuilder.java index c7168599554..aafce73a479 100644 --- a/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdkBuilder.java +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdkBuilder.java @@ -54,6 +54,7 @@ public final class OpenTelemetrySdkBuilder { * @see SdkTracerProvider#builder() */ public OpenTelemetrySdkBuilder setTracerProvider(SdkTracerProvider tracerProvider) { + requireNonNull(tracerProvider, "tracerProvider"); this.tracerProvider = tracerProvider; return this; } @@ -66,6 +67,7 @@ public OpenTelemetrySdkBuilder setTracerProvider(SdkTracerProvider tracerProvide * @see SdkMeterProvider#builder() */ public OpenTelemetrySdkBuilder setMeterProvider(SdkMeterProvider meterProvider) { + requireNonNull(meterProvider, "meterProvider"); this.meterProvider = meterProvider; return this; } @@ -78,6 +80,7 @@ public OpenTelemetrySdkBuilder setMeterProvider(SdkMeterProvider meterProvider) * @since 1.19.0 */ public OpenTelemetrySdkBuilder setLoggerProvider(SdkLoggerProvider loggerProvider) { + requireNonNull(loggerProvider, "loggerProvider"); this.loggerProvider = loggerProvider; return this; } diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java b/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java index 19daf8a5447..1239a179cf7 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java @@ -33,9 +33,15 @@ public class ResourceBuilder { * @return this Builder */ public ResourceBuilder put(String key, String value) { - if (key != null && value != null) { - attributesBuilder.put(key, value); + if (key == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "key"); + return this; + } + if (value == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "value"); + return this; } + attributesBuilder.put(key, value); return this; } @@ -48,9 +54,11 @@ public ResourceBuilder put(String key, String value) { * @return this Builder */ public ResourceBuilder put(String key, long value) { - if (key != null) { - attributesBuilder.put(key, value); + if (key == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "key"); + return this; } + attributesBuilder.put(key, value); return this; } @@ -63,9 +71,11 @@ public ResourceBuilder put(String key, long value) { * @return this Builder */ public ResourceBuilder put(String key, double value) { - if (key != null) { - attributesBuilder.put(key, value); + if (key == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "key"); + return this; } + attributesBuilder.put(key, value); return this; } @@ -78,9 +88,11 @@ public ResourceBuilder put(String key, double value) { * @return this Builder */ public ResourceBuilder put(String key, boolean value) { - if (key != null) { - attributesBuilder.put(key, value); + if (key == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "key"); + return this; } + attributesBuilder.put(key, value); return this; } @@ -93,9 +105,15 @@ public ResourceBuilder put(String key, boolean value) { * @return this Builder */ public ResourceBuilder put(String key, String... values) { - if (key != null && values != null) { - attributesBuilder.put(key, values); + if (key == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "key"); + return this; } + if (values == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "values"); + return this; + } + attributesBuilder.put(key, values); return this; } @@ -108,9 +126,15 @@ public ResourceBuilder put(String key, String... values) { * @return this Builder */ public ResourceBuilder put(String key, long... values) { - if (key != null && values != null) { - attributesBuilder.put(key, values); + if (key == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "key"); + return this; + } + if (values == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "values"); + return this; } + attributesBuilder.put(key, values); return this; } @@ -123,9 +147,15 @@ public ResourceBuilder put(String key, long... values) { * @return this Builder */ public ResourceBuilder put(String key, double... values) { - if (key != null && values != null) { - attributesBuilder.put(key, values); + if (key == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "key"); + return this; + } + if (values == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "values"); + return this; } + attributesBuilder.put(key, values); return this; } @@ -138,15 +168,29 @@ public ResourceBuilder put(String key, double... values) { * @return this Builder */ public ResourceBuilder put(String key, boolean... values) { - if (key != null && values != null) { - attributesBuilder.put(key, values); + if (key == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "key"); + return this; + } + if (values == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "values"); + return this; } + attributesBuilder.put(key, values); return this; } /** Puts a {@link AttributeKey} with associated value into this. */ public ResourceBuilder put(AttributeKey key, T value) { - if (key != null && key.getKey() != null && !key.getKey().isEmpty() && value != null) { + if (key == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "key"); + return this; + } + if (value == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "value"); + return this; + } + if (key.getKey() != null && !key.getKey().isEmpty()) { attributesBuilder.put(key, value); } return this; @@ -154,7 +198,11 @@ public ResourceBuilder put(AttributeKey key, T value) { /** Puts a {@link AttributeKey} with associated value into this. */ public ResourceBuilder put(AttributeKey key, int value) { - if (key != null && key.getKey() != null && !key.getKey().isEmpty()) { + if (key == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "put", "key"); + return this; + } + if (key.getKey() != null && !key.getKey().isEmpty()) { attributesBuilder.put(key, value); } return this; @@ -162,17 +210,21 @@ public ResourceBuilder put(AttributeKey key, int value) { /** Puts all {@link Attributes} into this. */ public ResourceBuilder putAll(Attributes attributes) { - if (attributes != null) { - attributesBuilder.putAll(attributes); + if (attributes == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "putAll", "attributes"); + return this; } + attributesBuilder.putAll(attributes); return this; } /** Puts all attributes from {@link Resource} into this. */ public ResourceBuilder putAll(Resource resource) { - if (resource != null) { - attributesBuilder.putAll(resource.getAttributes()); + if (resource == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "putAll", "resource"); + return this; } + attributesBuilder.putAll(resource.getAttributes()); return this; } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java index d3ffd20f5c6..d742fd23134 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java @@ -10,6 +10,7 @@ import io.opentelemetry.api.metrics.DoubleCounterBuilder; import io.opentelemetry.api.metrics.ObservableDoubleCounter; import io.opentelemetry.api.metrics.ObservableDoubleMeasurement; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.internal.ThrottlingLogger; import io.opentelemetry.sdk.metrics.internal.descriptor.Advice; @@ -40,6 +41,14 @@ public boolean isEnabled() { @Override public void add(double increment, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleCounter.class, "add", "attributes"); + return; + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleCounter.class, "add", "context"); + return; + } if (increment < 0) { throttlingLogger.log( Level.WARNING, diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java index c3ee314361c..3cba8529b6e 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.metrics.LongGaugeBuilder; import io.opentelemetry.api.metrics.ObservableDoubleGauge; import io.opentelemetry.api.metrics.ObservableDoubleMeasurement; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.metrics.internal.descriptor.InstrumentDescriptor; import io.opentelemetry.sdk.metrics.internal.state.WriteableMetricStorage; @@ -35,11 +36,19 @@ public boolean isEnabled() { @Override public void set(double value, Attributes attributes) { - storage.recordDouble(value, attributes, Context.current()); + set(value, attributes, Context.current()); } @Override public void set(double value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleGauge.class, "set", "attributes"); + return; + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleGauge.class, "set", "context"); + return; + } storage.recordDouble(value, attributes, context); } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogram.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogram.java index 56c1dd20bd9..c09af1dffc0 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogram.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogram.java @@ -9,6 +9,7 @@ import io.opentelemetry.api.metrics.DoubleHistogram; import io.opentelemetry.api.metrics.DoubleHistogramBuilder; import io.opentelemetry.api.metrics.LongHistogramBuilder; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.internal.ThrottlingLogger; import io.opentelemetry.sdk.metrics.internal.aggregator.ExplicitBucketHistogramUtils; @@ -40,6 +41,14 @@ public boolean isEnabled() { @Override public void record(double value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleHistogram.class, "record", "attributes"); + return; + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleHistogram.class, "record", "context"); + return; + } if (value < 0) { throttlingLogger.log( Level.WARNING, diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java index 0c94d89cba9..3122949c95c 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java @@ -10,6 +10,7 @@ import io.opentelemetry.api.metrics.DoubleUpDownCounterBuilder; import io.opentelemetry.api.metrics.ObservableDoubleMeasurement; import io.opentelemetry.api.metrics.ObservableDoubleUpDownCounter; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.metrics.internal.descriptor.Advice; import io.opentelemetry.sdk.metrics.internal.descriptor.InstrumentDescriptor; @@ -35,6 +36,14 @@ public boolean isEnabled() { @Override public void add(double increment, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(DoubleUpDownCounter.class, "add", "attributes"); + return; + } + if (context == null) { + ApiUsageLogger.logNullParam(DoubleUpDownCounter.class, "add", "context"); + return; + } storage.recordDouble(increment, attributes, context); } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java index d1834272c14..56db69d3b49 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.metrics.LongCounterBuilder; import io.opentelemetry.api.metrics.ObservableLongCounter; import io.opentelemetry.api.metrics.ObservableLongMeasurement; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.internal.ThrottlingLogger; import io.opentelemetry.sdk.metrics.internal.descriptor.InstrumentDescriptor; @@ -41,6 +42,14 @@ public boolean isEnabled() { @Override public void add(long increment, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongCounter.class, "add", "attributes"); + return; + } + if (context == null) { + ApiUsageLogger.logNullParam(LongCounter.class, "add", "context"); + return; + } if (increment < 0) { throttlingLogger.log( Level.WARNING, diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java index 045d8cc5aa9..924006fc34a 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java @@ -10,6 +10,7 @@ import io.opentelemetry.api.metrics.LongGaugeBuilder; import io.opentelemetry.api.metrics.ObservableLongGauge; import io.opentelemetry.api.metrics.ObservableLongMeasurement; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.metrics.internal.descriptor.Advice; import io.opentelemetry.sdk.metrics.internal.descriptor.InstrumentDescriptor; @@ -34,11 +35,19 @@ public boolean isEnabled() { @Override public void set(long value, Attributes attributes) { - storage.recordLong(value, attributes, Context.current()); + set(value, attributes, Context.current()); } @Override public void set(long value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongGauge.class, "set", "attributes"); + return; + } + if (context == null) { + ApiUsageLogger.logNullParam(LongGauge.class, "set", "context"); + return; + } storage.recordLong(value, attributes, context); } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongHistogram.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongHistogram.java index 7ddcce06d8e..342315d6840 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongHistogram.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongHistogram.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.LongHistogram; import io.opentelemetry.api.metrics.LongHistogramBuilder; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.internal.ThrottlingLogger; import io.opentelemetry.sdk.metrics.internal.aggregator.ExplicitBucketHistogramUtils; @@ -41,6 +42,14 @@ public boolean isEnabled() { @Override public void record(long value, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongHistogram.class, "record", "attributes"); + return; + } + if (context == null) { + ApiUsageLogger.logNullParam(LongHistogram.class, "record", "context"); + return; + } if (value < 0) { throttlingLogger.log( Level.WARNING, diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java index 1fe09623d9a..a34528be4bb 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.metrics.LongUpDownCounterBuilder; import io.opentelemetry.api.metrics.ObservableLongMeasurement; import io.opentelemetry.api.metrics.ObservableLongUpDownCounter; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.metrics.internal.descriptor.InstrumentDescriptor; import io.opentelemetry.sdk.metrics.internal.state.WriteableMetricStorage; @@ -35,6 +36,14 @@ public boolean isEnabled() { @Override public void add(long increment, Attributes attributes, Context context) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LongUpDownCounter.class, "add", "attributes"); + return; + } + if (context == null) { + ApiUsageLogger.logNullParam(LongUpDownCounter.class, "add", "context"); + return; + } storage.recordLong(increment, attributes, context); } diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleCounterTest.java index 5f421a1c3b0..288d9fd8264 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleCounterTest.java @@ -8,7 +8,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThatCode; import io.github.netmikey.logunit.api.LogCapturer; import io.opentelemetry.api.common.Attributes; @@ -45,10 +45,8 @@ class SdkDoubleCounterTest { @Test void add_PreventNullAttributes() { - assertThatThrownBy( - () -> sdkMeter.counterBuilder("testCounter").ofDoubles().build().add(1.0, null)) - .isInstanceOf(NullPointerException.class) - .hasMessage("attributes"); + assertThatCode(() -> sdkMeter.counterBuilder("testCounter").ofDoubles().build().add(1.0, null)) + .doesNotThrowAnyException(); } @Test diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleGaugeTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleGaugeTest.java index c39558ce978..a6c4b1701ef 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleGaugeTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleGaugeTest.java @@ -8,7 +8,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThatCode; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleGauge; @@ -50,9 +50,8 @@ class SdkDoubleGaugeTest { @Test void set_PreventNullAttributes() { - assertThatThrownBy(() -> sdkMeter.gaugeBuilder("testGauge").build().set(1.0, null)) - .isInstanceOf(NullPointerException.class) - .hasMessage("attributes"); + assertThatCode(() -> sdkMeter.gaugeBuilder("testGauge").build().set(1.0, null)) + .doesNotThrowAnyException(); } @Test diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogramTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogramTest.java index 409607050fb..4d7d5e23d0c 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogramTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogramTest.java @@ -8,7 +8,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThatCode; import io.github.netmikey.logunit.api.LogCapturer; import io.opentelemetry.api.common.Attributes; @@ -52,9 +52,8 @@ class SdkDoubleHistogramTest { @Test void record_PreventNullAttributes() { - assertThatThrownBy(() -> sdkMeter.histogramBuilder("testHistogram").build().record(1.0, null)) - .isInstanceOf(NullPointerException.class) - .hasMessage("attributes"); + assertThatCode(() -> sdkMeter.histogramBuilder("testHistogram").build().record(1.0, null)) + .doesNotThrowAnyException(); } @Test diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounterTest.java index 244d3d3c5e2..fa5bfa0eba2 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounterTest.java @@ -8,7 +8,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThatCode; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleUpDownCounter; @@ -39,15 +39,14 @@ class SdkDoubleUpDownCounterTest { @Test void add_PreventNullAttributes() { - assertThatThrownBy( + assertThatCode( () -> sdkMeter .upDownCounterBuilder("testUpDownCounter") .ofDoubles() .build() .add(1.0, null)) - .isInstanceOf(NullPointerException.class) - .hasMessage("attributes"); + .doesNotThrowAnyException(); } @Test diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongCounterTest.java index fbfe9fb1803..21fd2aa7eac 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongCounterTest.java @@ -8,7 +8,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThatCode; import io.github.netmikey.logunit.api.LogCapturer; import io.opentelemetry.api.common.Attributes; @@ -44,9 +44,8 @@ class SdkLongCounterTest { @Test void add_PreventNullAttributes() { - assertThatThrownBy(() -> sdkMeter.counterBuilder("testCounter").build().add(1, null)) - .isInstanceOf(NullPointerException.class) - .hasMessage("attributes"); + assertThatCode(() -> sdkMeter.counterBuilder("testCounter").build().add(1, null)) + .doesNotThrowAnyException(); } @Test diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongGaugeTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongGaugeTest.java index 98d464a019a..114a672ef50 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongGaugeTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongGaugeTest.java @@ -8,7 +8,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThatCode; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.LongGauge; @@ -48,9 +48,8 @@ class SdkLongGaugeTest { @Test void set_PreventNullAttributes() { - assertThatThrownBy(() -> sdkMeter.gaugeBuilder("testGauge").ofLongs().build().set(1, null)) - .isInstanceOf(NullPointerException.class) - .hasMessage("attributes"); + assertThatCode(() -> sdkMeter.gaugeBuilder("testGauge").ofLongs().build().set(1, null)) + .doesNotThrowAnyException(); } @Test diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongHistogramTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongHistogramTest.java index fabff7b312d..6d2362c35e1 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongHistogramTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongHistogramTest.java @@ -8,7 +8,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThatCode; import io.github.netmikey.logunit.api.LogCapturer; import io.opentelemetry.api.common.Attributes; @@ -50,10 +50,9 @@ class SdkLongHistogramTest { @Test void record_PreventNullAttributes() { - assertThatThrownBy( + assertThatCode( () -> sdkMeter.histogramBuilder("testHistogram").ofLongs().build().record(1, null)) - .isInstanceOf(NullPointerException.class) - .hasMessage("attributes"); + .doesNotThrowAnyException(); } @Test diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounterTest.java index 63bb43a1468..5624b813226 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounterTest.java @@ -8,7 +8,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThatCode; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.LongUpDownCounter; @@ -39,9 +39,8 @@ class SdkLongUpDownCounterTest { @Test void add_PreventNullAttributes() { - assertThatThrownBy(() -> sdkMeter.upDownCounterBuilder("testCounter").build().add(1, null)) - .isInstanceOf(NullPointerException.class) - .hasMessage("attributes"); + assertThatCode(() -> sdkMeter.upDownCounterBuilder("testCounter").build().add(1, null)) + .doesNotThrowAnyException(); } @Test diff --git a/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/data/ProfileData.java b/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/data/ProfileData.java index 892893b4ea5..f33917772a8 100644 --- a/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/data/ProfileData.java +++ b/sdk/profiles/src/main/java/io/opentelemetry/sdk/profiles/data/ProfileData.java @@ -40,7 +40,7 @@ static ProfileData create( long period, String profileId, int droppedAttributesCount, - String originalPayloadFormat, + @Nullable String originalPayloadFormat, ByteBuffer originalPayload, List attributeIndices) { return new AutoValue_ImmutableProfileData( From d984656926ac8a4b6c650649217d0a26c5324dc8 Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 8 May 2026 15:26:23 -0500 Subject: [PATCH 05/10] fifth pass --- .../api/GlobalOpenTelemetry.java | 1 - .../io/opentelemetry/api/baggage/Baggage.java | 17 +++++ .../api/baggage/ImmutableBaggage.java | 21 +++++- .../propagation/W3CBaggagePropagator.java | 10 ++- .../common/ArrayBackedAttributesBuilder.java | 15 +++- .../opentelemetry/api/logs/DefaultLogger.java | 23 ++++-- .../api/logs/DefaultLoggerProvider.java | 16 +++- .../api/logs/LogRecordBuilder.java | 11 ++- .../api/metrics/DefaultMeter.java | 75 ++++++++++++------- .../api/metrics/DefaultMeterProvider.java | 15 +++- .../api/trace/ArrayBasedTraceState.java | 2 + .../api/trace/DefaultTracerBuilder.java | 11 ++- .../api/trace/DefaultTracerProvider.java | 10 ++- .../java/io/opentelemetry/api/trace/Span.java | 13 +++- .../opentelemetry/api/trace/SpanBuilder.java | 8 +- .../W3CTraceContextPropagator.java | 10 ++- .../propagation/EnvironmentGetter.java | 8 +- .../propagation/EnvironmentSetter.java | 11 ++- .../context/ThreadLocalContextStorage.java | 3 +- docs/knowledge/api-design.md | 19 ++++- .../common/InstrumentationLibraryInfo.java | 4 - .../sdk/resources/ResourceBuilder.java | 6 +- .../InstrumentationLibraryInfoTest.java | 2 +- .../sdk/logs/SdkLogRecordBuilder.java | 1 + .../logs/export/BatchLogRecordProcessor.java | 1 + .../logs/export/SimpleLogRecordProcessor.java | 1 + .../opentelemetry/sdk/metrics/SdkMeter.java | 3 + .../io/opentelemetry/sdk/trace/SdkSpan.java | 7 +- .../sdk/trace/data/StatusData.java | 2 + .../sdk/trace/samplers/SamplingResult.java | 2 + 30 files changed, 259 insertions(+), 69 deletions(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java b/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java index 19a68c8bee0..272ab9a512d 100644 --- a/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java +++ b/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java @@ -388,7 +388,6 @@ public ContextPropagators getPropagators() { @Override public TracerBuilder tracerBuilder(String instrumentationScopeName) { - Objects.requireNonNull(instrumentationScopeName, "instrumentationScopeName"); return delegate.tracerBuilder(instrumentationScopeName); } } diff --git a/api/all/src/main/java/io/opentelemetry/api/baggage/Baggage.java b/api/all/src/main/java/io/opentelemetry/api/baggage/Baggage.java index 12b81d7b033..bdbf5cb2ace 100644 --- a/api/all/src/main/java/io/opentelemetry/api/baggage/Baggage.java +++ b/api/all/src/main/java/io/opentelemetry/api/baggage/Baggage.java @@ -5,6 +5,7 @@ package io.opentelemetry.api.baggage; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.ImplicitContextKeyed; import java.util.Map; @@ -52,6 +53,10 @@ static Baggage current() { * Baggage} if there is no baggage in the context. */ static Baggage fromContext(Context context) { + if (context == null) { + ApiUsageLogger.logNullParam(Baggage.class, "fromContext", "context"); + return empty(); + } Baggage baggage = context.get(BaggageContextKey.KEY); return baggage != null ? baggage : empty(); } @@ -62,11 +67,19 @@ static Baggage fromContext(Context context) { */ @Nullable static Baggage fromContextOrNull(Context context) { + if (context == null) { + ApiUsageLogger.logNullParam(Baggage.class, "fromContextOrNull", "context"); + return null; + } return context.get(BaggageContextKey.KEY); } @Override default Context storeInContext(Context context) { + if (context == null) { + ApiUsageLogger.logNullParam(Baggage.class, "storeInContext", "context"); + return Context.root(); + } return context.with(BaggageContextKey.KEY, this); } @@ -109,6 +122,10 @@ default boolean isEmpty() { */ @Nullable default BaggageEntry getEntry(String entryKey) { + if (entryKey == null) { + ApiUsageLogger.logNullParam(Baggage.class, "getEntry", "entryKey"); + return null; + } BaggageEntry[] result = new BaggageEntry[] {null}; forEach( (key, entry) -> { diff --git a/api/all/src/main/java/io/opentelemetry/api/baggage/ImmutableBaggage.java b/api/all/src/main/java/io/opentelemetry/api/baggage/ImmutableBaggage.java index d628e89b282..4fd25a06989 100644 --- a/api/all/src/main/java/io/opentelemetry/api/baggage/ImmutableBaggage.java +++ b/api/all/src/main/java/io/opentelemetry/api/baggage/ImmutableBaggage.java @@ -6,6 +6,7 @@ package io.opentelemetry.api.baggage; import io.opentelemetry.api.internal.ImmutableKeyValuePairs; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -33,6 +34,10 @@ static BaggageBuilder builder() { @Nullable @Override public String getEntryValue(String entryKey) { + if (entryKey == null) { + ApiUsageLogger.logNullParam(Baggage.class, "getEntryValue", "entryKey"); + return null; + } BaggageEntry entry = get(entryKey); return entry != null ? entry.getValue() : null; } @@ -41,6 +46,10 @@ public String getEntryValue(String entryKey) { @Nullable @Override public BaggageEntry getEntry(String entryKey) { + if (entryKey == null) { + ApiUsageLogger.logNullParam(Baggage.class, "getEntry", "entryKey"); + return null; + } return get(entryKey); } @@ -69,7 +78,16 @@ static class Builder implements BaggageBuilder { @Override public BaggageBuilder put(String key, String value, BaggageEntryMetadata entryMetadata) { - if ((key == null) || (value == null) || (entryMetadata == null)) { + if (key == null) { + ApiUsageLogger.logNullParam(BaggageBuilder.class, "put", "key"); + return this; + } + if (value == null) { + ApiUsageLogger.logNullParam(BaggageBuilder.class, "put", "value"); + return this; + } + if (entryMetadata == null) { + ApiUsageLogger.logNullParam(BaggageBuilder.class, "put", "entryMetadata"); return this; } data.add(key); @@ -81,6 +99,7 @@ public BaggageBuilder put(String key, String value, BaggageEntryMetadata entryMe @Override public BaggageBuilder remove(String key) { if (key == null) { + ApiUsageLogger.logNullParam(BaggageBuilder.class, "remove", "key"); return this; } data.add(key); diff --git a/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagator.java b/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagator.java index d5589f7fd51..69820f25ce0 100644 --- a/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagator.java +++ b/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagator.java @@ -12,6 +12,7 @@ import io.opentelemetry.api.baggage.BaggageEntry; import io.opentelemetry.api.internal.PercentEscaper; import io.opentelemetry.api.internal.StringUtils; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapPropagator; @@ -45,7 +46,12 @@ public Collection fields() { @Override public void inject(Context context, @Nullable C carrier, TextMapSetter setter) { - if (context == null || setter == null) { + if (context == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "inject", "context"); + return; + } + if (setter == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "inject", "setter"); return; } Baggage baggage = Baggage.fromContext(context); @@ -90,9 +96,11 @@ private static String encodeValue(String value) { @Override public Context extract(Context context, @Nullable C carrier, TextMapGetter getter) { if (context == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "extract", "context"); return Context.root(); } if (getter == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "extract", "getter"); return context; } diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ArrayBackedAttributesBuilder.java b/api/all/src/main/java/io/opentelemetry/api/common/ArrayBackedAttributesBuilder.java index 834394c97e3..1284f2611b3 100644 --- a/api/all/src/main/java/io/opentelemetry/api/common/ArrayBackedAttributesBuilder.java +++ b/api/all/src/main/java/io/opentelemetry/api/common/ArrayBackedAttributesBuilder.java @@ -14,6 +14,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringArrayKey; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -48,7 +49,11 @@ public AttributesBuilder put(AttributeKey key, int value) { @Override public AttributesBuilder put(AttributeKey key, @Nullable T value) { - if (key == null || key.getKey().isEmpty() || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(AttributesBuilder.class, "put", "key"); + return this; + } + if (key.getKey().isEmpty() || value == null) { return this; } if (key.getType() == AttributeType.VALUE && value instanceof Value) { @@ -164,6 +169,7 @@ private static AttributeType attributeType(List> arrayValues) { // Safe: Attributes guarantees iteration over matching AttributeKey / value pairs. public AttributesBuilder putAll(Attributes attributes) { if (attributes == null) { + ApiUsageLogger.logNullParam(AttributesBuilder.class, "putAll", "attributes"); return this; } attributes.forEach((key, value) -> put((AttributeKey) key, value)); @@ -172,7 +178,11 @@ public AttributesBuilder putAll(Attributes attributes) { @Override public AttributesBuilder remove(AttributeKey key) { - if (key == null || key.getKey().isEmpty()) { + if (key == null) { + ApiUsageLogger.logNullParam(AttributesBuilder.class, "remove", "key"); + return this; + } + if (key.getKey().isEmpty()) { return this; } return removeIf( @@ -183,6 +193,7 @@ public AttributesBuilder remove(AttributeKey key) { @Override public AttributesBuilder removeIf(Predicate> predicate) { if (predicate == null) { + ApiUsageLogger.logNullParam(AttributesBuilder.class, "removeIf", "predicate"); return this; } for (int i = 0; i < data.size() - 1; i += 2) { diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java index 3c27c8cf726..8d990679a7e 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java @@ -26,6 +26,12 @@ static Logger getInstance() { @Override public boolean isEnabled(Severity severity, Context context) { + if (severity == null) { + ApiUsageLogger.logNullParam(Logger.class, "isEnabled", "severity"); + } + if (context == null) { + ApiUsageLogger.logNullParam(Logger.class, "isEnabled", "context"); + } return false; } @@ -40,21 +46,33 @@ private NoopLogRecordBuilder() {} @Override public LogRecordBuilder setTimestamp(long timestamp, TimeUnit unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setTimestamp", "unit"); + } return this; } @Override public LogRecordBuilder setTimestamp(Instant instant) { + if (instant == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setTimestamp", "instant"); + } return this; } @Override public LogRecordBuilder setObservedTimestamp(long timestamp, TimeUnit unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setObservedTimestamp", "unit"); + } return this; } @Override public LogRecordBuilder setObservedTimestamp(Instant instant) { + if (instant == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setObservedTimestamp", "instant"); + } return this; } @@ -62,7 +80,6 @@ public LogRecordBuilder setObservedTimestamp(Instant instant) { public LogRecordBuilder setContext(Context context) { if (context == null) { ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setContext", "context"); - return this; } return this; } @@ -71,7 +88,6 @@ public LogRecordBuilder setContext(Context context) { public LogRecordBuilder setSeverity(Severity severity) { if (severity == null) { ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setSeverity", "severity"); - return this; } return this; } @@ -80,7 +96,6 @@ public LogRecordBuilder setSeverity(Severity severity) { public LogRecordBuilder setSeverityText(String severityText) { if (severityText == null) { ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setSeverityText", "severityText"); - return this; } return this; } @@ -89,7 +104,6 @@ public LogRecordBuilder setSeverityText(String severityText) { public LogRecordBuilder setBody(String body) { if (body == null) { ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setBody", "body"); - return this; } return this; } @@ -98,7 +112,6 @@ public LogRecordBuilder setBody(String body) { public LogRecordBuilder setBody(Value body) { if (body == null) { ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setBody", "body"); - return this; } return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLoggerProvider.java b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLoggerProvider.java index 03f45c818bc..4e122eab4eb 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLoggerProvider.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLoggerProvider.java @@ -5,7 +5,7 @@ package io.opentelemetry.api.logs; -import java.util.Objects; +import io.opentelemetry.common.impl.ApiUsageLogger; class DefaultLoggerProvider implements LoggerProvider { @@ -20,7 +20,10 @@ static LoggerProvider getInstance() { @Override public LoggerBuilder loggerBuilder(String instrumentationScopeName) { - Objects.requireNonNull(instrumentationScopeName, "instrumentationScopeName"); + if (instrumentationScopeName == null) { + ApiUsageLogger.logNullParam( + LoggerProvider.class, "loggerBuilder", "instrumentationScopeName"); + } return NOOP_BUILDER; } @@ -28,13 +31,18 @@ private static class NoopLoggerBuilder implements LoggerBuilder { @Override public LoggerBuilder setSchemaUrl(String schemaUrl) { - Objects.requireNonNull(schemaUrl, "schemaUrl"); + if (schemaUrl == null) { + ApiUsageLogger.logNullParam(LoggerBuilder.class, "setSchemaUrl", "schemaUrl"); + } return this; } @Override public LoggerBuilder setInstrumentationVersion(String instrumentationVersion) { - Objects.requireNonNull(instrumentationVersion, "instrumentationVersion"); + if (instrumentationVersion == null) { + ApiUsageLogger.logNullParam( + LoggerBuilder.class, "setInstrumentationVersion", "instrumentationVersion"); + } return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/LogRecordBuilder.java b/api/all/src/main/java/io/opentelemetry/api/logs/LogRecordBuilder.java index 21feb4d87ce..055b9778f5e 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/LogRecordBuilder.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/LogRecordBuilder.java @@ -13,6 +13,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Value; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import java.time.Instant; import java.util.concurrent.TimeUnit; @@ -84,6 +85,10 @@ public interface LogRecordBuilder { * @since 1.42.0 */ default LogRecordBuilder setBody(Value body) { + if (body == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setBody", "body"); + return this; + } setBody(body.asString()); return this; } @@ -94,7 +99,11 @@ default LogRecordBuilder setBody(Value body) { */ @SuppressWarnings("unchecked") default LogRecordBuilder setAllAttributes(Attributes attributes) { - if (attributes == null || attributes.isEmpty()) { + if (attributes == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setAllAttributes", "attributes"); + return this; + } + if (attributes.isEmpty()) { return this; } attributes.forEach( diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java index 19c71f1d8fc..3e1ab471f55 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java @@ -8,7 +8,6 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; -import java.util.Objects; import java.util.function.Consumer; import javax.annotation.concurrent.ThreadSafe; @@ -40,25 +39,33 @@ static Meter getInstance() { @Override public LongCounterBuilder counterBuilder(String name) { - Objects.requireNonNull(name, "name"); + if (name == null) { + ApiUsageLogger.logNullParam(Meter.class, "counterBuilder", "name"); + } return NOOP_LONG_COUNTER_BUILDER; } @Override public LongUpDownCounterBuilder upDownCounterBuilder(String name) { - Objects.requireNonNull(name, "name"); + if (name == null) { + ApiUsageLogger.logNullParam(Meter.class, "upDownCounterBuilder", "name"); + } return NOOP_LONG_UP_DOWN_COUNTER_BUILDER; } @Override public DoubleHistogramBuilder histogramBuilder(String name) { - Objects.requireNonNull(name, "name"); + if (name == null) { + ApiUsageLogger.logNullParam(Meter.class, "histogramBuilder", "name"); + } return NOOP_DOUBLE_HISTOGRAM_BUILDER; } @Override public DoubleGaugeBuilder gaugeBuilder(String name) { - Objects.requireNonNull(name, "name"); + if (name == null) { + ApiUsageLogger.logNullParam(Meter.class, "gaugeBuilder", "name"); + } return NOOP_DOUBLE_GAUGE_BUILDER; } @@ -67,6 +74,12 @@ public BatchCallback batchCallback( Runnable callback, ObservableMeasurement observableMeasurement, ObservableMeasurement... additionalMeasurements) { + if (callback == null) { + ApiUsageLogger.logNullParam(Meter.class, "batchCallback", "callback"); + } + if (observableMeasurement == null) { + ApiUsageLogger.logNullParam(Meter.class, "batchCallback", "observableMeasurement"); + } return NOOP_BATCH_CALLBACK; } @@ -90,9 +103,7 @@ public void add(long value, Attributes attributes, Context context) { @Override public void add(long value, Attributes attributes) { - if (attributes == null) { - ApiUsageLogger.logNullParam(LongCounter.class, "add", "attributes"); - } + add(value, attributes, Context.current()); } @Override @@ -117,9 +128,7 @@ public void add(double value, Attributes attributes, Context context) { @Override public void add(double value, Attributes attributes) { - if (attributes == null) { - ApiUsageLogger.logNullParam(DoubleCounter.class, "add", "attributes"); - } + add(value, attributes, Context.current()); } @Override @@ -155,6 +164,9 @@ public LongCounter build() { @Override public ObservableLongCounter buildWithCallback(Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(LongCounterBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_COUNTER; } @@ -187,6 +199,9 @@ public DoubleCounter build() { @Override public ObservableDoubleCounter buildWithCallback( Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(DoubleCounterBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_COUNTER; } @@ -214,9 +229,7 @@ public void add(long value, Attributes attributes, Context context) { @Override public void add(long value, Attributes attributes) { - if (attributes == null) { - ApiUsageLogger.logNullParam(LongUpDownCounter.class, "add", "attributes"); - } + add(value, attributes, Context.current()); } @Override @@ -241,9 +254,7 @@ public void add(double value, Attributes attributes, Context context) { @Override public void add(double value, Attributes attributes) { - if (attributes == null) { - ApiUsageLogger.logNullParam(DoubleUpDownCounter.class, "add", "attributes"); - } + add(value, attributes, Context.current()); } @Override @@ -280,6 +291,10 @@ public LongUpDownCounter build() { @Override public ObservableLongUpDownCounter buildWithCallback( Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam( + LongUpDownCounterBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_UP_DOWN_COUNTER; } @@ -313,6 +328,10 @@ public DoubleUpDownCounter build() { @Override public ObservableDoubleUpDownCounter buildWithCallback( Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam( + DoubleUpDownCounterBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_UP_DOWN_COUNTER; } @@ -340,9 +359,7 @@ public void record(double value, Attributes attributes, Context context) { @Override public void record(double value, Attributes attributes) { - if (attributes == null) { - ApiUsageLogger.logNullParam(DoubleHistogram.class, "record", "attributes"); - } + record(value, attributes, Context.current()); } @Override @@ -367,9 +384,7 @@ public void record(long value, Attributes attributes, Context context) { @Override public void record(long value, Attributes attributes) { - if (attributes == null) { - ApiUsageLogger.logNullParam(LongHistogram.class, "record", "attributes"); - } + record(value, attributes, Context.current()); } @Override @@ -444,6 +459,9 @@ public LongGaugeBuilder ofLongs() { @Override public ObservableDoubleGauge buildWithCallback(Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(DoubleGaugeBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_GAUGE; } @@ -469,9 +487,7 @@ public void set(double value) {} @Override public void set(double value, Attributes attributes) { - if (attributes == null) { - ApiUsageLogger.logNullParam(DoubleGauge.class, "set", "attributes"); - } + set(value, attributes, Context.current()); } @Override @@ -501,6 +517,9 @@ public LongGaugeBuilder setUnit(String unit) { @Override public ObservableLongGauge buildWithCallback(Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(LongGaugeBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_GAUGE; } @@ -526,9 +545,7 @@ public void set(long value) {} @Override public void set(long value, Attributes attributes) { - if (attributes == null) { - ApiUsageLogger.logNullParam(LongGauge.class, "set", "attributes"); - } + set(value, attributes, Context.current()); } @Override diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeterProvider.java b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeterProvider.java index aa2e107c070..ca07aed0da3 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeterProvider.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeterProvider.java @@ -6,13 +6,15 @@ package io.opentelemetry.api.metrics; import io.opentelemetry.api.internal.IncubatingUtil; -import java.util.Objects; +import io.opentelemetry.common.impl.ApiUsageLogger; /** A {@link MeterProvider} that does nothing. */ class DefaultMeterProvider implements MeterProvider { @Override public MeterBuilder meterBuilder(String instrumentationScopeName) { - Objects.requireNonNull(instrumentationScopeName, "instrumentationScopeName"); + if (instrumentationScopeName == null) { + ApiUsageLogger.logNullParam(MeterProvider.class, "meterBuilder", "instrumentationScopeName"); + } return BUILDER_INSTANCE; } @@ -32,13 +34,18 @@ private static class NoopMeterBuilder implements MeterBuilder { @Override public MeterBuilder setSchemaUrl(String schemaUrl) { - Objects.requireNonNull(schemaUrl, "schemaUrl"); + if (schemaUrl == null) { + ApiUsageLogger.logNullParam(MeterBuilder.class, "setSchemaUrl", "schemaUrl"); + } return this; } @Override public MeterBuilder setInstrumentationVersion(String instrumentationScopeVersion) { - Objects.requireNonNull(instrumentationScopeVersion, "instrumentationScopeVersion"); + if (instrumentationScopeVersion == null) { + ApiUsageLogger.logNullParam( + MeterBuilder.class, "setInstrumentationVersion", "instrumentationScopeVersion"); + } return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceState.java b/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceState.java index 6da56f542f2..485937f0345 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceState.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceState.java @@ -7,6 +7,7 @@ import com.google.auto.value.AutoValue; import io.opentelemetry.api.internal.ReadOnlyArrayMap; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.List; import java.util.Map; import java.util.function.BiConsumer; @@ -45,6 +46,7 @@ public boolean isEmpty() { @Override public void forEach(BiConsumer consumer) { if (consumer == null) { + ApiUsageLogger.logNullParam(TraceState.class, "forEach", "consumer"); return; } List entries = getEntries(); diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerBuilder.java b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerBuilder.java index c0c4d07600d..d270c46595c 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerBuilder.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerBuilder.java @@ -5,7 +5,7 @@ package io.opentelemetry.api.trace; -import java.util.Objects; +import io.opentelemetry.common.impl.ApiUsageLogger; class DefaultTracerBuilder implements TracerBuilder { private static final DefaultTracerBuilder INSTANCE = new DefaultTracerBuilder(); @@ -16,13 +16,18 @@ static TracerBuilder getInstance() { @Override public TracerBuilder setSchemaUrl(String schemaUrl) { - Objects.requireNonNull(schemaUrl, "schemaUrl"); + if (schemaUrl == null) { + ApiUsageLogger.logNullParam(TracerBuilder.class, "setSchemaUrl", "schemaUrl"); + } return this; } @Override public TracerBuilder setInstrumentationVersion(String instrumentationScopeVersion) { - Objects.requireNonNull(instrumentationScopeVersion, "instrumentationScopeVersion"); + if (instrumentationScopeVersion == null) { + ApiUsageLogger.logNullParam( + TracerBuilder.class, "setInstrumentationVersion", "instrumentationScopeVersion"); + } return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java index 0d9a26feed4..a805f3caead 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java @@ -6,7 +6,7 @@ package io.opentelemetry.api.trace; import io.opentelemetry.api.internal.IncubatingUtil; -import java.util.Objects; +import io.opentelemetry.common.impl.ApiUsageLogger; import javax.annotation.concurrent.ThreadSafe; @ThreadSafe @@ -23,13 +23,17 @@ static TracerProvider getInstance() { @Override public Tracer get(String instrumentationScopeName) { - Objects.requireNonNull(instrumentationScopeName, "instrumentationScopeName"); + if (instrumentationScopeName == null) { + ApiUsageLogger.logNullParam(TracerProvider.class, "get", "instrumentationScopeName"); + } return DefaultTracer.getInstance(); } @Override public Tracer get(String instrumentationScopeName, String instrumentationScopeVersion) { - Objects.requireNonNull(instrumentationScopeName, "instrumentationScopeName"); + if (instrumentationScopeName == null) { + ApiUsageLogger.logNullParam(TracerProvider.class, "get", "instrumentationScopeName"); + } return DefaultTracer.getInstance(); } diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/Span.java b/api/all/src/main/java/io/opentelemetry/api/trace/Span.java index c60f7225af0..0fea5803077 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/Span.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/Span.java @@ -182,7 +182,11 @@ default Span setAttribute(AttributeKey key, int value) { */ @SuppressWarnings("unchecked") default Span setAllAttributes(Attributes attributes) { - if (attributes == null || attributes.isEmpty()) { + if (attributes == null) { + ApiUsageLogger.logNullParam(Span.class, "setAllAttributes", "attributes"); + return this; + } + if (attributes.isEmpty()) { return this; } attributes.forEach( @@ -233,6 +237,7 @@ default Span addEvent(String name, long timestamp, TimeUnit unit) { */ default Span addEvent(String name, Instant timestamp) { if (timestamp == null) { + ApiUsageLogger.logNullParam(Span.class, "addEvent", "timestamp"); return addEvent(name); } return addEvent( @@ -285,6 +290,7 @@ default Span addEvent(String name, Instant timestamp) { */ default Span addEvent(String name, Attributes attributes, Instant timestamp) { if (timestamp == null) { + ApiUsageLogger.logNullParam(Span.class, "addEvent", "timestamp"); return addEvent(name, attributes); } return addEvent( @@ -441,6 +447,7 @@ default Span addLink(SpanContext spanContext, Attributes attributes) { */ default void end(Instant timestamp) { if (timestamp == null) { + ApiUsageLogger.logNullParam(Span.class, "end", "timestamp"); end(); return; } @@ -464,6 +471,10 @@ default void end(Instant timestamp) { @Override default Context storeInContext(Context context) { + if (context == null) { + ApiUsageLogger.logNullParam(Span.class, "storeInContext", "context"); + return Context.root(); + } return context.with(SpanContextKey.KEY, this); } } diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/SpanBuilder.java b/api/all/src/main/java/io/opentelemetry/api/trace/SpanBuilder.java index feee2b4714b..3454bc236ea 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/SpanBuilder.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/SpanBuilder.java @@ -10,6 +10,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import java.time.Instant; import java.util.concurrent.TimeUnit; @@ -261,7 +262,11 @@ default SpanBuilder setAttribute(AttributeKey key, int value) { */ @SuppressWarnings("unchecked") default SpanBuilder setAllAttributes(Attributes attributes) { - if (attributes == null || attributes.isEmpty()) { + if (attributes == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setAllAttributes", "attributes"); + return this; + } + if (attributes.isEmpty()) { return this; } attributes.forEach( @@ -308,6 +313,7 @@ default SpanBuilder setAllAttributes(Attributes attributes) { */ default SpanBuilder setStartTimestamp(Instant startTimestamp) { if (startTimestamp == null) { + ApiUsageLogger.logNullParam(SpanBuilder.class, "setStartTimestamp", "startTimestamp"); return this; } return setStartTimestamp( diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/propagation/W3CTraceContextPropagator.java b/api/all/src/main/java/io/opentelemetry/api/trace/propagation/W3CTraceContextPropagator.java index efcd2476b2c..c7ab74be3ba 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/propagation/W3CTraceContextPropagator.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/propagation/W3CTraceContextPropagator.java @@ -16,6 +16,7 @@ import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapPropagator; @@ -94,7 +95,12 @@ public Collection fields() { @Override public void inject(Context context, @Nullable C carrier, TextMapSetter setter) { - if (context == null || setter == null) { + if (context == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "inject", "context"); + return; + } + if (setter == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "inject", "setter"); return; } @@ -132,9 +138,11 @@ public void inject(Context context, @Nullable C carrier, TextMapSetter se @Override public Context extract(Context context, @Nullable C carrier, TextMapGetter getter) { if (context == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "extract", "context"); return Context.root(); } if (getter == null) { + ApiUsageLogger.logNullParam(TextMapPropagator.class, "extract", "getter"); return context; } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/EnvironmentGetter.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/EnvironmentGetter.java index ec3c6c4d6d9..507a97e082d 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/EnvironmentGetter.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/EnvironmentGetter.java @@ -5,6 +5,7 @@ package io.opentelemetry.api.incubator.propagation; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.propagation.TextMapGetter; import java.util.ArrayList; import java.util.Collections; @@ -67,6 +68,7 @@ public Iterable keys(Map carrier) { new Throwable()); } if (carrier == null) { + ApiUsageLogger.logNullParam(EnvironmentGetter.class, "keys", "carrier"); return Collections.emptyList(); } List result = new ArrayList<>(carrier.size()); @@ -79,7 +81,11 @@ public Iterable keys(Map carrier) { @Nullable @Override public String get(@Nullable Map carrier, String key) { - if (carrier == null || key == null) { + if (key == null) { + ApiUsageLogger.logNullParam(EnvironmentGetter.class, "get", "key"); + return null; + } + if (carrier == null) { return null; } String normalizedKey = EnvironmentSetter.normalizeKey(key); diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/EnvironmentSetter.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/EnvironmentSetter.java index bb754b3f616..a274ef7865c 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/EnvironmentSetter.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/EnvironmentSetter.java @@ -5,6 +5,7 @@ package io.opentelemetry.api.incubator.propagation; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.propagation.TextMapSetter; import java.util.Map; import javax.annotation.Nullable; @@ -59,7 +60,15 @@ public static EnvironmentSetter getInstance() { @Override public void set(@Nullable Map carrier, String key, String value) { - if (carrier == null || key == null || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(EnvironmentSetter.class, "set", "key"); + return; + } + if (value == null) { + ApiUsageLogger.logNullParam(EnvironmentSetter.class, "set", "value"); + return; + } + if (carrier == null) { return; } String normalizedKey = normalizeKey(key); diff --git a/context/src/main/java/io/opentelemetry/context/ThreadLocalContextStorage.java b/context/src/main/java/io/opentelemetry/context/ThreadLocalContextStorage.java index 917eed2e088..db69c1c060f 100644 --- a/context/src/main/java/io/opentelemetry/context/ThreadLocalContextStorage.java +++ b/context/src/main/java/io/opentelemetry/context/ThreadLocalContextStorage.java @@ -5,6 +5,7 @@ package io.opentelemetry.context; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -19,7 +20,7 @@ enum ThreadLocalContextStorage implements ContextStorage { @Override public Scope attach(Context toAttach) { if (toAttach == null) { - // Null context not allowed so ignore it. + ApiUsageLogger.logNullParam(ContextStorage.class, "attach", "toAttach"); return NoopScope.INSTANCE; } diff --git a/docs/knowledge/api-design.md b/docs/knowledge/api-design.md index 03e8a9beaec..ebdbf768229 100644 --- a/docs/knowledge/api-design.md +++ b/docs/knowledge/api-design.md @@ -88,7 +88,24 @@ Do **not** throw. Log the violation via [`ApiUsageLogger`](../../common/src/main/java/io/opentelemetry/common/impl/ApiUsageLogger.java) — which logs at `FINEST` with a stack trace so the offending call site is visible — then degrade gracefully (return `this`, an empty/noop result, or substitute a safe default such as -`Attributes.empty()` or `Context.current()`): +`Attributes.empty()` or `Context.current()`). + +The preferred noop is a strict no-op (skip the operation entirely). However, if the method +already degrades gracefully for a null argument — for example, substituting `Attributes.empty()` +and continuing rather than returning early — preserve that existing behavior. The goal is to +**always log** the misuse, **never change** existing graceful degradation that is already correct: + +```java +// Existing graceful degradation — add the log, keep the substitution +@Override +public ReadWriteSpan addEvent(String name, Attributes attributes) { + if (attributes == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "addEvent", "attributes"); + attributes = Attributes.empty(); // preserve existing fallback, do not return early + } + // ... normal implementation +} +``` ```java @Override diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationLibraryInfo.java b/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationLibraryInfo.java index e8e294c291e..78f986d0a41 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationLibraryInfo.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/common/InstrumentationLibraryInfo.java @@ -5,8 +5,6 @@ package io.opentelemetry.sdk.common; -import static java.util.Objects.requireNonNull; - import com.google.auto.value.AutoValue; import io.opentelemetry.api.trace.Tracer; import javax.annotation.Nullable; @@ -35,7 +33,6 @@ public abstract class InstrumentationLibraryInfo { * @return the new instance */ public static InstrumentationLibraryInfo create(String name, @Nullable String version) { - requireNonNull(name, "name"); return new AutoValue_InstrumentationLibraryInfo(name, version, null); } @@ -52,7 +49,6 @@ public static InstrumentationLibraryInfo create(String name, @Nullable String ve */ public static InstrumentationLibraryInfo create( String name, @Nullable String version, @Nullable String schemaUrl) { - requireNonNull(name, "name"); return new AutoValue_InstrumentationLibraryInfo(name, version, schemaUrl); } diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java b/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java index 1239a179cf7..d3a39535157 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/resources/ResourceBuilder.java @@ -9,7 +9,6 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.common.impl.ApiUsageLogger; -import java.util.Objects; import java.util.function.Predicate; import javax.annotation.Nullable; @@ -230,7 +229,10 @@ public ResourceBuilder putAll(Resource resource) { /** Remove all attributes that satisfy the given predicate from {@link Resource}. */ public ResourceBuilder removeIf(Predicate> filter) { - Objects.requireNonNull(filter, "filter"); + if (filter == null) { + ApiUsageLogger.logNullParam(ResourceBuilder.class, "removeIf", "filter"); + return this; + } attributesBuilder.removeIf(filter); return this; } diff --git a/sdk/common/src/test/java/io/opentelemetry/sdk/common/InstrumentationLibraryInfoTest.java b/sdk/common/src/test/java/io/opentelemetry/sdk/common/InstrumentationLibraryInfoTest.java index 5a3cffc2251..f425491ccfe 100644 --- a/sdk/common/src/test/java/io/opentelemetry/sdk/common/InstrumentationLibraryInfoTest.java +++ b/sdk/common/src/test/java/io/opentelemetry/sdk/common/InstrumentationLibraryInfoTest.java @@ -24,6 +24,6 @@ void emptyLibraryInfo() { void nullName() { assertThatThrownBy(() -> InstrumentationLibraryInfo.create(null, "1.0.0")) .isInstanceOf(NullPointerException.class) - .hasMessage("name"); + .hasMessageContaining("name"); } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java index 14c8f35eb69..0d81b95adc5 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java @@ -137,6 +137,7 @@ public SdkLogRecordBuilder setBody(Value value) { @Override public SdkLogRecordBuilder setException(Throwable throwable) { if (throwable == null) { + ApiUsageLogger.logNullParam(SdkLogRecordBuilder.class, "setException", "throwable"); return this; } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java index 9b135d1004e..255d2ed729a 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java @@ -86,6 +86,7 @@ public static BatchLogRecordProcessorBuilder builder(LogRecordExporter logRecord @Override public void onEmit(Context context, ReadWriteLogRecord logRecord) { + Objects.requireNonNull(context, "context"); Objects.requireNonNull(logRecord, "logRecord"); worker.addLog(logRecord); } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java index 168320c3739..ac08e800258 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java @@ -85,6 +85,7 @@ public static SimpleLogRecordProcessorBuilder builder(LogRecordExporter exporter @Override public void onEmit(Context context, ReadWriteLogRecord logRecord) { + requireNonNull(context, "context"); requireNonNull(logRecord, "logRecord"); try { List logs = Collections.singletonList(logRecord.toLogRecordData()); diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java index 8fb64ae7f38..99aed0f7895 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java @@ -332,6 +332,9 @@ public String toString() { } /** Check if the instrument name is valid. If invalid, log a warning. */ + // TODO: consider replacing with ApiUsageLogger for consistency with the null guard policy + // (see docs/knowledge/api-design.md). Current approach logs at WARNING per-call with the + // invalid name inline, but creates a separate observability channel from other API misuse. // Visible for testing static boolean checkValidInstrumentName(String name) { if (name != null && VALID_INSTRUMENT_NAME_PATTERN.matcher(name).matches()) { diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java index 92c082dd4c7..aa0b66505fc 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java @@ -388,6 +388,7 @@ public ReadWriteSpan addEvent(String name, Attributes attributes) { return this; } if (attributes == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "addEvent", "attributes"); attributes = Attributes.empty(); } int totalAttributeCount = attributes.size(); @@ -414,6 +415,7 @@ public ReadWriteSpan addEvent(String name, Attributes attributes, long timestamp return this; } if (attributes == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "addEvent", "attributes"); attributes = Attributes.empty(); } int totalAttributeCount = attributes.size(); @@ -497,6 +499,7 @@ public ReadWriteSpan recordException(Throwable exception, Attributes additionalA return this; } if (additionalAttributes == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "recordException", "additionalAttributes"); additionalAttributes = Attributes.empty(); } @@ -571,7 +574,9 @@ public void end() { @Override public void end(long timestamp, TimeUnit unit) { if (unit == null) { - unit = TimeUnit.NANOSECONDS; + ApiUsageLogger.logNullParam(SdkSpan.class, "end", "unit"); + endInternal(clock.now()); + return; } endInternal(timestamp == 0 ? clock.now() : unit.toNanos(timestamp)); } diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/data/StatusData.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/data/StatusData.java index 39ea87b252d..f546daa2400 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/data/StatusData.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/data/StatusData.java @@ -7,6 +7,7 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.StatusCode; +import java.util.Objects; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @@ -40,6 +41,7 @@ static StatusData error() { * description} is {@code null}, the returned {@link StatusData} does not have a description. */ static StatusData create(StatusCode code, @Nullable String description) { + Objects.requireNonNull(code, "code"); return ImmutableStatusData.create(code, description != null ? description : ""); } diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/SamplingResult.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/SamplingResult.java index be85059a844..59bebd94d5a 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/SamplingResult.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/SamplingResult.java @@ -34,6 +34,7 @@ public interface SamplingResult { * @return A {@link SamplingResult} with empty attributes and the provided {@code decision}. */ static SamplingResult create(SamplingDecision decision) { + requireNonNull(decision, "decision"); switch (decision) { case RECORD_AND_SAMPLE: return ImmutableSamplingResult.EMPTY_RECORDED_AND_SAMPLED_SAMPLING_RESULT; @@ -61,6 +62,7 @@ static SamplingResult create(SamplingDecision decision) { * provided {@code decision}. */ static SamplingResult create(SamplingDecision decision, Attributes attributes) { + requireNonNull(decision, "decision"); requireNonNull(attributes, "attributes"); return attributes.isEmpty() ? create(decision) From ba5545632b431cd9f09056b1c2c5956fcc87090f Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 8 May 2026 15:38:23 -0500 Subject: [PATCH 06/10] actual fifth pass --- .../opentelemetry/api/logs/DefaultLogger.java | 3 ++ .../api/metrics/DefaultMeter.java | 50 +++++++++++++++++++ .../api/trace/DefaultTracerProvider.java | 3 ++ .../metrics/ExtendedDefaultMeter.java | 26 ++++++++++ .../trace/ExtendedDefaultTracer.java | 6 +-- .../io/opentelemetry/context/Context.java | 20 ++------ docs/knowledge/api-design.md | 8 ++- .../sdk/logs/ExtendedSdkLogRecordBuilder.java | 7 ++- .../logs/ExtendedSdkReadWriteLogRecord.java | 7 ++- .../sdk/logs/SdkLogRecordBuilder.java | 6 ++- .../sdk/logs/SdkReadWriteLogRecord.java | 7 ++- .../io/opentelemetry/sdk/trace/SdkSpan.java | 13 ++++- .../sdk/trace/SdkSpanBuilder.java | 7 ++- 13 files changed, 136 insertions(+), 27 deletions(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java index 8d990679a7e..9bbd748447b 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java @@ -118,6 +118,9 @@ public LogRecordBuilder setBody(Value body) { @Override public LogRecordBuilder setAttribute(AttributeKey key, @Nullable T value) { + if (key == null) { + ApiUsageLogger.logNullParam(LogRecordBuilder.class, "setAttribute", "key"); + } return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java index 3e1ab471f55..17ef1585c6a 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/DefaultMeter.java @@ -144,11 +144,17 @@ private static class NoopLongCounterBuilder implements LongCounterBuilder { @Override public LongCounterBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(LongCounterBuilder.class, "setDescription", "description"); + } return this; } @Override public LongCounterBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(LongCounterBuilder.class, "setUnit", "unit"); + } return this; } @@ -183,11 +189,17 @@ private static class NoopDoubleCounterBuilder implements DoubleCounterBuilder { @Override public DoubleCounterBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(DoubleCounterBuilder.class, "setDescription", "description"); + } return this; } @Override public DoubleCounterBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(DoubleCounterBuilder.class, "setUnit", "unit"); + } return this; } @@ -270,11 +282,18 @@ private static class NoopLongUpDownCounterBuilder implements LongUpDownCounterBu @Override public LongUpDownCounterBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam( + LongUpDownCounterBuilder.class, "setDescription", "description"); + } return this; } @Override public LongUpDownCounterBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(LongUpDownCounterBuilder.class, "setUnit", "unit"); + } return this; } @@ -312,11 +331,18 @@ private static class NoopDoubleUpDownCounterBuilder implements DoubleUpDownCount @Override public DoubleUpDownCounterBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam( + DoubleUpDownCounterBuilder.class, "setDescription", "description"); + } return this; } @Override public DoubleUpDownCounterBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(DoubleUpDownCounterBuilder.class, "setUnit", "unit"); + } return this; } @@ -398,11 +424,17 @@ private static class NoopDoubleHistogramBuilder implements DoubleHistogramBuilde @Override public DoubleHistogramBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(DoubleHistogramBuilder.class, "setDescription", "description"); + } return this; } @Override public DoubleHistogramBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(DoubleHistogramBuilder.class, "setUnit", "unit"); + } return this; } @@ -422,11 +454,17 @@ private static class NoopLongHistogramBuilder implements LongHistogramBuilder { @Override public LongHistogramBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(LongHistogramBuilder.class, "setDescription", "description"); + } return this; } @Override public LongHistogramBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(LongHistogramBuilder.class, "setUnit", "unit"); + } return this; } @@ -444,11 +482,17 @@ private static class NoopDoubleGaugeBuilder implements DoubleGaugeBuilder { @Override public DoubleGaugeBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(DoubleGaugeBuilder.class, "setDescription", "description"); + } return this; } @Override public DoubleGaugeBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(DoubleGaugeBuilder.class, "setUnit", "unit"); + } return this; } @@ -507,11 +551,17 @@ private static class NoopLongGaugeBuilder implements LongGaugeBuilder { @Override public LongGaugeBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(LongGaugeBuilder.class, "setDescription", "description"); + } return this; } @Override public LongGaugeBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(LongGaugeBuilder.class, "setUnit", "unit"); + } return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java index a805f3caead..7f953c4b1bb 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/DefaultTracerProvider.java @@ -34,6 +34,9 @@ public Tracer get(String instrumentationScopeName, String instrumentationScopeVe if (instrumentationScopeName == null) { ApiUsageLogger.logNullParam(TracerProvider.class, "get", "instrumentationScopeName"); } + if (instrumentationScopeVersion == null) { + ApiUsageLogger.logNullParam(TracerProvider.class, "get", "instrumentationScopeVersion"); + } return DefaultTracer.getInstance(); } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java index 31e1393c325..8bee86dc2d8 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java @@ -101,6 +101,12 @@ public BatchCallback batchCallback( Runnable callback, ObservableMeasurement observableMeasurement, ObservableMeasurement... additionalMeasurements) { + if (callback == null) { + ApiUsageLogger.logNullParam(Meter.class, "batchCallback", "callback"); + } + if (observableMeasurement == null) { + ApiUsageLogger.logNullParam(Meter.class, "batchCallback", "observableMeasurement"); + } return NOOP_BATCH_CALLBACK; } @@ -185,6 +191,9 @@ public LongCounter build() { @Override public ObservableLongCounter buildWithCallback(Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(LongCounterBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_COUNTER; } @@ -217,6 +226,9 @@ public DoubleCounter build() { @Override public ObservableDoubleCounter buildWithCallback( Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(DoubleCounterBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_COUNTER; } @@ -306,6 +318,10 @@ public LongUpDownCounter build() { @Override public ObservableLongUpDownCounter buildWithCallback( Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam( + LongUpDownCounterBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_UP_DOWN_COUNTER; } @@ -340,6 +356,10 @@ public DoubleUpDownCounter build() { @Override public ObservableDoubleUpDownCounter buildWithCallback( Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam( + DoubleUpDownCounterBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_UP_DOWN_COUNTER; } @@ -467,6 +487,9 @@ public LongGaugeBuilder ofLongs() { @Override public ObservableDoubleGauge buildWithCallback(Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(DoubleGaugeBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_GAUGE; } @@ -522,6 +545,9 @@ public LongGaugeBuilder setUnit(String unit) { @Override public ObservableLongGauge buildWithCallback(Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(LongGaugeBuilder.class, "buildWithCallback", "callback"); + } return NOOP_OBSERVABLE_GAUGE; } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracer.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracer.java index 295aaded77f..0d7c4c4b1e6 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracer.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracer.java @@ -17,6 +17,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.ContextPropagators; import java.util.Map; +import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; import javax.annotation.Nullable; @@ -175,7 +176,6 @@ public NoopSpanBuilder setAllAttributes(Attributes attributes) { public NoopSpanBuilder setSpanKind(SpanKind spanKind) { if (spanKind == null) { ApiUsageLogger.logNullParam(SpanBuilder.class, "setSpanKind", "spanKind"); - return this; } return this; } @@ -184,22 +184,22 @@ public NoopSpanBuilder setSpanKind(SpanKind spanKind) { public NoopSpanBuilder setStartTimestamp(long startTimestamp, TimeUnit unit) { if (unit == null) { ApiUsageLogger.logNullParam(SpanBuilder.class, "setStartTimestamp", "unit"); - return this; } return this; } @Override public T startAndCall(SpanCallable spanCallable) throws E { + Objects.requireNonNull(spanCallable, "spanCallable"); return spanCallable.callInSpan(); } @Override public T startAndCall( SpanCallable spanCallable, BiConsumer handleException) throws E { + Objects.requireNonNull(spanCallable, "spanCallable"); if (handleException == null) { ApiUsageLogger.logNullParam(ExtendedSpanBuilder.class, "startAndCall", "handleException"); - return spanCallable.callInSpan(); } return spanCallable.callInSpan(); } diff --git a/context/src/main/java/io/opentelemetry/context/Context.java b/context/src/main/java/io/opentelemetry/context/Context.java index 9f583f55b80..163ba824a54 100644 --- a/context/src/main/java/io/opentelemetry/context/Context.java +++ b/context/src/main/java/io/opentelemetry/context/Context.java @@ -261,10 +261,7 @@ default Runnable wrap(Runnable runnable) { * and then invokes the input {@link Runnable}. */ default Callable wrap(Callable callable) { - if (callable == null) { - ApiUsageLogger.logNullParam(Context.class, "wrap", "callable"); - return () -> null; - } + Objects.requireNonNull(callable, "callable"); return () -> { try (Scope ignored = makeCurrent()) { return callable.call(); @@ -312,10 +309,7 @@ default ScheduledExecutorService wrap(ScheduledExecutorService executor) { * and then invokes the input {@link Function}. */ default Function wrapFunction(Function function) { - if (function == null) { - ApiUsageLogger.logNullParam(Context.class, "wrapFunction", "function"); - return t -> null; - } + Objects.requireNonNull(function, "function"); return t -> { try (Scope ignored = makeCurrent()) { return function.apply(t); @@ -328,10 +322,7 @@ default Function wrapFunction(Function function) { * and then invokes the input {@link BiFunction}. */ default BiFunction wrapFunction(BiFunction function) { - if (function == null) { - ApiUsageLogger.logNullParam(Context.class, "wrapFunction", "function"); - return (t, u) -> null; - } + Objects.requireNonNull(function, "function"); return (t, u) -> { try (Scope ignored = makeCurrent()) { return function.apply(t, u); @@ -376,10 +367,7 @@ default BiConsumer wrapConsumer(BiConsumer consumer) { * and then invokes the input {@link Supplier}. */ default Supplier wrapSupplier(Supplier supplier) { - if (supplier == null) { - ApiUsageLogger.logNullParam(Context.class, "wrapSupplier", "supplier"); - return () -> null; - } + Objects.requireNonNull(supplier, "supplier"); return () -> { try (Scope ignored = makeCurrent()) { return supplier.get(); diff --git a/docs/knowledge/api-design.md b/docs/knowledge/api-design.md index ebdbf768229..e02964fc5be 100644 --- a/docs/knowledge/api-design.md +++ b/docs/knowledge/api-design.md @@ -93,7 +93,13 @@ gracefully (return `this`, an empty/noop result, or substitute a safe default su The preferred noop is a strict no-op (skip the operation entirely). However, if the method already degrades gracefully for a null argument — for example, substituting `Attributes.empty()` and continuing rather than returning early — preserve that existing behavior. The goal is to -**always log** the misuse, **never change** existing graceful degradation that is already correct: +**always log** the misuse, **never change** existing graceful degradation that is already correct. + +**Exception — non-void functional interfaces**: methods that accept a `Callable`, +`Function`, `Supplier`, or similar non-void callback have no safe noop — a +null-returning lambda would cause downstream NPEs. Use `Objects.requireNonNull` even at a +runtime boundary. Void-producing types (`Runnable`, `Consumer`, `Executor`) are fine with a +no-op lambda. ```java // Existing graceful degradation — add the log, keep the substitution diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java index 2300d9ae7ae..e594d9ad1fc 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.common.internal.ExtendedAttributesMap; @@ -100,7 +101,11 @@ public ExtendedSdkLogRecordBuilder setBody(Value value) { @Override public ExtendedSdkLogRecordBuilder setAttribute(ExtendedAttributeKey key, T value) { - if (key == null || key.getKey().isEmpty() || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(ExtendedSdkLogRecordBuilder.class, "setAttribute", "key"); + return this; + } + if (key.getKey().isEmpty() || value == null) { return this; } if (this.extendedAttributes == null) { diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java index be8417b0bb5..240eea9b401 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java @@ -13,6 +13,7 @@ import io.opentelemetry.api.internal.GuardedBy; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.common.internal.ExtendedAttributesMap; import io.opentelemetry.sdk.logs.data.internal.ExtendedLogRecordData; @@ -97,7 +98,11 @@ public ExtendedSdkReadWriteLogRecord setAttribute(AttributeKey key, T val @Override public ExtendedSdkReadWriteLogRecord setAttribute(ExtendedAttributeKey key, T value) { - if (key == null || key.getKey().isEmpty() || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(ExtendedSdkReadWriteLogRecord.class, "setAttribute", "key"); + return this; + } + if (key.getKey().isEmpty() || value == null) { return this; } synchronized (lock) { diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java index 0d81b95adc5..d5edc61abce 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java @@ -153,7 +153,11 @@ public SdkLogRecordBuilder setException(Throwable throwable) { @Override public SdkLogRecordBuilder setAttribute(AttributeKey key, @Nullable T value) { - if (key == null || key.getKey().isEmpty() || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(SdkLogRecordBuilder.class, "setAttribute", "key"); + return this; + } + if (key.getKey().isEmpty() || value == null) { return this; } if (this.attributes == null) { diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java index 8ea462bc82c..c820ddbc2d1 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.internal.GuardedBy; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.common.internal.AttributesMap; import io.opentelemetry.sdk.logs.data.LogRecordData; @@ -91,7 +92,11 @@ static SdkReadWriteLogRecord create( @Override public ReadWriteLogRecord setAttribute(AttributeKey key, T value) { - if (key == null || key.getKey().isEmpty() || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(SdkReadWriteLogRecord.class, "setAttribute", "key"); + return this; + } + if (key.getKey().isEmpty() || value == null) { return this; } synchronized (lock) { diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java index aa0b66505fc..d45cc56595e 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java @@ -332,7 +332,11 @@ AnchoredClock getClock() { @Override public ReadWriteSpan setAttribute(AttributeKey key, @Nullable T value) { - if (key == null || key.getKey().isEmpty() || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "setAttribute", "key"); + return this; + } + if (key.getKey().isEmpty() || value == null) { return this; } synchronized (lock) { @@ -537,10 +541,15 @@ public ReadWriteSpan updateName(String name) { @Override public Span addLink(SpanContext spanContext, Attributes attributes) { - if (spanContext == null || !spanContext.isValid()) { + if (spanContext == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "addLink", "spanContext"); + return this; + } + if (!spanContext.isValid()) { return this; } if (attributes == null) { + ApiUsageLogger.logNullParam(SdkSpan.class, "addLink", "attributes"); attributes = Attributes.empty(); } LinkData link = diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java index 5d08739e518..6e1f5345f55 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java @@ -114,6 +114,7 @@ public SpanBuilder addLink(SpanContext spanContext, Attributes attributes) { return this; } if (attributes == null) { + ApiUsageLogger.logNullParam(SdkSpanBuilder.class, "addLink", "attributes"); attributes = Attributes.empty(); } int totalAttributeCount = attributes.size(); @@ -180,7 +181,11 @@ public SpanBuilder setAttribute(String key, boolean value) { @Override public SpanBuilder setAttribute(AttributeKey key, @Nullable T value) { - if (key == null || key.getKey().isEmpty() || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(SdkSpanBuilder.class, "setAttribute", "key"); + return this; + } + if (key.getKey().isEmpty() || value == null) { return this; } attributes().put(key, value); From 464106cde39364c012079ebb194fc7ed5beb6dad Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 8 May 2026 15:47:24 -0500 Subject: [PATCH 07/10] sixth pass --- .../ArrayBackedExtendedAttributesBuilder.java | 8 ++- .../incubator/logs/ExtendedDefaultLogger.java | 6 +++ .../metrics/ExtendedDefaultMeter.java | 50 +++++++++++++++++++ .../trace/ExtendedDefaultTracerProvider.java | 4 ++ .../io/opentelemetry/context/Context.java | 2 + .../jfr/JfrLocationDataCompositor.java | 5 ++ .../sdk/logs/ExtendedSdkLogRecordBuilder.java | 6 ++- .../logs/ExtendedSdkReadWriteLogRecord.java | 6 ++- .../SettableContextStorageProvider.java | 2 + .../exporter/InMemoryLogRecordExporter.java | 2 + .../exporter/InMemoryMetricExporter.java | 3 ++ .../exporter/InMemoryMetricReader.java | 4 ++ .../exporter/InMemoryMetricReaderBuilder.java | 4 ++ .../exporter/InMemorySpanExporter.java | 2 + .../sdk/testing/time/TestClock.java | 4 ++ 15 files changed, 105 insertions(+), 3 deletions(-) diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ArrayBackedExtendedAttributesBuilder.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ArrayBackedExtendedAttributesBuilder.java index 22c6ffc6870..90294630d22 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ArrayBackedExtendedAttributesBuilder.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ArrayBackedExtendedAttributesBuilder.java @@ -7,6 +7,7 @@ import io.opentelemetry.api.common.Value; import io.opentelemetry.api.common.ValueType; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -36,7 +37,11 @@ public ExtendedAttributes build() { @Override public ExtendedAttributesBuilder put(ExtendedAttributeKey key, T value) { - if (key == null || key.getKey().isEmpty() || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(ExtendedAttributesBuilder.class, "put", "key"); + return this; + } + if (key.getKey().isEmpty() || value == null) { return this; } if (key.getType() == ExtendedAttributeType.VALUE && value instanceof Value) { @@ -156,6 +161,7 @@ private static ExtendedAttributeType attributeType(List> arrayValues) { @Override public ExtendedAttributesBuilder removeIf(Predicate> predicate) { if (predicate == null) { + ApiUsageLogger.logNullParam(ExtendedAttributesBuilder.class, "removeIf", "predicate"); return this; } for (int i = 0; i < data.size() - 1; i += 2) { diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java index 06df5ecdd09..bada0677b3a 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java @@ -31,6 +31,12 @@ static Logger getNoop() { @Override public boolean isEnabled(Severity severity, Context context) { + if (severity == null) { + ApiUsageLogger.logNullParam(Logger.class, "isEnabled", "severity"); + } + if (context == null) { + ApiUsageLogger.logNullParam(Logger.class, "isEnabled", "context"); + } return false; } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java index 8bee86dc2d8..d622e45a93f 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/metrics/ExtendedDefaultMeter.java @@ -171,11 +171,17 @@ private static class NoopLongCounterBuilder implements ExtendedLongCounterBuilde @Override public LongCounterBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(LongCounterBuilder.class, "setDescription", "description"); + } return this; } @Override public LongCounterBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(LongCounterBuilder.class, "setUnit", "unit"); + } return this; } @@ -210,11 +216,17 @@ private static class NoopDoubleCounterBuilder implements ExtendedDoubleCounterBu @Override public DoubleCounterBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(DoubleCounterBuilder.class, "setDescription", "description"); + } return this; } @Override public DoubleCounterBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(DoubleCounterBuilder.class, "setUnit", "unit"); + } return this; } @@ -297,11 +309,18 @@ private static class NoopLongUpDownCounterBuilder implements ExtendedLongUpDownC @Override public LongUpDownCounterBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam( + LongUpDownCounterBuilder.class, "setDescription", "description"); + } return this; } @Override public LongUpDownCounterBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(LongUpDownCounterBuilder.class, "setUnit", "unit"); + } return this; } @@ -340,11 +359,18 @@ private static class NoopDoubleUpDownCounterBuilder @Override public DoubleUpDownCounterBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam( + DoubleUpDownCounterBuilder.class, "setDescription", "description"); + } return this; } @Override public DoubleUpDownCounterBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(DoubleUpDownCounterBuilder.class, "setUnit", "unit"); + } return this; } @@ -426,11 +452,17 @@ private static class NoopDoubleHistogramBuilder implements ExtendedDoubleHistogr @Override public DoubleHistogramBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(DoubleHistogramBuilder.class, "setDescription", "description"); + } return this; } @Override public DoubleHistogramBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(DoubleHistogramBuilder.class, "setUnit", "unit"); + } return this; } @@ -450,11 +482,17 @@ private static class NoopLongHistogramBuilder implements ExtendedLongHistogramBu @Override public LongHistogramBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(LongHistogramBuilder.class, "setDescription", "description"); + } return this; } @Override public LongHistogramBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(LongHistogramBuilder.class, "setUnit", "unit"); + } return this; } @@ -472,11 +510,17 @@ private static class NoopDoubleGaugeBuilder implements ExtendedDoubleGaugeBuilde @Override public DoubleGaugeBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(DoubleGaugeBuilder.class, "setDescription", "description"); + } return this; } @Override public DoubleGaugeBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(DoubleGaugeBuilder.class, "setUnit", "unit"); + } return this; } @@ -535,11 +579,17 @@ private static class NoopLongGaugeBuilder implements ExtendedLongGaugeBuilder { @Override public LongGaugeBuilder setDescription(String description) { + if (description == null) { + ApiUsageLogger.logNullParam(LongGaugeBuilder.class, "setDescription", "description"); + } return this; } @Override public LongGaugeBuilder setUnit(String unit) { + if (unit == null) { + ApiUsageLogger.logNullParam(LongGaugeBuilder.class, "setUnit", "unit"); + } return this; } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerProvider.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerProvider.java index add4a30cd2d..0075791be90 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerProvider.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracerProvider.java @@ -35,6 +35,10 @@ public Tracer get(String instrumentationScopeName, String instrumentationScopeVe ApiUsageLogger.logNullParam( ExtendedDefaultTracerProvider.class, "get", "instrumentationScopeName"); } + if (instrumentationScopeVersion == null) { + ApiUsageLogger.logNullParam( + ExtendedDefaultTracerProvider.class, "get", "instrumentationScopeVersion"); + } return ExtendedDefaultTracer.getNoop(); } diff --git a/context/src/main/java/io/opentelemetry/context/Context.java b/context/src/main/java/io/opentelemetry/context/Context.java index 163ba824a54..54c57e3df27 100644 --- a/context/src/main/java/io/opentelemetry/context/Context.java +++ b/context/src/main/java/io/opentelemetry/context/Context.java @@ -286,6 +286,7 @@ default Executor wrap(Executor executor) { * making this the {@linkplain Context#current() current context} before each execution. */ default ExecutorService wrap(ExecutorService executor) { + Objects.requireNonNull(executor, "executor"); if (executor instanceof ContextExecutorService) { return executor; } @@ -298,6 +299,7 @@ default ExecutorService wrap(ExecutorService executor) { * execution. */ default ScheduledExecutorService wrap(ScheduledExecutorService executor) { + Objects.requireNonNull(executor, "executor"); if (executor instanceof ContextScheduledExecutorService) { return executor; } diff --git a/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrLocationDataCompositor.java b/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrLocationDataCompositor.java index fb35f713504..aabc45387f2 100644 --- a/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrLocationDataCompositor.java +++ b/opentelemetry-jfr-profiles-shim/src/main/java/io/opentelemetry/sdk/profiles/jfr/JfrLocationDataCompositor.java @@ -5,6 +5,7 @@ package io.opentelemetry.sdk.profiles.jfr; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.sdk.profiles.ProfilesDictionaryCompositor; import io.opentelemetry.sdk.profiles.data.FunctionData; import io.opentelemetry.sdk.profiles.data.LineData; @@ -58,6 +59,10 @@ private JfrLocationDataCompositor(ProfilesDictionaryCompositor profilesDictionar * @return the index of the added or existing StackData element. */ public int putIfAbsent(List frameList) { + if (frameList == null) { + ApiUsageLogger.logNullParam(JfrLocationDataCompositor.class, "putIfAbsent", "frameList"); + return -1; + } List locationIndices = frameList.stream().map(this::frameToLocation).toList(); diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java index e594d9ad1fc..f2ce1000ada 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java @@ -119,7 +119,11 @@ public ExtendedSdkLogRecordBuilder setAttribute(ExtendedAttributeKey key, @Override public ExtendedSdkLogRecordBuilder setAttribute(AttributeKey key, @Nullable T value) { - if (key == null || key.getKey().isEmpty() || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(ExtendedSdkLogRecordBuilder.class, "setAttribute", "key"); + return this; + } + if (key.getKey().isEmpty() || value == null) { return this; } return setAttribute(ExtendedAttributeKey.fromAttributeKey(key), value); diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java index 240eea9b401..d2cca0ebf78 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java @@ -90,7 +90,11 @@ static ExtendedSdkReadWriteLogRecord create( @Override public ExtendedSdkReadWriteLogRecord setAttribute(AttributeKey key, T value) { - if (key == null || key.getKey().isEmpty() || value == null) { + if (key == null) { + ApiUsageLogger.logNullParam(ExtendedSdkReadWriteLogRecord.class, "setAttribute", "key"); + return this; + } + if (key.getKey().isEmpty() || value == null) { return this; } return setAttribute(ExtendedAttributeKey.fromAttributeKey(key), value); diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/context/SettableContextStorageProvider.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/context/SettableContextStorageProvider.java index 22b4fc6ec87..d247b342ca1 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/context/SettableContextStorageProvider.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/context/SettableContextStorageProvider.java @@ -11,6 +11,7 @@ import io.opentelemetry.context.Scope; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.ServiceLoader; import javax.annotation.Nullable; @@ -23,6 +24,7 @@ public ContextStorage get() { /** Sets the {@link ContextStorage} to use for future context operations. */ public static void setContextStorage(ContextStorage storage) { + Objects.requireNonNull(storage, "storage"); SettableContextStorage.delegate = storage; } diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryLogRecordExporter.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryLogRecordExporter.java index acb4a47c35b..3be53539502 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryLogRecordExporter.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryLogRecordExporter.java @@ -12,6 +12,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -60,6 +61,7 @@ public void reset() { */ @Override public CompletableResultCode export(Collection logs) { + Objects.requireNonNull(logs, "logs"); if (isStopped) { return CompletableResultCode.ofFailure(); } diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java index 9249e0971fb..6f279a23e43 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java @@ -14,6 +14,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -75,6 +76,7 @@ public static InMemoryMetricExporter create() { /** Returns a new {@link InMemoryMetricExporter} with the given {@code aggregationTemporality}. */ public static InMemoryMetricExporter create(AggregationTemporality aggregationTemporality) { + Objects.requireNonNull(aggregationTemporality, "aggregationTemporality"); return new InMemoryMetricExporter(aggregationTemporality); } @@ -108,6 +110,7 @@ public AggregationTemporality getAggregationTemporality(InstrumentType instrumen */ @Override public CompletableResultCode export(Collection metrics) { + Objects.requireNonNull(metrics, "metrics"); if (isStopped) { return CompletableResultCode.ofFailure(); } diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReader.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReader.java index 3b79affe346..d84ac5c2039 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReader.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReader.java @@ -19,6 +19,7 @@ import io.opentelemetry.sdk.metrics.export.MetricReader; import java.util.Collection; import java.util.Collections; +import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -81,6 +82,8 @@ public static InMemoryMetricReader create() { public static InMemoryMetricReader create( AggregationTemporalitySelector aggregationTemporalitySelector, DefaultAggregationSelector defaultAggregationSelector) { + Objects.requireNonNull(aggregationTemporalitySelector, "aggregationTemporalitySelector"); + Objects.requireNonNull(defaultAggregationSelector, "defaultAggregationSelector"); return new InMemoryMetricReader(aggregationTemporalitySelector, defaultAggregationSelector); } @@ -115,6 +118,7 @@ public Collection collectAllMetrics() { @Override public void register(CollectionRegistration collectionRegistration) { + Objects.requireNonNull(collectionRegistration, "collectionRegistration"); this.collectionRegistration = collectionRegistration; } diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReaderBuilder.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReaderBuilder.java index 8a0c934bb2d..a5452da9d55 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReaderBuilder.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReaderBuilder.java @@ -12,6 +12,7 @@ import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector; import io.opentelemetry.sdk.metrics.export.MetricExporter; +import java.util.Objects; /** * Builder for {@link InMemoryMetricReader}. @@ -42,6 +43,7 @@ public final class InMemoryMetricReaderBuilder { */ public InMemoryMetricReaderBuilder setAggregationTemporalitySelector( AggregationTemporalitySelector aggregationTemporalitySelector) { + Objects.requireNonNull(aggregationTemporalitySelector, "aggregationTemporalitySelector"); this.aggregationTemporalitySelector = aggregationTemporalitySelector; return this; } @@ -56,6 +58,7 @@ public InMemoryMetricReaderBuilder setAggregationTemporalitySelector( @SuppressWarnings("unused") public InMemoryMetricReaderBuilder setDefaultAggregationSelector( DefaultAggregationSelector defaultAggregationSelector) { + Objects.requireNonNull(defaultAggregationSelector, "defaultAggregationSelector"); this.defaultAggregationSelector = defaultAggregationSelector; return this; } @@ -67,6 +70,7 @@ public InMemoryMetricReaderBuilder setDefaultAggregationSelector( * @return this {@link InMemoryMetricReaderBuilder} */ public InMemoryMetricReaderBuilder setMemoryMode(MemoryMode memoryMode) { + Objects.requireNonNull(memoryMode, "memoryMode"); this.memoryMode = memoryMode; return this; } diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemorySpanExporter.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemorySpanExporter.java index 0c2768d8b7f..7dd5483637a 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemorySpanExporter.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemorySpanExporter.java @@ -12,6 +12,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -74,6 +75,7 @@ public void reset() { @Override public CompletableResultCode export(Collection spans) { + Objects.requireNonNull(spans, "spans"); if (isStopped) { return CompletableResultCode.ofFailure(); } diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/time/TestClock.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/time/TestClock.java index 15c986eee97..c054f4f9297 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/time/TestClock.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/time/TestClock.java @@ -9,6 +9,7 @@ import io.opentelemetry.sdk.common.Clock; import java.time.Duration; import java.time.Instant; +import java.util.Objects; import java.util.concurrent.TimeUnit; import javax.annotation.concurrent.ThreadSafe; @@ -35,16 +36,19 @@ public static TestClock create() { /** Creates a clock with the given time. */ public static TestClock create(Instant instant) { + Objects.requireNonNull(instant, "instant"); return new TestClock(toNanos(instant)); } /** Sets the current time. */ public synchronized void setTime(Instant instant) { + Objects.requireNonNull(instant, "instant"); currentEpochNanos = toNanos(instant); } /** Advances the time and mutates this instance. */ public synchronized void advance(Duration duration) { + Objects.requireNonNull(duration, "duration"); advance(duration.toNanos(), TimeUnit.NANOSECONDS); } From 9f0af5805efbf7631900e610907ca4c38d17875a Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 8 May 2026 16:17:39 -0500 Subject: [PATCH 08/10] seventh pass --- .../io/opentelemetry/api/OpenTelemetry.java | 2 ++ .../api/common/ArrayBackedAttributes.java | 2 ++ .../api/trace/ArrayBasedTraceState.java | 1 + .../api/trace/ArrayBasedTraceStateBuilder.java | 10 ++++++++++ .../java/io/opentelemetry/api/trace/Span.java | 6 ++++++ .../opentelemetry/api/trace/TracerProvider.java | 5 +++++ .../common/ArrayBackedExtendedAttributes.java | 2 ++ .../incubator/common/ExtendedAttributes.java | 2 ++ .../common/ExtendedAttributesBuilder.java | 3 +++ .../logs/ExtendedLogRecordBuilder.java | 17 +++++++++++++++-- .../sdk/metrics/SdkDoubleCounter.java | 6 ++++++ .../sdk/metrics/SdkDoubleGauge.java | 8 ++++++++ .../sdk/metrics/SdkDoubleUpDownCounter.java | 7 +++++++ .../sdk/metrics/SdkLongCounter.java | 6 ++++++ .../opentelemetry/sdk/metrics/SdkLongGauge.java | 5 +++++ .../sdk/metrics/SdkLongUpDownCounter.java | 7 +++++++ .../io/opentelemetry/sdk/metrics/SdkMeter.java | 10 ++++++++++ 17 files changed, 97 insertions(+), 2 deletions(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/OpenTelemetry.java b/api/all/src/main/java/io/opentelemetry/api/OpenTelemetry.java index 673c6e429eb..04a0421b7e2 100644 --- a/api/all/src/main/java/io/opentelemetry/api/OpenTelemetry.java +++ b/api/all/src/main/java/io/opentelemetry/api/OpenTelemetry.java @@ -13,6 +13,7 @@ import io.opentelemetry.api.trace.TracerBuilder; import io.opentelemetry.api.trace.TracerProvider; import io.opentelemetry.context.propagation.ContextPropagators; +import java.util.Objects; /** * The entrypoint to telemetry functionality for tracing, metrics and baggage. @@ -37,6 +38,7 @@ static OpenTelemetry noop() { * otherwise. */ static OpenTelemetry propagating(ContextPropagators propagators) { + Objects.requireNonNull(propagators, "propagators"); return DefaultOpenTelemetry.getPropagating(propagators); } diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ArrayBackedAttributes.java b/api/all/src/main/java/io/opentelemetry/api/common/ArrayBackedAttributes.java index d44022965ab..fea9c8fced3 100644 --- a/api/all/src/main/java/io/opentelemetry/api/common/ArrayBackedAttributes.java +++ b/api/all/src/main/java/io/opentelemetry/api/common/ArrayBackedAttributes.java @@ -6,6 +6,7 @@ package io.opentelemetry.api.common; import io.opentelemetry.api.internal.ImmutableKeyValuePairs; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -48,6 +49,7 @@ public AttributesBuilder toBuilder() { @Nullable public T get(AttributeKey key) { if (key == null) { + ApiUsageLogger.logNullParam(Attributes.class, "get", "key"); return null; } if (key.getType() == AttributeType.VALUE) { diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceState.java b/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceState.java index 485937f0345..2a74f1c157c 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceState.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceState.java @@ -22,6 +22,7 @@ abstract class ArrayBasedTraceState implements TraceState { @Nullable public String get(String key) { if (key == null) { + ApiUsageLogger.logNullParam(TraceState.class, "get", "key"); return null; } List entries = getEntries(); diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceStateBuilder.java b/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceStateBuilder.java index 09c3d1e0303..4bcb07391a0 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceStateBuilder.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceStateBuilder.java @@ -6,6 +6,7 @@ package io.opentelemetry.api.trace; import io.opentelemetry.api.internal.StringUtils; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -66,6 +67,14 @@ static TraceState empty() { */ @Override public TraceStateBuilder put(String key, String value) { + if (key == null) { + ApiUsageLogger.logNullParam(TraceStateBuilder.class, "put", "key"); + return this; + } + if (value == null) { + ApiUsageLogger.logNullParam(TraceStateBuilder.class, "put", "value"); + return this; + } if (!isKeyValid(key) || !isValueValid(value) || numEntries >= MAX_ENTRIES) { return this; } @@ -88,6 +97,7 @@ public TraceStateBuilder put(String key, String value) { @Override public TraceStateBuilder remove(String key) { if (key == null) { + ApiUsageLogger.logNullParam(TraceStateBuilder.class, "remove", "key"); return this; } for (int i = 0; i < reversedEntries.size(); i += 2) { diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/Span.java b/api/all/src/main/java/io/opentelemetry/api/trace/Span.java index 0fea5803077..e8893dbf7ef 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/Span.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/Span.java @@ -407,6 +407,12 @@ default Span addLink(SpanContext spanContext) { * @since 1.37.0 */ default Span addLink(SpanContext spanContext, Attributes attributes) { + if (spanContext == null) { + ApiUsageLogger.logNullParam(Span.class, "addLink", "spanContext"); + } + if (attributes == null) { + ApiUsageLogger.logNullParam(Span.class, "addLink", "attributes"); + } return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/TracerProvider.java b/api/all/src/main/java/io/opentelemetry/api/trace/TracerProvider.java index 2ef9d12acfe..750a3d0babb 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/TracerProvider.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/TracerProvider.java @@ -5,6 +5,7 @@ package io.opentelemetry.api.trace; +import io.opentelemetry.common.impl.ApiUsageLogger; import javax.annotation.concurrent.ThreadSafe; /** @@ -52,6 +53,10 @@ static TracerProvider noop() { * @since 1.4.0 */ default TracerBuilder tracerBuilder(String instrumentationScopeName) { + if (instrumentationScopeName == null) { + ApiUsageLogger.logNullParam( + TracerProvider.class, "tracerBuilder", "instrumentationScopeName"); + } return DefaultTracerBuilder.getInstance(); } } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ArrayBackedExtendedAttributes.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ArrayBackedExtendedAttributes.java index 6390138ce28..f2150666ed1 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ArrayBackedExtendedAttributes.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ArrayBackedExtendedAttributes.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.common.Value; import io.opentelemetry.api.common.ValueType; import io.opentelemetry.api.internal.ImmutableKeyValuePairs; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -57,6 +58,7 @@ public ExtendedAttributesBuilder toBuilder() { @Nullable public T get(ExtendedAttributeKey key) { if (key == null) { + ApiUsageLogger.logNullParam(ExtendedAttributes.class, "get", "key"); return null; } if (key.getType() == ExtendedAttributeType.VALUE) { diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ExtendedAttributes.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ExtendedAttributes.java index 5fe75be4cb5..d0a06855909 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ExtendedAttributes.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ExtendedAttributes.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.Map; import java.util.function.BiConsumer; import javax.annotation.Nullable; @@ -59,6 +60,7 @@ public interface ExtendedAttributes { @Nullable default T get(AttributeKey key) { if (key == null) { + ApiUsageLogger.logNullParam(ExtendedAttributes.class, "get", "key"); return null; } return get(ExtendedAttributeKey.fromAttributeKey(key)); diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ExtendedAttributesBuilder.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ExtendedAttributesBuilder.java index a8f7fdf72a4..ebc3542d748 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ExtendedAttributesBuilder.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/common/ExtendedAttributesBuilder.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Value; +import io.opentelemetry.common.impl.ApiUsageLogger; import java.util.Arrays; import java.util.List; import java.util.function.Predicate; @@ -221,6 +222,7 @@ default ExtendedAttributesBuilder put(String key, boolean... value) { @SuppressWarnings({"unchecked"}) default ExtendedAttributesBuilder putAll(Attributes attributes) { if (attributes == null) { + ApiUsageLogger.logNullParam(ExtendedAttributesBuilder.class, "putAll", "attributes"); return this; } attributes.forEach((key, value) -> put((AttributeKey) key, value)); @@ -235,6 +237,7 @@ default ExtendedAttributesBuilder putAll(Attributes attributes) { @SuppressWarnings({"unchecked"}) default ExtendedAttributesBuilder putAll(ExtendedAttributes attributes) { if (attributes == null) { + ApiUsageLogger.logNullParam(ExtendedAttributesBuilder.class, "putAll", "attributes"); return this; } attributes.forEach((key, value) -> put((ExtendedAttributeKey) key, value)); diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedLogRecordBuilder.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedLogRecordBuilder.java index 5e9eb383f62..09dac80821b 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedLogRecordBuilder.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedLogRecordBuilder.java @@ -12,6 +12,7 @@ import io.opentelemetry.api.incubator.common.ExtendedAttributes; import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Severity; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import java.time.Instant; import java.util.concurrent.TimeUnit; @@ -58,6 +59,10 @@ public interface ExtendedLogRecordBuilder extends LogRecordBuilder { /** {@inheritDoc} */ @Override default ExtendedLogRecordBuilder setBody(Value body) { + if (body == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setBody", "body"); + return this; + } setBody(body.asString()); return this; } @@ -83,7 +88,11 @@ default ExtendedLogRecordBuilder setBody(Value body) { @SuppressWarnings("unchecked") @Override default ExtendedLogRecordBuilder setAllAttributes(Attributes attributes) { - if (attributes == null || attributes.isEmpty()) { + if (attributes == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setAllAttributes", "attributes"); + return this; + } + if (attributes.isEmpty()) { return this; } attributes.forEach( @@ -103,7 +112,11 @@ default ExtendedLogRecordBuilder setAllAttributes(Attributes attributes) { */ @SuppressWarnings("unchecked") default ExtendedLogRecordBuilder setAllAttributes(ExtendedAttributes attributes) { - if (attributes == null || attributes.isEmpty()) { + if (attributes == null) { + ApiUsageLogger.logNullParam(ExtendedLogRecordBuilder.class, "setAllAttributes", "attributes"); + return this; + } + if (attributes.isEmpty()) { return this; } attributes.forEach( diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java index d742fd23134..f5e95d27e87 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java @@ -72,6 +72,8 @@ public void add(double increment) { static class SdkDoubleCounterBuilder implements DoubleCounterBuilder { + private static final ObservableDoubleCounter NOOP_OBSERVABLE_COUNTER = + new ObservableDoubleCounter() {}; final InstrumentBuilder builder; SdkDoubleCounterBuilder( @@ -107,6 +109,10 @@ public DoubleCounterBuilder setUnit(String unit) { @Override public ObservableDoubleCounter buildWithCallback( Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(DoubleCounterBuilder.class, "buildWithCallback", "callback"); + return NOOP_OBSERVABLE_COUNTER; + } return builder.buildDoubleAsynchronousInstrument(InstrumentType.OBSERVABLE_COUNTER, callback); } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java index 3cba8529b6e..b075055cd39 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java @@ -9,6 +9,7 @@ import io.opentelemetry.api.metrics.DoubleGauge; import io.opentelemetry.api.metrics.DoubleGaugeBuilder; import io.opentelemetry.api.metrics.LongGaugeBuilder; +import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.api.metrics.ObservableDoubleGauge; import io.opentelemetry.api.metrics.ObservableDoubleMeasurement; import io.opentelemetry.common.impl.ApiUsageLogger; @@ -58,6 +59,9 @@ public void set(double value) { } static class SdkDoubleGaugeBuilder implements DoubleGaugeBuilder { + + private static final ObservableDoubleGauge NOOP_OBSERVABLE_GAUGE = + new ObservableDoubleGauge() {}; final InstrumentBuilder builder; SdkDoubleGaugeBuilder(SdkMeter sdkMeter, String name) { @@ -89,6 +93,10 @@ public LongGaugeBuilder ofLongs() { @Override public ObservableDoubleGauge buildWithCallback(Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(DoubleGaugeBuilder.class, "buildWithCallback", "callback"); + return NOOP_OBSERVABLE_GAUGE; + } return builder.buildDoubleAsynchronousInstrument(InstrumentType.OBSERVABLE_GAUGE, callback); } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java index 3122949c95c..79cad29dd6d 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java @@ -59,6 +59,8 @@ public void add(double increment) { static class SdkDoubleUpDownCounterBuilder implements DoubleUpDownCounterBuilder { + private static final ObservableDoubleUpDownCounter NOOP_OBSERVABLE_COUNTER = + new ObservableDoubleUpDownCounter() {}; final InstrumentBuilder builder; SdkDoubleUpDownCounterBuilder( @@ -95,6 +97,11 @@ public DoubleUpDownCounter build() { @Override public ObservableDoubleUpDownCounter buildWithCallback( Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam( + DoubleUpDownCounterBuilder.class, "buildWithCallback", "callback"); + return NOOP_OBSERVABLE_COUNTER; + } return builder.buildDoubleAsynchronousInstrument( InstrumentType.OBSERVABLE_UP_DOWN_COUNTER, callback); } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java index 56db69d3b49..bd0245c5e0c 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java @@ -73,6 +73,8 @@ public void add(long increment) { static class SdkLongCounterBuilder implements LongCounterBuilder { + private static final ObservableLongCounter NOOP_OBSERVABLE_COUNTER = + new ObservableLongCounter() {}; final InstrumentBuilder builder; SdkLongCounterBuilder(SdkMeter sdkMeter, String name) { @@ -104,6 +106,10 @@ public DoubleCounterBuilder ofDoubles() { @Override public ObservableLongCounter buildWithCallback(Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(LongCounterBuilder.class, "buildWithCallback", "callback"); + return NOOP_OBSERVABLE_COUNTER; + } return builder.buildLongAsynchronousInstrument(InstrumentType.OBSERVABLE_COUNTER, callback); } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java index 924006fc34a..d6f964f0a4a 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java @@ -58,6 +58,7 @@ public void set(long value) { static class SdkLongGaugeBuilder implements LongGaugeBuilder { + private static final ObservableLongGauge NOOP_OBSERVABLE_GAUGE = new ObservableLongGauge() {}; final InstrumentBuilder builder; SdkLongGaugeBuilder( @@ -92,6 +93,10 @@ public SdkLongGauge build() { @Override public ObservableLongGauge buildWithCallback(Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam(LongGaugeBuilder.class, "buildWithCallback", "callback"); + return NOOP_OBSERVABLE_GAUGE; + } return builder.buildLongAsynchronousInstrument(InstrumentType.OBSERVABLE_GAUGE, callback); } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java index a34528be4bb..ab8ba1f838c 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java @@ -59,6 +59,8 @@ public void add(long increment) { static class SdkLongUpDownCounterBuilder implements LongUpDownCounterBuilder { + private static final ObservableLongUpDownCounter NOOP_OBSERVABLE_COUNTER = + new ObservableLongUpDownCounter() {}; final InstrumentBuilder builder; SdkLongUpDownCounterBuilder(SdkMeter sdkMeter, String name) { @@ -92,6 +94,11 @@ public DoubleUpDownCounterBuilder ofDoubles() { @Override public ObservableLongUpDownCounter buildWithCallback( Consumer callback) { + if (callback == null) { + ApiUsageLogger.logNullParam( + LongUpDownCounterBuilder.class, "buildWithCallback", "callback"); + return NOOP_OBSERVABLE_COUNTER; + } return builder.buildLongAsynchronousInstrument( InstrumentType.OBSERVABLE_UP_DOWN_COUNTER, callback); } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java index 99aed0f7895..e5f5225d4af 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java @@ -17,6 +17,7 @@ import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.api.metrics.ObservableMeasurement; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.metrics.data.MetricData; @@ -78,6 +79,7 @@ final class SdkMeter implements Meter { private static final Meter NOOP_METER = MeterProvider.noop().get("noop"); private static final String NOOP_INSTRUMENT_NAME = "noop"; + private static final BatchCallback NOOP_BATCH_CALLBACK = new BatchCallback() {}; private final Object collectLock = new Object(); private final Object callbackLock = new Object(); @@ -210,6 +212,14 @@ public BatchCallback batchCallback( Runnable callback, ObservableMeasurement observableMeasurement, ObservableMeasurement... additionalMeasurements) { + if (callback == null) { + ApiUsageLogger.logNullParam(Meter.class, "batchCallback", "callback"); + return NOOP_BATCH_CALLBACK; + } + if (observableMeasurement == null) { + ApiUsageLogger.logNullParam(Meter.class, "batchCallback", "observableMeasurement"); + return NOOP_BATCH_CALLBACK; + } Set measurements = new HashSet<>(); measurements.add(observableMeasurement); Collections.addAll(measurements, additionalMeasurements); From 3cfc4c7475eb5b554303131090ed42227a84b15a Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 8 May 2026 16:27:06 -0500 Subject: [PATCH 09/10] eigth pass --- .../opentelemetry/sdk/logs/LogRecordProcessor.java | 2 ++ .../sdk/logs/export/LogRecordExporter.java | 2 ++ .../io/opentelemetry/sdk/metrics/SdkDoubleGauge.java | 1 - .../io/opentelemetry/sdk/trace/SdkSpanBuilder.java | 12 ++++++++++-- .../java/io/opentelemetry/sdk/trace/SdkTracer.java | 6 +++++- .../io/opentelemetry/sdk/trace/SpanProcessor.java | 2 ++ .../opentelemetry/sdk/trace/export/SpanExporter.java | 2 ++ 7 files changed, 23 insertions(+), 4 deletions(-) diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/LogRecordProcessor.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/LogRecordProcessor.java index a14acaa042d..7c8d0de47d0 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/LogRecordProcessor.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/LogRecordProcessor.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.concurrent.TimeUnit; import javax.annotation.concurrent.ThreadSafe; @@ -38,6 +39,7 @@ static LogRecordProcessor composite(LogRecordProcessor... processors) { * processors} in order. */ static LogRecordProcessor composite(Iterable processors) { + Objects.requireNonNull(processors, "processors"); List processorList = new ArrayList<>(); for (LogRecordProcessor processor : processors) { processorList.add(processor); diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/LogRecordExporter.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/LogRecordExporter.java index 9b0fd51facb..6c213960b90 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/LogRecordExporter.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/LogRecordExporter.java @@ -14,6 +14,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.concurrent.TimeUnit; /** @@ -43,6 +44,7 @@ static LogRecordExporter composite(LogRecordExporter... exporters) { * {@link SimpleLogRecordProcessor} or a {@link BatchLogRecordProcessor}. */ static LogRecordExporter composite(Iterable exporters) { + Objects.requireNonNull(exporters, "exporters"); List exportersList = new ArrayList<>(); for (LogRecordExporter exporter : exporters) { exportersList.add(exporter); diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java index b075055cd39..c63a0f9ebef 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java @@ -9,7 +9,6 @@ import io.opentelemetry.api.metrics.DoubleGauge; import io.opentelemetry.api.metrics.DoubleGaugeBuilder; import io.opentelemetry.api.metrics.LongGaugeBuilder; -import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.api.metrics.ObservableDoubleGauge; import io.opentelemetry.api.metrics.ObservableDoubleMeasurement; import io.opentelemetry.common.impl.ApiUsageLogger; diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java index 6e1f5345f55..f4d5adb4dc1 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java @@ -101,7 +101,11 @@ public SpanBuilder setSpanKind(SpanKind spanKind) { @Override public SpanBuilder addLink(SpanContext spanContext) { - if (spanContext == null || !spanContext.isValid()) { + if (spanContext == null) { + ApiUsageLogger.logNullParam(SdkSpanBuilder.class, "addLink", "spanContext"); + return this; + } + if (!spanContext.isValid()) { return this; } addLink(LinkData.create(spanContext)); @@ -110,7 +114,11 @@ public SpanBuilder addLink(SpanContext spanContext) { @Override public SpanBuilder addLink(SpanContext spanContext, Attributes attributes) { - if (spanContext == null || !spanContext.isValid()) { + if (spanContext == null) { + ApiUsageLogger.logNullParam(SdkSpanBuilder.class, "addLink", "spanContext"); + return this; + } + if (!spanContext.isValid()) { return this; } if (attributes == null) { diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracer.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracer.java index bac55710884..8194d25d3ba 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracer.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracer.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.TracerProvider; +import io.opentelemetry.common.impl.ApiUsageLogger; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.trace.internal.TracerConfig; @@ -65,7 +66,10 @@ public SpanBuilder spanBuilder(String spanName) { if (!tracerEnabled) { return NOOP_TRACER.spanBuilder(spanName); } - if (spanName == null || spanName.trim().isEmpty()) { + if (spanName == null) { + ApiUsageLogger.logNullParam(SdkTracer.class, "spanBuilder", "spanName"); + spanName = FALLBACK_SPAN_NAME; + } else if (spanName.trim().isEmpty()) { spanName = FALLBACK_SPAN_NAME; } if (sharedState.hasBeenShutdown()) { diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SpanProcessor.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SpanProcessor.java index ba9fb037c84..08a1614eb15 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SpanProcessor.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SpanProcessor.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.concurrent.TimeUnit; import javax.annotation.concurrent.ThreadSafe; @@ -35,6 +36,7 @@ static SpanProcessor composite(SpanProcessor... processors) { * in order. */ static SpanProcessor composite(Iterable processors) { + Objects.requireNonNull(processors, "processors"); List processorsList = new ArrayList<>(); for (SpanProcessor processor : processors) { processorsList.add(processor); diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SpanExporter.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SpanExporter.java index 86fb4aa0fb8..a15d289d0df 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SpanExporter.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SpanExporter.java @@ -14,6 +14,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.concurrent.TimeUnit; /** @@ -42,6 +43,7 @@ static SpanExporter composite(SpanExporter... exporters) { * {@link SimpleSpanProcessor} or a {@link BatchSpanProcessor}. */ static SpanExporter composite(Iterable exporters) { + Objects.requireNonNull(exporters, "exporters"); List exportersList = new ArrayList<>(); for (SpanExporter exporter : exporters) { exportersList.add(exporter); From 44ba8832cfc31c588235997f128eceae2887a657 Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 8 May 2026 16:37:44 -0500 Subject: [PATCH 10/10] ninth pass --- .../sdk/testing/exporter/InMemoryMetricExporter.java | 1 + .../sdk/testing/exporter/InMemoryMetricReader.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java index 6f279a23e43..92990e72ae1 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java @@ -100,6 +100,7 @@ public void reset() { @Override public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return aggregationTemporality; } diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReader.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReader.java index d84ac5c2039..3537ed47001 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReader.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricReader.java @@ -124,11 +124,13 @@ public void register(CollectionRegistration collectionRegistration) { @Override public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return aggregationTemporalitySelector.getAggregationTemporality(instrumentType); } @Override public Aggregation getDefaultAggregation(InstrumentType instrumentType) { + Objects.requireNonNull(instrumentType, "instrumentType"); return defaultAggregationSelector.getDefaultAggregation(instrumentType); }