Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add backtrace to error messages #7434

Merged
merged 12 commits into from
Sep 7, 2023
Merged

Add backtrace to error messages #7434

merged 12 commits into from
Sep 7, 2023

Conversation

comphead
Copy link
Contributor

@comphead comphead commented Aug 28, 2023

Which issue does this PR close?

Part of #7360 .

Rationale for this change

Currently the user getting only error description which sometimes makes investigation more complex, adding optional back trace

What changes are included in this PR?

Adding the optional back trace for the errors being thrown.
By default the backtrace is disabled, to enable it uses Rust mechanism described https://doc.rust-lang.org/std/backtrace/index.html#environment-variables

Added .strip_backtrace() method to Datafusion Errors to get the error message only if the backtrace enabled

User Example

DataFusion CLI v30.0.0
❯ select row_numer() over (partition by a order by a) from (select 1 a);
Error during planning: Invalid function 'row_numer'.
Did you mean 'ROW_NUMBER'?

with backtrace enabled

RUST_BACKTRACE=1 ./target/debug/datafusion-cli 
DataFusion CLI v30.0.0
❯ select row_numer() over (partition by a order by a) from (select 1 a);
Error during planning: Invalid function 'row_numer'.
Did you mean 'ROW_NUMBER'?

backtrace:    0: std::backtrace_rs::backtrace::libunwind::trace
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1: std::backtrace_rs::backtrace::trace_unsynchronized
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2: std::backtrace::Backtrace::create
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/std/src/backtrace.rs:332:13
   3: std::backtrace::Backtrace::capture
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/std/src/backtrace.rs:298:9
   4: datafusion_common::error::DataFusionError::get_back_trace
             at rust/arrow-datafusion/datafusion/common/src/error.rs:428:26
   5: datafusion_sql::expr::function::<impl datafusion_sql::planner::SqlToRel<S>>::sql_function_to_expr
             at /rust/arrow-datafusion/datafusion/sql/src/expr/function.rs:163:9
   6: datafusion_sql::expr::<impl datafusion_sql::planner::SqlToRel<S>>::sql_expr_to_logical_expr_internal
             at /rust/arrow-datafusion/datafusion/sql/src/expr/mod.rs:429:17
   7: datafusion_sql::expr::<impl datafusion_sql::planner::SqlToRel<S>>::sql_expr_to_logical_expr
             at /rust/arrow-datafusion/datafusion/sql/src/expr/mod.rs:88:40
   8: datafusion_sql::expr::<impl datafusion_sql::planner::SqlToRel<S>>::sql_to_expr
             at rust/arrow-datafusion/datafusion/sql/src/expr/mod.rs:122:24
   9: datafusion_sql::select::<impl datafusion_sql::planner::SqlToRel<S>>::sql_select_to_rex
             at /rust/arrow-datafusion/datafusion/sql/src/select.rs:339:28
  10: datafusion_sql::select::<impl datafusion_sql::planner::SqlToRel<S>>::prepare_select_exprs::{{closure}}
             at /rust/arrow-datafusion/datafusion/sql/src/select.rs:321:25
  11: core::iter::adapters::map::map_try_fold::{{closure}}
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/adapters/map.rs:91:28
  12: core::iter::traits::iterator::Iterator::try_fold
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/traits/iterator.rs:2303:21
  13: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/adapters/map.rs:117:9
  14: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/adapters/map.rs:117:9
  15: <core::iter::adapters::fuse::Fuse<I> as core::iter::adapters::fuse::FuseImpl<I>>::try_fold
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/adapters/fuse.rs:368:19
  16: <core::iter::adapters::fuse::Fuse<I> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/adapters/fuse.rs:82:9
  17: core::iter::adapters::flatten::FlattenCompat<I,U>::iter_try_fold
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/adapters/flatten.rs:386:25
  18: <core::iter::adapters::flatten::FlattenCompat<I,U> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/adapters/flatten.rs:524:9
  19: <core::iter::adapters::flatten::FlatMap<I,U,F> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/adapters/flatten.rs:67:9
  20: <core::iter::adapters::GenericShunt<I,R> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/adapters/mod.rs:195:9
  21: core::iter::traits::iterator::Iterator::try_for_each
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/traits/iterator.rs:2365:9
  22: <core::iter::adapters::GenericShunt<I,R> as core::iter::traits::iterator::Iterator>::next
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/adapters/mod.rs:178:14
  23: <alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/alloc/src/vec/spec_from_iter_nested.rs:26:32
  24: <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/alloc/src/vec/spec_from_iter.rs:33:9
  25: <alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/alloc/src/vec/mod.rs:2696:9
  26: core::iter::traits::iterator::Iterator::collect
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/traits/iterator.rs:1895:9
  27: <core::result::Result<V,E> as core::iter::traits::collect::FromIterator<core::result::Result<A,E>>>::from_iter::{{closure}}
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/result.rs:1932:51
  28: core::iter::adapters::try_process
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/adapters/mod.rs:164:17
  29: <core::result::Result<V,E> as core::iter::traits::collect::FromIterator<core::result::Result<A,E>>>::from_iter
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/result.rs:1932:9
  30: core::iter::traits::iterator::Iterator::collect
             at /rustc/5680fa18feaa87f3ff04063800aec256c3d4b4be/library/core/src/iter/traits/iterator.rs:1895:9
  31: datafusion_sql::select::<impl datafusion_sql::planner::SqlToRel<S>>::prepare_select_exprs
             at /rust/arrow-datafusion/datafusion/sql/src/select.rs:319:9
  32: datafusion_sql::select::<impl datafusion_sql::planner::SqlToRel<S>>::select_to_plan
             at /rust/arrow-datafusion/datafusion/sql/src/select.rs:85:28
  33: datafusion_sql::set_expr::<impl datafusion_sql::planner::SqlToRel<S>>::set_expr_to_plan
             at /rust/arrow-datafusion/datafusion/sql/src/set_expr.rs:30:35
  34: datafusion_sql::query::<impl datafusion_sql::planner::SqlToRel<S>>::query_to_plan_with_schema
             at /rust/arrow-datafusion/datafusion/sql/src/query.rs:80:20
  35: datafusion_sql::query::<impl datafusion_sql::planner::SqlToRel<S>>::query_to_plan
             at /rust/arrow-datafusion/datafusion/sql/src/query.rs:41:9
  36: datafusion_sql::statement::<impl datafusion_sql::planner::SqlToRel<S>>::sql_statement_to_plan_with_context_impl
             at /rust/arrow-datafusion/datafusion/sql/src/statement.rs:137:40
  37: datafusion_sql::statement::<impl datafusion_sql::planner::SqlToRel<S>>::sql_statement_to_plan
             at /rust/arrow-datafusion/datafusion/sql/src/statement.rs:105:9
  38: datafusion_sql::statement::<impl datafusion_sql::planner::SqlToRel<S>>::statement_to_plan
             at /rust/arrow-datafusion/datafusion/sql/src/statement.rs:92:42
  39: datafusion::execution::context::SessionState::statement_to_plan::{{closure}}
             at /rust/arrow-datafusion/datafusion/core/src/execution/context.rs:1859:9
  40: datafusion_cli::exec::exec_and_print::{{closure}}
             at ./src/exec.rs:213:61
  41: datafusion_cli::exec::exec_from_repl::{{closure}}
             at ./src/exec.rs:167:65
  42: datafusion_cli::main::{{closure}}
             at ./src/main.rs:206:14

