rollcage icon indicating copy to clipboard operation
rollcage copied to clipboard

Make Clojure stack-traces less mental

Open marcomorain opened this issue 8 years ago • 0 comments

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)

marcomorain avatar Feb 25 '16 15:02 marcomorain