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

  1. Pass a real CollectorMetrics instance, or the built-in no-op: CollectorMetrics.NOOP_METRICS
  2. In DI setups, provide a default CollectorMetrics bean (NOOP) so injection never yields null
  3. 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

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


AI-assisted analysis of openzipkin/zipkin@878ce2a1fa (2026-08-14). Data as JSON: /api/errors/e9389fd9ddc943c5. Report an issue: GitHub.