| 
									
										
										
										
											2023-07-21 18:38:29 +08:00
										 |  |  | package expr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2023-09-14 01:58:16 +08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2023-07-21 18:38:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-13 12:11:35 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/apimachinery/errutil" | 
					
						
							| 
									
										
										
										
											2023-07-21 18:38:29 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-08 00:31:07 +08:00
										 |  |  | var ErrSeriesMustBeWide = errors.New("input data must be a wide series") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-22 18:52:24 +08:00
										 |  |  | var ConversionError = errutil.BadRequest("sse.readDataError").MustTemplate( | 
					
						
							| 
									
										
										
										
											2023-07-21 18:38:29 +08:00
										 |  |  | 	"[{{ .Public.refId }}] got error: {{ .Error }}", | 
					
						
							|  |  |  | 	errutil.WithPublic( | 
					
						
							|  |  |  | 		"failed to read data from from query {{ .Public.refId }}: {{ .Public.error }}", | 
					
						
							|  |  |  | 	), | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-14 01:58:16 +08:00
										 |  |  | func makeConversionError(refID string, err error) error { | 
					
						
							| 
									
										
										
										
											2023-07-21 18:38:29 +08:00
										 |  |  | 	data := errutil.TemplateData{ | 
					
						
							|  |  |  | 		// Conversion errors should only have meta information in errors
 | 
					
						
							| 
									
										
										
										
											2023-08-30 23:46:47 +08:00
										 |  |  | 		Public: map[string]any{ | 
					
						
							| 
									
										
										
										
											2023-07-21 18:38:29 +08:00
										 |  |  | 			"refId": refID, | 
					
						
							|  |  |  | 			"error": err.Error(), | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		Error: err, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return ConversionError.Build(data) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-22 18:52:24 +08:00
										 |  |  | var QueryError = errutil.BadRequest("sse.dataQueryError").MustTemplate( | 
					
						
							| 
									
										
										
										
											2023-07-21 18:38:29 +08:00
										 |  |  | 	"failed to execute query [{{ .Public.refId }}]: {{ .Error }}", | 
					
						
							|  |  |  | 	errutil.WithPublic( | 
					
						
							|  |  |  | 		"failed to execute query [{{ .Public.refId }}]: {{ .Public.error }}", | 
					
						
							|  |  |  | 	)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func MakeQueryError(refID, datasourceUID string, err error) error { | 
					
						
							|  |  |  | 	var pErr error | 
					
						
							|  |  |  | 	var utilErr errutil.Error | 
					
						
							|  |  |  | 	// See if this is grafana error, if so, grab public message
 | 
					
						
							|  |  |  | 	if errors.As(err, &utilErr) { | 
					
						
							|  |  |  | 		pErr = utilErr.Public() | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		pErr = err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	data := errutil.TemplateData{ | 
					
						
							| 
									
										
										
										
											2023-08-30 23:46:47 +08:00
										 |  |  | 		Public: map[string]any{ | 
					
						
							| 
									
										
										
										
											2023-07-21 18:38:29 +08:00
										 |  |  | 			"refId":         refID, | 
					
						
							|  |  |  | 			"datasourceUID": datasourceUID, | 
					
						
							|  |  |  | 			"error":         pErr.Error(), | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		Error: err, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return QueryError.Build(data) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-09-14 01:58:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-15 05:14:03 +08:00
										 |  |  | var depErrStr = "did not execute expression [{{ .Public.refId }}] due to a failure of the dependent expression or query [{{.Public.depRefId}}]" | 
					
						
							| 
									
										
										
										
											2023-09-14 01:58:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | var DependencyError = errutil.NewBase( | 
					
						
							|  |  |  | 	errutil.StatusBadRequest, "sse.dependencyError").MustTemplate( | 
					
						
							|  |  |  | 	depErrStr, | 
					
						
							|  |  |  | 	errutil.WithPublic(depErrStr)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-11 23:37:10 +08:00
										 |  |  | func MakeDependencyError(refID, depRefID string) error { | 
					
						
							| 
									
										
										
										
											2023-09-14 01:58:16 +08:00
										 |  |  | 	data := errutil.TemplateData{ | 
					
						
							|  |  |  | 		Public: map[string]interface{}{ | 
					
						
							|  |  |  | 			"refId":    refID, | 
					
						
							|  |  |  | 			"depRefId": depRefID, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2025-04-15 05:14:03 +08:00
										 |  |  | 		Error: fmt.Errorf("did not execute expression %v due to a failure of the dependent expression or query %v", refID, depRefID), | 
					
						
							| 
									
										
										
										
											2023-09-14 01:58:16 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return DependencyError.Build(data) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-03 02:00:14 +08:00
										 |  |  | var parsErrStr = "failed to parse expression [{{ .Public.refId }}]: {{.Public.error}}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ParseError = errutil.NewBase( | 
					
						
							|  |  |  | 	errutil.StatusBadRequest, "sse.parseError").MustTemplate( | 
					
						
							|  |  |  | 	parsErrStr, | 
					
						
							|  |  |  | 	errutil.WithPublic(parsErrStr)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func MakeParseError(refID string, err error) error { | 
					
						
							|  |  |  | 	data := errutil.TemplateData{ | 
					
						
							|  |  |  | 		Public: map[string]interface{}{ | 
					
						
							|  |  |  | 			"refId": refID, | 
					
						
							|  |  |  | 			"error": err.Error(), | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		Error: err, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ParseError.Build(data) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-14 01:58:16 +08:00
										 |  |  | var unexpectedNodeTypeErrString = "expected executable node type but got node type [{{ .Public.nodeType }} for refid [{{ .Public.refId}}]" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var UnexpectedNodeTypeError = errutil.NewBase( | 
					
						
							|  |  |  | 	errutil.StatusBadRequest, "sse.unexpectedNodeType").MustTemplate( | 
					
						
							|  |  |  | 	unexpectedNodeTypeErrString, | 
					
						
							|  |  |  | 	errutil.WithPublic(unexpectedNodeTypeErrString)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func makeUnexpectedNodeTypeError(refID, nodeType string) error { | 
					
						
							|  |  |  | 	data := errutil.TemplateData{ | 
					
						
							|  |  |  | 		Public: map[string]interface{}{ | 
					
						
							|  |  |  | 			"refId":    refID, | 
					
						
							|  |  |  | 			"nodeType": nodeType, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		Error: fmt.Errorf("expected executable node type but got node type %v for refId %v", nodeType, refID), | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return UnexpectedNodeTypeError.Build(data) | 
					
						
							|  |  |  | } |