I’m trying to init-otel-sdk! with a metric-exporter and I’m getting this error:
Caused by: java.lang.NullPointerException: Cannot invoke "io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector.getDefaultAggregation(io.opentelemetry.sdk.metrics.InstrumentType)" because "defaultAggregationSelector" is null
I’m not setting :default-aggregation-selector though; to debug I’m trying to run DefaultAggregationSelector/getDefault , but I’m getting Unable to find static field: getDefault in interface io.opentelemetry.sdk.metrics.export.DefaultAggregationSelectoris there any additional configuration I must have? I’m setting the endpoint and headers
and they work for the trace exporter
I don't immediately see why you are getting this error. Are you getting the error when calling init-otel-sdk! or at some other point? Can you show a stack trace of the error? Also, can you share your code that uses init-otel-sdk!? https://github.com/steffan-westcott/clj-otel/blob/7e893b3cb76a3ffd46d3bc2458aa21b37b729722/examples/factorial-app/src/example/factorial_app.clj#L72 is an example of a metric exporter included in the configuration.
The default setting for default-aggregation-selector is equivalent to this explicit setting:
(otlp-grpc-metrics/metric-exporter {:default-aggregation-selector
(fn [_instrument-type] (Aggregation/defaultAggregation))})Hello!
(def common-config
{:enabled? true, :endpoint "", :headers {"x-honeycomb-team" "", "x-honeycomb-dataset" "monorepo"}})
(otel.sdk/init-otel-sdk! "monorepo"
{:resources [(otel.resources/host-resource)
(otel.resources/os-resource)
(otel.resources/process-resource)
(otel.resources/process-runtime-resource)]
:meter-provider
{:readers {:meter-reader (meter/periodic-metric-reader
{:interval [1 TimeUnit/SECONDS]
:metric-exporter (otlp-grpc-metrics/metric-exporter common-config)})}}}) Here is the stacktrace:
Caused by: java.lang.NullPointerException: Cannot invoke "io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector.getDefaultAggregation(io.opentelemetry.sdk.metrics.InstrumentType)" because "defaultAggregationSelector" is null
at io.opentelemetry.sdk.metrics.internal.view.ViewRegistry.<init>(ViewRegistry.java:69)
at io.opentelemetry.sdk.metrics.internal.view.ViewRegistry.create(ViewRegistry.java:83)
at io.opentelemetry.sdk.metrics.SdkMeterProvider.lambda$new$0(SdkMeterProvider.java:74)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.IdentityHashMap$EntrySpliterator.forEachRemaining(IdentityHashMap.java:1563)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at io.opentelemetry.sdk.metrics.SdkMeterProvider.<init>(SdkMeterProvider.java:75)
at io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder.build(SdkMeterProviderBuilder.java:155)
at steffan_westcott.clj_otel.sdk.meter_provider$sdk_meter_provider.invokeStatic(meter_provider.clj:114)
at steffan_westcott.clj_otel.sdk.meter_provider$sdk_meter_provider.invoke(meter_provider.clj:105)
at steffan_westcott.clj_otel.sdk.otel_sdk$init_otel_sdk_BANG_.invokeStatic(otel_sdk.clj:185)
at steffan_westcott.clj_otel.sdk.otel_sdk$init_otel_sdk_BANG_.invoke(otel_sdk.clj:28)
at cognician.system.otel$eval48140$fn__48142.invoke(otel.clj:47)
at clojure.lang.MultiFn.invoke(MultiFn.java:234)
at cognician.system$init$fn__16242.invoke(system.cljc:77)
at clojure.core$comp$fn__5876.invoke(core.clj:2587)
at integrant.core$try_build_action.invokeStatic(core.cljc:294):readers should be a collection of maps, each map specifies a reader. In your code example, :readers is a single map.
So the code should read like this:
(otel.sdk/init-otel-sdk! "monorepo"
{:resources [(otel.resources/host-resource)
(otel.resources/os-resource)
(otel.resources/process-resource)
(otel.resources/process-runtime-resource)]
:meter-provider
{:readers [{:meter-reader (meter/periodic-metric-reader
{:interval [1 TimeUnit/SECONDS]
:metric-exporter (otlp-grpc-metrics/metric-exporter common-config)})}]}})thanks! Trying again
hmm I changed it like described, I’m getting the same error
1. Unhandled java.lang.NullPointerException
Cannot invoke
"io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector.getDefaultAggregation(io.opentelemetry.sdk.metrics.InstrumentType)"
because "defaultAggregationSelector" is null
ViewRegistry.java: 69 io.opentelemetry.sdk.metrics.internal.view.ViewRegistry/<init>
ViewRegistry.java: 83 io.opentelemetry.sdk.metrics.internal.view.ViewRegistry/create
SdkMeterProvider.java: 74 io.opentelemetry.sdk.metrics.SdkMeterProvider/lambda$new$0
ReferencePipeline.java: 197 java.util.stream.ReferencePipeline$3$1/accept
IdentityHashMap.java: 1563 java.util.IdentityHashMap$EntrySpliterator/forEachRemaining
AbstractPipeline.java: 509 java.util.stream.AbstractPipeline/copyInto
AbstractPipeline.java: 499 java.util.stream.AbstractPipeline/wrapAndCopyInto
ReduceOps.java: 921 java.util.stream.ReduceOps$ReduceOp/evaluateSequential
AbstractPipeline.java: 234 java.util.stream.AbstractPipeline/evaluate
ReferencePipeline.java: 682 java.util.stream.ReferencePipeline/collect
SdkMeterProvider.java: 75 io.opentelemetry.sdk.metrics.SdkMeterProvider/<init>
SdkMeterProviderBuilder.java: 155 io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder/build
meter_provider.clj: 114 steffan-westcott.clj-otel.sdk.meter-provider/sdk-meter-provider
meter_provider.clj: 105 steffan-westcott.clj-otel.sdk.meter-provider/sdk-meter-provider
otel_sdk.clj: 185 steffan-westcott.clj-otel.sdk.otel-sdk/init-otel-sdk!
otel_sdk.clj: 28 steffan-westcott.clj-otel.sdk.otel-sdk/init-otel-sdk!
REPL: 35 cognician.system.otel/eval163435
REPL: 35 cognician.system.otel/eval163435
Compiler.java: 7194 clojure.lang.Compiler/eval
Compiler.java: 7149 clojure.lang.Compiler/eval
core.clj: 3215 clojure.core/eval
core.clj: 3211 clojure.core/eval
interruptible_eval.clj: 87 nrepl.middleware.interruptible-eval/evaluate/fn/fn
AFn.java: 152 clojure.lang.AFn/applyToHelper
AFn.java: 144 clojure.lang.AFn/applyTo
core.clj: 667 clojure.core/apply
core.clj: 1990 clojure.core/with-bindings*
core.clj: 1990 clojure.core/with-bindings*
RestFn.java: 425 clojure.lang.RestFn/invoke
interruptible_eval.clj: 87 nrepl.middleware.interruptible-eval/evaluate/fn
main.clj: 437 clojure.main/repl/read-eval-print/fn
main.clj: 437 clojure.main/repl/read-eval-print
main.clj: 458 clojure.main/repl/fn
main.clj: 458 clojure.main/repl
main.clj: 368 clojure.main/repl
RestFn.java: 1523 clojure.lang.RestFn/invoke
interruptible_eval.clj: 84 nrepl.middleware.interruptible-eval/evaluate
interruptible_eval.clj: 56 nrepl.middleware.interruptible-eval/evaluate
interruptible_eval.clj: 152 nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
AFn.java: 22 clojure.lang.AFn/run
session.clj: 218 nrepl.middleware.session/session-exec/main-loop/fn
session.clj: 217 nrepl.middleware.session/session-exec/main-loop
AFn.java: 22 clojure.lang.AFn/run
Thread.java: 833 java.lang.Thread/runI solved my issue.. it is :metric-reader , not :meter-reader ; thanks for you patience @steffan!
Good spot! I'm glad you have solved your issue 😅