{"record":{"id":"9020fd6f923326a2","repo":"openzipkin/zipkin","slug":"metrics-null","errorCode":null,"errorMessage":"metrics == null","messagePattern":"metrics == null","errorType":"exception","errorClass":"NullPointerException","httpStatus":null,"severity":"error","filePath":"zipkin-collector/activemq/src/main/java/zipkin2/collector/activemq/ActiveMQCollector.java","lineNumber":43,"sourceCode":"  public static final class Builder extends CollectorComponent.Builder {\n    Collector.Builder delegate = Collector.newBuilder(ActiveMQCollector.class);\n    CollectorMetrics metrics = CollectorMetrics.NOOP_METRICS;\n    ActiveMQConnectionFactory connectionFactory;\n    String queue = \"zipkin\";\n    int concurrency = 1;\n\n    @Override public Builder storage(StorageComponent storage) {\n      this.delegate.storage(storage);\n      return this;\n    }\n\n    @Override public Builder sampler(CollectorSampler sampler) {\n      this.delegate.sampler(sampler);\n      return this;\n    }\n\n    @Override public Builder metrics(CollectorMetrics metrics) {\n      if (metrics == null) throw new NullPointerException(\"metrics == null\");\n      this.metrics = metrics.forTransport(\"activemq\");\n      this.delegate.metrics(this.metrics);\n      return this;\n    }\n\n    public Builder connectionFactory(ActiveMQConnectionFactory connectionFactory) {\n      if (connectionFactory == null) throw new NullPointerException(\"connectionFactory == null\");\n      this.connectionFactory = connectionFactory;\n      return this;\n    }\n\n    /** Queue zipkin spans will be consumed from. Defaults to \"zipkin\". */\n    public Builder queue(String queue) {\n      if (queue == null) throw new NullPointerException(\"queue == null\");\n      this.queue = queue;\n      return this;\n    }\n","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/openzipkin/zipkin/blob/878ce2a1fad54ca941d17fdcf2e1d924b148eb1f/zipkin-collector/activemq/src/main/java/zipkin2/collector/activemq/ActiveMQCollector.java#L25-L61","documentation":"ActiveMQCollector.Builder.metrics is a required setter: passing null throws NullPointerException immediately (fail-fast contract used throughout Zipkin collectors). The metrics object is also scoped to the 'activemq' transport via CollectorMetrics.forTransport, so the collector can report messages/spans/bytes per transport.","triggerScenarios":"Calling ActiveMQCollector.newBuilder().metrics(null) — typically when a wiring/framework config property for metrics is absent and the code forwards null unconditionally.","commonSituations":"DI/Guice/Spring wiring where the metrics binding is missing; copying an example that assumed an implicit default; test code that only sets storage and connectionFactory.","solutions":["Pass a real CollectorMetrics instance, at minimum CollectorMetrics.NOOP_METRICS if you don't want metrics.","Fix the dependency wiring so the metrics binding (e.g. InMemoryCollectorMetrics for tests) is provided.","If null came from a config lookup, default it: metrics != null ? metrics : CollectorMetrics.NOOP_METRICS."],"exampleFix":"// before\nbuilder.metrics(config.get(\"metrics\")); // returns null -> NPE\n\n// after\nCollectorMetrics m = config.get(\"metrics\");\nbuilder.metrics(m != null ? m : CollectorMetrics.NOOP_METRICS);","handlingStrategy":"validation","validationCode":"java\nif (metrics == null) metrics = CollectorMetrics.NOOP_METRICS;\nbuilder.metrics(metrics);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Centralize collector construction in one factory that requires CollectorMetrics as a parameter.","Bind a default CollectorMetrics in DI so it can never resolve to null."],"tags":["zipkin","java","activemq","collector","configuration"],"backgroundTag":null,"analyzedSha":"878ce2a1fad54ca941d17fdcf2e1d924b148eb1f","analyzedAt":"2026-08-14T15:17:09.895Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}