openzipkin/zipkin · error · NullPointerException
metrics == null
Error message
metrics == null
What it means
PulsarCollector.Builder.metrics(CollectorMetrics) throws NullPointerException when metrics is null (checked via Objects.isNull). The builder requires a non-null metrics implementation so per-transport metrics ('pulsar' transport) can be registered on the delegate Collector. Fail-fast at builder time.
Source
Thrown at zipkin-collector/pulsar/src/main/java/zipkin2/collector/pulsar/PulsarCollector.java:45
/** Configuration including defaults needed to consume spans from a Pulsar topic. */
public static final class Builder extends CollectorComponent.Builder {
final Collector.Builder delegate = Collector.newBuilder(PulsarCollector.class);
CollectorMetrics metrics = CollectorMetrics.NOOP_METRICS;
Map<String, Object> clientProps = new HashMap<>();
Map<String, Object> consumerProps = new HashMap<>();
String topic = "zipkin";
int concurrency = 1;
@Override
public Builder storage(StorageComponent storage) {
delegate.storage(storage);
return this;
}
@Override
public Builder metrics(CollectorMetrics metrics) {
if (Objects.isNull(metrics)) throw new NullPointerException("metrics == null");
this.metrics = metrics.forTransport("pulsar");
this.delegate.metrics(this.metrics);
return this;
}
@Override
public Builder sampler(CollectorSampler sampler) {
this.delegate.sampler(sampler);
return this;
}
@Override
public PulsarCollector build() {
return new PulsarCollector(this);
}
/** Count of concurrent message consumers on the topic. Defaults to 1. */
public Builder concurrency(Integer concurrency) {View on GitHub (pinned to 878ce2a1fa)
Solutions
- Pass a real CollectorMetrics instance, or the built-in no-op: CollectorMetrics.NOOP_METRICS
- In DI setups, provide a default CollectorMetrics bean (NOOP) so injection never yields null
- Simply omit the metrics() call — the builder already defaults to NOOP metrics
Example fix
// before builder.metrics(config.isEnabled() ? metricsImpl : null); // after builder.metrics(config.isEnabled() ? metricsImpl : CollectorMetrics.NOOP_METRICS);
Defensive patterns
Strategy: validation
Validate before calling
CollectorMetrics metricsToUse = (metrics == null) ? CollectorMetrics.NOOP_METRICS : metrics; builder.metrics(metricsToUse);
Prevention
- Never use null to mean 'no metrics' — pass CollectorMetrics.NOOP_METRICS
- Provide a default metrics bean in DI containers so injection cannot yield null
When it happens
Trigger: Calling .metrics(null), or wiring from a dependency-injection container where the CollectorMetrics bean is not defined/injectable and null is passed.
Common situations: Custom server integration where metrics are optional and the integrator passes a null 'when no metrics configured'.
Related errors
- topic is null or empty
- serviceUrl is null or empty
- metrics == null
- metrics == null
- bootstrapServers == null
AI-assisted analysis of openzipkin/zipkin@878ce2a1fa (2026-08-14).
Data as JSON: /api/errors/e9389fd9ddc943c5.
Report an issue: GitHub.