diff --git a/cspell.config.json b/cspell.config.json index 75549651..6b03c514 100644 --- a/cspell.config.json +++ b/cspell.config.json @@ -77,6 +77,7 @@ "WorkDir", "elazarl", "goproxy", - "Nonproxy" + "Nonproxy", + "errorsource" ] } diff --git a/pkg/macros/macros.go b/pkg/macros/macros.go index 384efaf2..7a6495a8 100644 --- a/pkg/macros/macros.go +++ b/pkg/macros/macros.go @@ -9,6 +9,7 @@ import ( "github.com/grafana/sqlds/v3" "github.com/grafana/grafana-plugin-sdk-go/data/sqlutil" + "github.com/grafana/grafana-plugin-sdk-go/experimental/errorsource" ) // Converts a time.Time to a Date @@ -48,7 +49,7 @@ func ToTimeFilterMs(query *sqlutil.Query, args []string) (string, error) { func TimeFilter(query *sqlutil.Query, args []string) (string, error) { if len(args) != 1 { - return "", fmt.Errorf("%w: expected 1 argument, received %d", sqlds.ErrorBadArgumentCount, len(args)) + return "", errorsource.DownstreamError(fmt.Errorf("%w: expected 1 argument, received %d", sqlds.ErrorBadArgumentCount, len(args)), false) } var ( @@ -62,7 +63,7 @@ func TimeFilter(query *sqlutil.Query, args []string) (string, error) { func TimeFilterMs(query *sqlutil.Query, args []string) (string, error) { if len(args) != 1 { - return "", fmt.Errorf("%w: expected 1 argument, received %d", sqlds.ErrorBadArgumentCount, len(args)) + return "", errorsource.DownstreamError(fmt.Errorf("%w: expected 1 argument, received %d", sqlds.ErrorBadArgumentCount, len(args)), false) } var ( @@ -76,7 +77,7 @@ func TimeFilterMs(query *sqlutil.Query, args []string) (string, error) { func DateFilter(query *sqlutil.Query, args []string) (string, error) { if len(args) != 1 { - return "", fmt.Errorf("%w: expected 1 argument, received %d", sqlds.ErrorBadArgumentCount, len(args)) + return "", errorsource.DownstreamError(fmt.Errorf("%w: expected 1 argument, received %d", sqlds.ErrorBadArgumentCount, len(args)), false) } var ( column = args[0] @@ -89,7 +90,7 @@ func DateFilter(query *sqlutil.Query, args []string) (string, error) { func DateTimeFilter(query *sqlutil.Query, args []string) (string, error) { if len(args) != 2 { - return "", fmt.Errorf("%w: expected 2 arguments, received %d", sqlds.ErrorBadArgumentCount, len(args)) + return "", errorsource.DownstreamError(fmt.Errorf("%w: expected 2 arguments, received %d", sqlds.ErrorBadArgumentCount, len(args)), false) } var ( dateColumn = args[0] @@ -105,7 +106,7 @@ func DateTimeFilter(query *sqlutil.Query, args []string) (string, error) { func TimeInterval(query *sqlutil.Query, args []string) (string, error) { if len(args) != 1 { - return "", fmt.Errorf("%w: expected 1 argument, received %d", sqlds.ErrorBadArgumentCount, len(args)) + return "", errorsource.DownstreamError(fmt.Errorf("%w: expected 1 argument, received %d", sqlds.ErrorBadArgumentCount, len(args)), false) } seconds := math.Max(query.Interval.Seconds(), 1) @@ -114,7 +115,7 @@ func TimeInterval(query *sqlutil.Query, args []string) (string, error) { func TimeIntervalMs(query *sqlutil.Query, args []string) (string, error) { if len(args) != 1 { - return "", fmt.Errorf("%w: expected 1 argument, received %d", sqlds.ErrorBadArgumentCount, len(args)) + return "", errorsource.DownstreamError(fmt.Errorf("%w: expected 1 argument, received %d", sqlds.ErrorBadArgumentCount, len(args)), false) } milliseconds := math.Max(float64(query.Interval.Milliseconds()), 1) diff --git a/pkg/plugin/driver.go b/pkg/plugin/driver.go index b2415287..6363c5bf 100644 --- a/pkg/plugin/driver.go +++ b/pkg/plugin/driver.go @@ -21,6 +21,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/build" "github.com/grafana/grafana-plugin-sdk-go/data" "github.com/grafana/grafana-plugin-sdk-go/data/sqlutil" + "github.com/grafana/grafana-plugin-sdk-go/experimental/errorsource" "github.com/grafana/sqlds/v3" "github.com/pkg/errors" "golang.org/x/net/proxy" @@ -40,7 +41,7 @@ func getTLSConfig(settings Settings) (*tls.Config, error) { if settings.TlsAuthWithCACert && len(settings.TlsCACert) > 0 { caPool := x509.NewCertPool() if ok := caPool.AppendCertsFromPEM([]byte(settings.TlsCACert)); !ok { - return nil, ErrorInvalidCACertificate + return nil, errorsource.DownstreamError(ErrorInvalidCACertificate, false) } tlsConfig.RootCAs = caPool } @@ -120,11 +121,11 @@ func (h *Clickhouse) Connect(ctx context.Context, config backend.DataSourceInsta } t, err := strconv.Atoi(settings.DialTimeout) if err != nil { - return nil, errors.New(fmt.Sprintf("invalid timeout: %s", settings.DialTimeout)) + return nil, errorsource.DownstreamError(errors.New(fmt.Sprintf("invalid timeout: %s", settings.DialTimeout)), false) } qt, err := strconv.Atoi(settings.QueryTimeout) if err != nil { - return nil, errors.New(fmt.Sprintf("invalid query timeout: %s", settings.QueryTimeout)) + return nil, errorsource.DownstreamError(errors.New(fmt.Sprintf("invalid query timeout: %s", settings.QueryTimeout)), false) } protocol := clickhouse.Native if settings.Protocol == "http" { diff --git a/pkg/plugin/settings.go b/pkg/plugin/settings.go index d825d854..36bd0245 100644 --- a/pkg/plugin/settings.go +++ b/pkg/plugin/settings.go @@ -12,6 +12,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend/proxy" + "github.com/grafana/grafana-plugin-sdk-go/experimental/errorsource" ) // Settings - data loaded from grafana settings database @@ -52,10 +53,10 @@ const secureHeaderKeyPrefix = "secureHttpHeaders." func (settings *Settings) isValid() (err error) { if settings.Host == "" { - return ErrorMessageInvalidHost + return errorsource.DownstreamError(ErrorMessageInvalidHost, false) } if settings.Port == 0 { - return ErrorMessageInvalidPort + return errorsource.DownstreamError(ErrorMessageInvalidPort, false) } return nil } @@ -79,7 +80,7 @@ func LoadSettings(ctx context.Context, config backend.DataSourceInstanceSettings if port, ok := jsonData["port"].(string); ok { settings.Port, err = strconv.ParseInt(port, 0, 64) if err != nil { - return settings, fmt.Errorf("could not parse port value: %w", err) + return settings, errorsource.DownstreamError(fmt.Errorf("could not parse port value: %w", err), false) } } else { settings.Port = int64(jsonData["port"].(float64)) @@ -92,7 +93,7 @@ func LoadSettings(ctx context.Context, config backend.DataSourceInstanceSettings if secure, ok := jsonData["secure"].(string); ok { settings.Secure, err = strconv.ParseBool(secure) if err != nil { - return settings, fmt.Errorf("could not parse secure value: %w", err) + return settings, errorsource.DownstreamError(fmt.Errorf("could not parse secure value: %w", err), false) } } else { settings.Secure = jsonData["secure"].(bool) @@ -106,7 +107,7 @@ func LoadSettings(ctx context.Context, config backend.DataSourceInstanceSettings if tlsSkipVerify, ok := jsonData["tlsSkipVerify"].(string); ok { settings.InsecureSkipVerify, err = strconv.ParseBool(tlsSkipVerify) if err != nil { - return settings, fmt.Errorf("could not parse tlsSkipVerify value: %w", err) + return settings, errorsource.DownstreamError(fmt.Errorf("could not parse tlsSkipVerify value: %w", err), false) } } else { settings.InsecureSkipVerify = jsonData["tlsSkipVerify"].(bool) @@ -116,7 +117,7 @@ func LoadSettings(ctx context.Context, config backend.DataSourceInstanceSettings if tlsAuth, ok := jsonData["tlsAuth"].(string); ok { settings.TlsClientAuth, err = strconv.ParseBool(tlsAuth) if err != nil { - return settings, fmt.Errorf("could not parse tlsAuth value: %w", err) + return settings, errorsource.DownstreamError(fmt.Errorf("could not parse tlsAuth value: %w", err), false) } } else { settings.TlsClientAuth = jsonData["tlsAuth"].(bool) @@ -126,7 +127,7 @@ func LoadSettings(ctx context.Context, config backend.DataSourceInstanceSettings if tlsAuthWithCACert, ok := jsonData["tlsAuthWithCACert"].(string); ok { settings.TlsAuthWithCACert, err = strconv.ParseBool(tlsAuthWithCACert) if err != nil { - return settings, fmt.Errorf("could not parse tlsAuthWithCACert value: %w", err) + return settings, errorsource.DownstreamError(fmt.Errorf("could not parse tlsAuthWithCACert value: %w", err), false) } } else { settings.TlsAuthWithCACert = jsonData["tlsAuthWithCACert"].(bool) @@ -174,7 +175,7 @@ func LoadSettings(ctx context.Context, config backend.DataSourceInstanceSettings if forwardGrafanaHeaders, ok := jsonData["forwardGrafanaHeaders"].(string); ok { settings.ForwardGrafanaHeaders, err = strconv.ParseBool(forwardGrafanaHeaders) if err != nil { - return settings, fmt.Errorf("could not parse forwardGrafanaHeaders value: %w", err) + return settings, errorsource.DownstreamError(fmt.Errorf("could not parse forwardGrafanaHeaders value: %w", err), false) } } else { settings.ForwardGrafanaHeaders = jsonData["forwardGrafanaHeaders"].(bool)