@@ -8,8 +8,14 @@ import { i18n } from '@kbn/i18n';
88
99import { ExpressionRenderError } from 'src/plugins/expressions/public' ;
1010
11+ interface ElasticsearchErrorClause {
12+ type : string ;
13+ reason : string ;
14+ caused_by ?: ElasticsearchErrorClause ;
15+ }
16+
1117interface RequestError extends Error {
12- body ?: { attributes ?: { error : { caused_by : { type : string ; reason : string } } } } ;
18+ body ?: { attributes ?: { error : ElasticsearchErrorClause } } ;
1319}
1420
1521const isRequestError = ( e : Error | RequestError ) : e is RequestError => {
@@ -19,18 +25,25 @@ const isRequestError = (e: Error | RequestError): e is RequestError => {
1925 return false ;
2026} ;
2127
28+ function getNestedErrorClause ( {
29+ type,
30+ reason,
31+ caused_by : causedBy ,
32+ } : ElasticsearchErrorClause ) : { type : string ; reason : string } {
33+ if ( causedBy ) {
34+ return getNestedErrorClause ( causedBy ) ;
35+ }
36+ return { type, reason } ;
37+ }
38+
2239export function getOriginalRequestErrorMessage ( error ?: ExpressionRenderError | null ) {
23- return (
24- error &&
25- 'original' in error &&
26- error . original &&
27- isRequestError ( error . original ) &&
28- i18n . translate ( 'xpack.lens.editorFrame.expressionFailureMessage' , {
29- defaultMessage : 'Request error: {causedByType}, {causedByReason}' ,
30- values : {
31- causedByType : error . original . body ?. attributes ?. error ?. caused_by . type ,
32- causedByReason : error . original . body ?. attributes ?. error ?. caused_by . reason ,
33- } ,
34- } )
35- ) ;
40+ if ( error && 'original' in error && error . original && isRequestError ( error . original ) ) {
41+ const rootError = getNestedErrorClause ( error . original . body ! . attributes ! . error ) ;
42+ if ( rootError . reason && rootError . type ) {
43+ return i18n . translate ( 'xpack.lens.editorFrame.expressionFailureMessage' , {
44+ defaultMessage : 'Request error: {type}, {reason}' ,
45+ values : rootError ,
46+ } ) ;
47+ }
48+ }
3649}
0 commit comments