clj-otel

Dimitar Uzunov 2024-04-23T08:54:43.189989Z

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.DefaultAggregationSelector

Dimitar Uzunov 2024-04-23T08:55:15.771319Z

is there any additional configuration I must have? I’m setting the endpoint and headers

Dimitar Uzunov 2024-04-23T08:55:22.434859Z

and they work for the trace exporter

steffan 2024-04-23T13:42:23.590129Z

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))})

Dimitar Uzunov 2024-04-23T15:05:06.155559Z

Hello!

Dimitar Uzunov 2024-04-23T15:06:00.624569Z

(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)})}}})

Dimitar Uzunov 2024-04-23T15:06:54.275959Z

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)

steffan 2024-04-23T16:15:16.714629Z

:readers should be a collection of maps, each map specifies a reader. In your code example, :readers is a single map.

steffan 2024-04-23T16:20:36.480629Z

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)})}]}})

Dimitar Uzunov 2024-04-23T17:03:03.260169Z

thanks! Trying again

Dimitar Uzunov 2024-04-23T17:29:35.069819Z

hmm I changed it like described, I’m getting the same error

Dimitar Uzunov 2024-04-23T17:45:32.609559Z

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/run

Dimitar Uzunov 2024-04-24T06:08:06.977939Z

I solved my issue.. it is :metric-reader , not :meter-reader ; thanks for you patience @steffan!

steffan 2024-04-24T08:57:47.666659Z

Good spot! I'm glad you have solved your issue 😅

1