X-Ray Resulting Null


I was trying using x-ray to my time series data. But the X-Ray showed only null return. Is it a bug or a problem at my data?


I’m also getting the same behavior when I go to run most X-Rays. I’ll try and go through my saved questions again to see if there is a pattern, but the X-Ray is on the most detailed setting and seems to almost immediately return null.

I do remember it working 1-2 times previously when I was on 2.7 initially, however since they I made a bunch of metadata edits and FK links and field type corrections and then days later attempted to run the xray with the corrected information and its just ‘null’. There was rescans in between any edits and the xray attempts so it had time to process any changes.


The errors that I seem to be getting are : (trace below)

Dec 19 11:29:48 WARN metabase.feature-extraction.async :: Async job 15 encountered an error:
{:cause nil, :via [{:type java.lang.NumberFormatException, :message nil, :at [java.math.BigDecimal “BigDecimal.java” 494]}], :trace [[java.math.BigDecimal “BigDecimal.java” 494] [java.math.BigDecimal “BigDecimal.java” 383] [java.math.BigDecimal “BigDecimal.java” 806] [java.math.BigDecimal valueOf “BigDecimal.java” 1274] [clojure.core$bigdec invokeStatic “core.clj” 3552] [clojure.core$bigdec invoke “core.clj” 3545] [metabase.util$round_to_decimals invokeStatic “util.clj” 631] [metabase.util$round_to_decimals invoke “util.clj” 625] [metabase.feature_extraction.core$trim_decimals invokeStatic “core.clj” 223] [metabase.feature_extraction.core$trim_decimals invoke “core.clj” 221] [metabase.feature_extraction.core$humanize_values$fn__44844 invoke “core.clj” 240] [clojure.walk$walk invokeStatic “walk.clj” 50] [clojure.walk$postwalk invokeStatic “walk.clj” 52] [clojure.walk$postwalk invoke “walk.clj” 52] [clojure.core$partial$fn__4759 invoke “core.clj” 2515] [clojure.core$map$fn__4785 invoke “core.clj” 2644] [clojure.lang.LazySeq sval “LazySeq.java” 40] [clojure.lang.LazySeq seq “LazySeq.java” 49] [clojure.lang.RT seq “RT.java” 521] [clojure.lang.LazilyPersistentVector create “LazilyPersistentVector.java” 44] [clojure.core$vec invokeStatic “core.clj” 377] [clojure.walk$walk invokeStatic “walk.clj” 45] [clojure.walk$postwalk invokeStatic “walk.clj” 52] [clojure.walk$postwalk invoke “walk.clj” 52] [clojure.core$partial$fn__4759 invoke “core.clj” 2515] [clojure.core$map$fn__4785 invoke “core.clj” 2646] [clojure.lang.LazySeq sval “LazySeq.java” 40] [clojure.lang.LazySeq seq “LazySeq.java” 49] [clojure.lang.Cons next “Cons.java” 39] [clojure.lang.RT next “RT.java” 688] [clojure.core$next__4341 invokeStatic “core.clj” 64] [clojure.core.protocols$fn__6755 invokeStatic “protocols.clj” 168] [clojure.core.protocols$fn__6755 invoke “protocols.clj” 124] [clojure.core.protocols$fn__6710$G__6705__6719 invoke “protocols.clj” 19] [clojure.core.protocols$seq_reduce invokeStatic “protocols.clj” 31] [clojure.core.protocols$fn__6738 invokeStatic “protocols.clj” 75] [clojure.core.protocols$fn__6738 invoke “protocols.clj” 75] [clojure.core.protocols$fn__6684$G__6679__6697 invoke “protocols.clj” 13] [clojure.core$reduce invokeStatic “core.clj” 6545] [clojure.core$into invokeStatic “core.clj” 6610] [clojure.walk$walk invokeStatic “walk.clj” 49] [clojure.walk$postwalk invokeStatic “walk.clj” 52] [clojure.walk$postwalk invoke “walk.clj” 52] [metabase.feature_extraction.core$humanize_values invokeStatic “core.clj” 237] [metabase.feature_extraction.core$humanize_values invoke “core.clj” 235] [clojure.core$comp$fn__4727 invoke “core.clj” 2460] [clojure.core$comp$fn__4727 invoke “core.clj” 2460] [medley.core$map_vals$fn__1415$fn__1416 invoke “core.cljc” 64] [clojure.core$fn__6939$fn__6941 invoke “core.clj” 6557] [clojure.core.protocols$iter_reduce invokeStatic “protocols.clj” 49] [clojure.core.protocols$fn__6742 invokeStatic “protocols.clj” 75] [clojure.core.protocols$fn__6742 invoke “protocols.clj” 75] [clojure.core.protocols$fn__6684$G__6679__6697 invoke “protocols.clj” 13] [clojure.core$reduce invokeStatic “core.clj” 6545] [clojure.core$fn__6939 invokeStatic “core.clj” 6547] [clojure.core$fn__6939 invoke “core.clj” 6547] [clojure.core.protocols$fn__6763$G__6758__6772 invoke “protocols.clj” 174] [clojure.core$reduce_kv invokeStatic “core.clj” 6573] [clojure.core$reduce_kv invoke “core.clj” 6564] [medley.core$reduce_map invokeStatic “core.cljc” 40] [medley.core$reduce_map invoke “core.cljc” 38] [medley.core$map_vals invokeStatic “core.cljc” 64] [medley.core$map_vals invoke “core.cljc” 61] [metabase.feature_extraction.core$x_ray$fn__44847 invoke “core.clj” 255] [clojure.core$update invokeStatic “core.clj” 5960] [clojure.core$update invoke “core.clj” 5952] [clojure.lang.AFn applyToHelper “AFn.java” 160] [clojure.lang.RestFn applyTo “RestFn.java” 132] [clojure.core$apply invokeStatic “core.clj” 652] [clojure.core$apply invoke “core.clj” 641] [metabase.util$update_when invokeStatic “util.clj” 862] [metabase.util$update_when doInvoke “util.clj” 858] [clojure.lang.RestFn invoke “RestFn.java” 445] [metabase.feature_extraction.core$x_ray invokeStatic “core.clj” 252] [metabase.feature_extraction.core$x_ray invoke “core.clj” 245] [metabase.api.x_ray$x_ray$fn__44889 invoke “x_ray.clj” 42] [metabase.feature_extraction.async$compute$fn__31613 invoke “async.clj” 98] [clojure.core$binding_conveyor_fn$fn__4676 invoke “core.clj” 1938] [clojure.lang.AFn call “AFn.java” 18] [java.util.concurrent.FutureTask run “FutureTask.java” 266] [java.util.concurrent.ThreadPoolExecutor runWorker “ThreadPoolExecutor.java” 1149] [java.util.concurrent.ThreadPoolExecutor$Worker run “ThreadPoolExecutor.java” 624] [java.lang.Thread run “Thread.java” 748]]}.


I was success creating the xray while limiting my date (only half year) it show result, but if I set from the beginning of year, it show null again. Is there any limit?


I’ll hop on to my instance and check to see if I limit the date further if it’ll render the X-ray correctly.

I preferred to have questions limited to 1-2 years or so for a bigger picture while the dashboard would filter on the last 30 days, etc since the only difference was in a few ranges while the questions remained the same.


I agree with it. It needs at least 1 year, but I still test some variable that maybe affect the xray. I’ll update when I get some finding.


There is a minimal amount of data requirement only for a small portion of time series xrays and these are (should be) handled gracefully. This seems to be a bug in how we do some precision conversions.


@WindowsDevPro any chance you can construct a minimal case to reproduce this? It looks like we produce a NaN or an Inf somewhere. Or at the very least against what (a timeseries card? a field? …) this xray was run. Thanks!


Should be fixed on master. Thanks for reporting!