mistercrunch closed pull request #6299: Make stacktraces available in many more 
cases
URL: https://github.com/apache/incubator-superset/pull/6299
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/superset/assets/src/chart/Chart.jsx 
b/superset/assets/src/chart/Chart.jsx
index d0d3461847..d2abb6ba2a 100644
--- a/superset/assets/src/chart/Chart.jsx
+++ b/superset/assets/src/chart/Chart.jsx
@@ -27,6 +27,7 @@ const propTypes = {
   // state
   chartAlert: PropTypes.string,
   chartStatus: PropTypes.string,
+  chartStackTrace: PropTypes.string,
   queryResponse: PropTypes.object,
   triggerQuery: PropTypes.bool,
   refreshOverlayVisible: PropTypes.bool,
@@ -90,10 +91,10 @@ class Chart extends React.PureComponent {
     });
   }
 
-  handleRenderFailure(e) {
+  handleRenderFailure(error, info) {
     const { actions, chartId } = this.props;
-    console.warn(e); // eslint-disable-line
-    actions.chartRenderingFailed(e.toString(), chartId);
+    console.warn(error); // eslint-disable-line
+    actions.chartRenderingFailed(error.toString(), chartId, info ? 
info.componentStack : null);
   }
 
   prepareChartProps() {
@@ -153,6 +154,7 @@ class Chart extends React.PureComponent {
       width,
       height,
       chartAlert,
+      chartStackTrace,
       chartStatus,
       errorMessage,
       onDismissRefreshOverlay,
@@ -183,7 +185,7 @@ class Chart extends React.PureComponent {
           <StackTraceMessage
             message={chartAlert}
             link={queryResponse ? queryResponse.link : null}
-            stackTrace={queryResponse ? queryResponse.stacktrace : null}
+            stackTrace={chartStackTrace}
           />
         )}
 
diff --git a/superset/assets/src/chart/chartAction.js 
b/superset/assets/src/chart/chartAction.js
index 771f1590fd..afb8145c6e 100644
--- a/superset/assets/src/chart/chartAction.js
+++ b/superset/assets/src/chart/chartAction.js
@@ -35,8 +35,8 @@ export function chartUpdateFailed(queryResponse, key) {
 }
 
 export const CHART_RENDERING_FAILED = 'CHART_RENDERING_FAILED';
-export function chartRenderingFailed(error, key) {
-  return { type: CHART_RENDERING_FAILED, error, key };
+export function chartRenderingFailed(error, key, stackTrace) {
+  return { type: CHART_RENDERING_FAILED, error, key, stackTrace };
 }
 
 export const CHART_RENDERING_SUCCEEDED = 'CHART_RENDERING_SUCCEEDED';
diff --git a/superset/assets/src/chart/chartReducer.js 
b/superset/assets/src/chart/chartReducer.js
index f6b608cca6..3936f9c83b 100644
--- a/superset/assets/src/chart/chartReducer.js
+++ b/superset/assets/src/chart/chartReducer.js
@@ -7,6 +7,7 @@ export const chart = {
   id: 0,
   chartAlert: null,
   chartStatus: 'loading',
+  chartStackTrace: null,
   chartUpdateEndTime: null,
   chartUpdateStartTime: 0,
   latestQueryFormData: {},
@@ -35,6 +36,7 @@ export default function chartReducer(charts = {}, action) {
       return {
         ...state,
         chartStatus: 'loading',
+        chartStackTrace: null,
         chartAlert: null,
         chartUpdateEndTime: null,
         chartUpdateStartTime: now(),
@@ -56,6 +58,7 @@ export default function chartReducer(charts = {}, action) {
     [actions.CHART_RENDERING_FAILED](state) {
       return { ...state,
         chartStatus: 'failed',
+        chartStackTrace: action.stackTrace,
         chartAlert: t('An error occurred while rendering the visualization: 
%s', action.error),
       };
     },
@@ -78,6 +81,7 @@ export default function chartReducer(charts = {}, action) {
         chartAlert: action.queryResponse ? action.queryResponse.error : 
t('Network error.'),
         chartUpdateEndTime: now(),
         queryResponse: action.queryResponse,
+        chartStackTrace: action.queryResponse ? 
action.queryResponse.stacktrace : null,
       };
     },
     [actions.TRIGGER_QUERY](state) {
diff --git a/superset/assets/src/explore/components/ExploreChartPanel.jsx 
b/superset/assets/src/explore/components/ExploreChartPanel.jsx
index efff4a0311..1cdc94cc9d 100644
--- a/superset/assets/src/explore/components/ExploreChartPanel.jsx
+++ b/superset/assets/src/explore/components/ExploreChartPanel.jsx
@@ -43,6 +43,7 @@ class ExploreChartPanel extends React.PureComponent {
             height={parseInt(this.props.height, 10) - headerHeight}
             annotationData={chart.annotationData}
             chartAlert={chart.chartAlert}
+            chartStackTrace={chart.chartStackTrace}
             chartId={chart.id}
             chartStatus={chart.chartStatus}
             datasource={this.props.datasource}
diff --git a/superset/assets/src/visualizations/TimeTable/transformProps.js 
b/superset/assets/src/visualizations/TimeTable/transformProps.js
index d52088b99d..8492ce2ac9 100644
--- a/superset/assets/src/visualizations/TimeTable/transformProps.js
+++ b/superset/assets/src/visualizations/TimeTable/transformProps.js
@@ -1,7 +1,7 @@
 export default function transformProps(chartProps) {
   const { height, datasource, formData, payload } = chartProps;
   const {
-    columnCollection = 0,
+    columnCollection = [],
     groupby,
     metrics,
     url,
diff --git a/superset/views/api.py b/superset/views/api.py
index c1d27144bf..5f684f3cf9 100644
--- a/superset/views/api.py
+++ b/superset/views/api.py
@@ -8,13 +8,13 @@
 from superset import appbuilder, security_manager
 from superset.common.query_context import QueryContext
 from superset.models.core import Log
-from .base import api, BaseSupersetView, data_payload_response, 
handle_superset_exception
+from .base import api, BaseSupersetView, data_payload_response, 
handle_api_exception
 
 
 class Api(BaseSupersetView):
     @Log.log_this
     @api
-    @handle_superset_exception
+    @handle_api_exception
     @has_access_api
     @expose('/v1/query/', methods=['POST'])
     def query(self):
diff --git a/superset/views/base.py b/superset/views/base.py
index 657242f372..31ab1cefc3 100644
--- a/superset/views/base.py
+++ b/superset/views/base.py
@@ -86,7 +86,7 @@ def wraps(self, *args, **kwargs):
     return functools.update_wrapper(wraps, f)
 
 
-def handle_superset_exception(f):
+def handle_api_exception(f):
     """
     A decorator to catch superset exceptions. Use it after the @api decorator 
above
     so superset exception handler is triggered before the handler for generic 
exceptions.
@@ -94,15 +94,21 @@ def handle_superset_exception(f):
     def wraps(self, *args, **kwargs):
         try:
             return f(self, *args, **kwargs)
-        except SupersetSecurityException as sse:
-            logging.exception(sse)
-            return json_error_response(utils.error_msg_from_exception(sse),
-                                       status=sse.status,
-                                       link=sse.link)
-        except SupersetException as se:
-            logging.exception(se)
-            return json_error_response(utils.error_msg_from_exception(se),
-                                       status=se.status)
+        except SupersetSecurityException as e:
+            logging.exception(e)
+            return json_error_response(utils.error_msg_from_exception(e),
+                                       status=e.status,
+                                       stacktrace=traceback.format_exc(),
+                                       link=e.link)
+        except SupersetException as e:
+            logging.exception(e)
+            return json_error_response(utils.error_msg_from_exception(e),
+                                       stacktrace=traceback.format_exc(),
+                                       status=e.status)
+        except Exception as e:
+            logging.exception(e)
+            return json_error_response(utils.error_msg_from_exception(e),
+                                       stacktrace=traceback.format_exc())
     return functools.update_wrapper(wraps, f)
 
 
diff --git a/superset/views/core.py b/superset/views/core.py
index b53ad6fd6b..5ed9905d35 100755
--- a/superset/views/core.py
+++ b/superset/views/core.py
@@ -46,7 +46,7 @@
     api, BaseSupersetView,
     check_ownership,
     CsvResponse, data_payload_response, DeleteMixin, generate_download_headers,
-    get_error_msg, handle_superset_exception, json_error_response, 
json_success,
+    get_error_msg, handle_api_exception, json_error_response, json_success,
     SupersetFilter, SupersetModelView, YamlExportMixin,
 )
 from .utils import bootstrap_user_data
@@ -1114,7 +1114,6 @@ def get_samples(self, viz_obj):
             'data': viz_obj.get_samples(),
         })
 
-    @handle_superset_exception
     def generate_json(
             self, datasource_type, datasource_id, form_data,
             csv=False, query=False, force=False, results=False,
@@ -1182,6 +1181,7 @@ def annotation_json(self, layer_id):
     @log_this
     @api
     @has_access_api
+    @handle_api_exception
     @expose('/explore_json/<datasource_type>/<datasource_id>/', 
methods=['GET', 'POST'])
     @expose('/explore_json/', methods=['GET', 'POST'])
     def explore_json(self, datasource_type=None, datasource_id=None):
@@ -1359,7 +1359,7 @@ def explore(self, datasource_type=None, 
datasource_id=None):
             standalone_mode=standalone)
 
     @api
-    @handle_superset_exception
+    @handle_api_exception
     @has_access_api
     @expose('/filter/<datasource_type>/<datasource_id>/<column>/')
     def filter(self, datasource_type, datasource_id, column):
@@ -2615,7 +2615,7 @@ def csv(self, client_id):
         return response
 
     @api
-    @handle_superset_exception
+    @handle_api_exception
     @has_access
     @expose('/fetch_datasource_metadata')
     @log_this
@@ -2806,7 +2806,7 @@ def sqllab(self):
         )
 
     @api
-    @handle_superset_exception
+    @handle_api_exception
     @has_access_api
     @expose('/slice_query/<slice_id>/')
     def slice_query(self, slice_id):
diff --git a/superset/viz.py b/superset/viz.py
index fba68aef1d..91b48f2037 100644
--- a/superset/viz.py
+++ b/superset/viz.py
@@ -445,7 +445,6 @@ def get_df_payload(self, query_obj=None, **kwargs):
                     logging.warning('Could not cache key {}'.format(cache_key))
                     logging.exception(e)
                     cache.delete(cache_key)
-
         return {
             'cache_key': self._any_cache_key,
             'cached_dttm': self._any_cached_dttm,


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to