rollcage
rollcage copied to clipboard
Make Clojure stack-traces less mental
We should be able to (optionally) strip a bunch of crazy Clojure internals from call-stacks.
Apply
If this new option is enabled we would strip or otherwise sanitise calls to apply
. Apply produces 4 stack frames from every invocation.
at clojure.lang.RestFn.invoke(RestFn.java:410)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at clojure.core$apply.invoke(core.clj:632)
First
clojure.lang.RT.first (RT.java:653)
clojure.core/first--4110 (core.clj:55)
First of a lazy-seq:
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.LazySeq.first(LazySeq.java:71)
Here is a sample call-stack:
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:601)
at clojure.data.xml$pull_seq$fn__6285.invoke(xml.clj:287)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.RT.seq(RT.java:507)
at clojure.core$seq__4128.invoke(core.clj:137)
at clojure.data.xml$seq_tree$fn__6193.invoke(xml.clj:178)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.LazySeq.first(LazySeq.java:71)
at clojure.lang.RT.first(RT.java:653)
at clojure.core$first__4110.invoke(core.clj:55)
at clojure.core$ffirst__4120.invoke(core.clj:103)
at clojure.data.xml$event_tree.invoke(xml.clj:194)
at clojure.data.xml$parse.doInvoke(xml.clj:346)
at clojure.lang.RestFn.invoke(RestFn.java:410)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at clojure.core$apply.invoke(core.clj:632)
at clojure.data.xml$parse_str.doInvoke(xml.clj:354)
at clojure.lang.RestFn.invoke(RestFn.java:410)
at test_results_service.parse.junit$test_suites.invoke(junit.clj:35)
at test_results_service.parse.junit$parse_junit.invoke(junit.clj:159)
at test_results_service.parse.junit$results_file.invoke(junit.clj:203)
at clojure.core$partial$fn__4531.invoke(core.clj:2507)
at clojure.core$map$fn__4553.invoke(core.clj:2622)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.RT.seq(RT.java:507)
at clojure.core$seq__4128.invoke(core.clj:137)
at clojure.core$concat$fn__4215.invoke(core.clj:691)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.Cons.next(Cons.java:39)
at clojure.lang.RT.boundedLength(RT.java:1735)
at clojure.lang.RestFn.applyTo(RestFn.java:130)
at clojure.core$apply.invoke(core.clj:632)
at test_results_service.parse.junit$collect_tests.invoke(junit.clj:220)
at test_results_service.core$process_result_file.invoke(core.clj:67)
at test_results_service.core$receive_message$fn17249__17261$fn__17267$iter__17270__17274$fn__17275$fn__17276.invoke(core.clj:116)
at test_results_service.core$receive_message$fn17249__17261$fn__17267$iter__17270__17274$fn__17275.invoke(core.clj:115)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.Cons.next(Cons.java:39)
at clojure.lang.RT.boundedLength(RT.java:1735)
at clojure.lang.RestFn.applyTo(RestFn.java:130)
at clojure.core$apply.invoke(core.clj:632)
at test_results_service.core$receive_message$fn17249__17261$fn__17267.invoke(core.clj:117)
at test_results_service.core$receive_message$fn17249__17261.invoke(core.clj:106)
at clojure.lang.AFn.applyToHelper(AFn.java:160)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.lang.AFunction$1.doInvoke(AFunction.java:29)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:630)
at circle_util.queue$return_json$fn__16199.doInvoke(queue.clj:82)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:632)
at circle_util.queue$publish_return$fn__16202.doInvoke(queue.clj:88)
at clojure.lang.RestFn.applyTo(RestFn.java:139)
at clojure.core$apply.invoke(core.clj:636)
at circle_util.queue$ack$fn__16193.doInvoke(queue.clj:65)
at clojure.lang.RestFn.invoke(RestFn.java:445)
at clojure.lang.AFn.applyToHelper(AFn.java:160)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at clojure.core$apply.invoke(core.clj:636)
at circle_util.queue$consume_json$fn__16196.doInvoke(queue.clj:76)
at clojure.lang.RestFn.invoke(RestFn.java:445)
at clojure.lang.AFn.applyToHelper(AFn.java:160)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at clojure.core$apply.invoke(core.clj:634)
at circle_util.queue$timing$fn__16205.doInvoke(queue.clj:100)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invoke(core.clj:634)
at circle_util.queue$timing$fn__16205.doInvoke(queue.clj:100)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invoke(core.clj:630)
at test_results_service.core$create_rollbar_queue_middleware$fn__17297$fn__17298.doInvoke(core.clj:128)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:630)
at circle_util.queue$log_errors$fn__16222.doInvoke(queue.clj:134)
at clojure.lang.RestFn.invoke(RestFn.java:436)
at langohr.consumers$create_default$fn__10343.invoke(consumers.clj:60)
at langohr.consumers.proxy$com.rabbitmq.client.DefaultConsumer$ff19274a.handleDelivery(Unknown Source)
at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:144)
at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:95)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
And the same callstack after some internals are removed:
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:601)
at clojure.data.xml$pull_seq$fn__6285.invoke(xml.clj:287)
at clojure.lang.RT.seq(RT.java:507)
at clojure.core$seq__4128.invoke(core.clj:137)
at clojure.data.xml$seq_tree$fn__6193.invoke(xml.clj:178)
at clojure.core$ffirst__4120.invoke(core.clj:103)
at clojure.data.xml$event_tree.invoke(xml.clj:194)
at clojure.data.xml$parse.doInvoke(xml.clj:346)
at clojure.lang.RestFn.invoke(RestFn.java:410)
at clojure.data.xml$parse_str.doInvoke(xml.clj:354)
at clojure.lang.RestFn.invoke(RestFn.java:410)
at test_results_service.parse.junit$test_suites.invoke(junit.clj:35)
at test_results_service.parse.junit$parse_junit.invoke(junit.clj:159)
at test_results_service.parse.junit$results_file.invoke(junit.clj:203)
at clojure.core$partial$fn__4531.invoke(core.clj:2507)
at clojure.core$map$fn__4553.invoke(core.clj:2622)
at clojure.lang.RT.seq(RT.java:507)
at clojure.core$seq__4128.invoke(core.clj:137)
at clojure.core$concat$fn__4215.invoke(core.clj:691)
at clojure.lang.Cons.next(Cons.java:39)
at clojure.lang.RT.boundedLength(RT.java:1735)
at test_results_service.parse.junit$collect_tests.invoke(junit.clj:220)
at test_results_service.core$process_result_file.invoke(core.clj:67)
at test_results_service.core$receive_message$fn17249__17261$fn__17267$iter__17270__17274$fn__17275$fn__17276.invoke(core.clj:116)
at test_results_service.core$receive_message$fn17249__17261$fn__17267$iter__17270__17274$fn__17275.invoke(core.clj:115)
at clojure.lang.Cons.next(Cons.java:39)
at clojure.lang.RT.boundedLength(RT.java:1735)
at test_results_service.core$receive_message$fn17249__17261$fn__17267.invoke(core.clj:117)
at test_results_service.core$receive_message$fn17249__17261.invoke(core.clj:106)
at clojure.lang.AFunction$1.doInvoke(AFunction.java:29)
at circle_util.queue$return_json$fn__16199.doInvoke(queue.clj:82)
at circle_util.queue$publish_return$fn__16202.doInvoke(queue.clj:88)
at circle_util.queue$ack$fn__16193.doInvoke(queue.clj:65)
at clojure.lang.RestFn.invoke(RestFn.java:445)
at circle_util.queue$consume_json$fn__16196.doInvoke(queue.clj:76)
at clojure.lang.RestFn.invoke(RestFn.java:445)
at circle_util.queue$timing$fn__16205.doInvoke(queue.clj:100)
at circle_util.queue$timing$fn__16205.doInvoke(queue.clj:100)
at test_results_service.core$create_rollbar_queue_middleware$fn__17297$fn__17298.doInvoke(core.clj:128)
at circle_util.queue$log_errors$fn__16222.doInvoke(queue.clj:134)
at clojure.lang.RestFn.invoke(RestFn.java:436)
at langohr.consumers$create_default$fn__10343.invoke(consumers.clj:60)
at langohr.consumers.proxy$com.rabbitmq.client.DefaultConsumer$ff19274a.handleDelivery(Unknown Source)
at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:144)
at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:95)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)