Are these changes tested?

Yes, existing tests

Are there any user-facing changes?

@github-actions github-actions bot added sql SQL Planner logical-expr Logical plan and expressions labels Aug 28, 2023
@comphead comphead mentioned this pull request Aug 28, 2023
23 tasks
@comphead
Copy link
Contributor Author

@alamb do you know the reason why some test tasks running with RUST_BACKTRACE: 1 but others not?

@alamb
Copy link
Contributor

alamb commented Aug 29, 2023

@alamb do you know the reason why some test tasks running with RUST_BACKTRACE: 1 but others not?

If you mean this:

https://github.com/search?q=repo%3Aapache%2Farrow-datafusion%20RUST_BACKTRACE&type=code

I don't know of any reasons for the discrepancy

@github-actions github-actions bot added the core Core DataFusion crate label Aug 29, 2023
@comphead
Copy link
Contributor Author

Changing some tests checking exact error message to .starts_with as some test tasks get run with BACKTRACE=1 so this trigger backtrace and the entire error message won't be stable if the code changes

@github-actions github-actions bot added physical-expr Physical Expressions optimizer Optimizer rules labels Aug 30, 2023
@comphead
Copy link
Contributor Author

Adding .strip_backtrace() to get only error message if the RUST_BACKTRACE enabled

@comphead
Copy link
Contributor Author

I will add documentation and examples in follow up PR

@comphead comphead marked this pull request as ready for review August 30, 2023 20:45
@comphead comphead marked this pull request as draft September 1, 2023 15:49
@github-actions github-actions bot added the sqllogictest SQL Logic Tests (.slt) label Sep 2, 2023
@comphead comphead marked this pull request as ready for review September 3, 2023 01:20
@alamb
Copy link
Contributor

alamb commented Sep 5, 2023

I have been away on vacation but am back now and will catch up with reviews over the next few days. This one looks great @comphead -- thank you

Copy link
Contributor

@alamb alamb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this looks great @comphead -- thank you very much. Does anyone else have any comments about this PR?

@@ -444,7 +467,7 @@ macro_rules! make_error {
#[macro_export]
macro_rules! $NAME {
($d($d args:expr),*) => {
Err(DataFusionError::$ERR(format!($d($d args),*).into()))
Err(DataFusionError::$ERR(format!("{}{}", format!($d($d args),*), DataFusionError::get_back_trace()).into()))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is pretty clever, to use the macro like this

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
core Core DataFusion crate logical-expr Logical plan and expressions optimizer Optimizer rules physical-expr Physical Expressions sql SQL Planner sqllogictest SQL Logic Tests (.slt)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants