SQL Datasources: Use health check for config test (#59867)
* SQL Datasources: Use health check for config test * Remove unnecessary test * Fix test errors * Revert mysql go driver update * Use transform query error * Use TransformQueryError from sql_engine
This commit is contained in:
@@ -199,6 +199,22 @@ func (t *mssqlQueryResultTransformer) TransformQueryError(logger log.Logger, err
|
||||
return err
|
||||
}
|
||||
|
||||
// CheckHealth pings the connected SQL database
|
||||
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
|
||||
dsHandler, err := s.getDataSourceHandler(req.PluginContext)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = dsHandler.Ping()
|
||||
|
||||
if err != nil {
|
||||
return &backend.CheckHealthResult{Status: backend.HealthStatusError, Message: dsHandler.TransformQueryError(logger, err).Error()}, nil
|
||||
}
|
||||
|
||||
return &backend.CheckHealthResult{Status: backend.HealthStatusOk, Message: "Database Connection OK"}, nil
|
||||
}
|
||||
|
||||
func (t *mssqlQueryResultTransformer) GetConverterList() []sqlutil.StringConverter {
|
||||
return []sqlutil.StringConverter{
|
||||
{
|
||||
|
||||
@@ -140,6 +140,25 @@ func (s *Service) getDataSourceHandler(pluginCtx backend.PluginContext) (*sqleng
|
||||
return instance, nil
|
||||
}
|
||||
|
||||
// CheckHealth pings the connected SQL database
|
||||
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
|
||||
dsHandler, err := s.getDataSourceHandler(req.PluginContext)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = dsHandler.Ping()
|
||||
|
||||
if err != nil {
|
||||
var driverErr *mysql.MySQLError
|
||||
if errors.As(err, &driverErr) {
|
||||
return &backend.CheckHealthResult{Status: backend.HealthStatusError, Message: dsHandler.TransformQueryError(logger, driverErr).Error()}, nil
|
||||
}
|
||||
return &backend.CheckHealthResult{Status: backend.HealthStatusError, Message: dsHandler.TransformQueryError(logger, err).Error()}, nil
|
||||
}
|
||||
return &backend.CheckHealthResult{Status: backend.HealthStatusOk, Message: "Database Connection OK"}, nil
|
||||
}
|
||||
|
||||
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
||||
dsHandler, err := s.getDataSourceHandler(req.PluginContext)
|
||||
if err != nil {
|
||||
|
||||
@@ -196,6 +196,23 @@ func (t *postgresQueryResultTransformer) TransformQueryError(_ log.Logger, err e
|
||||
return err
|
||||
}
|
||||
|
||||
// CheckHealth pings the connected SQL database
|
||||
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
|
||||
dsHandler, err := s.getDSInfo(req.PluginContext)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = dsHandler.Ping()
|
||||
|
||||
if err != nil {
|
||||
logger.Error("Check health failed", "error", err)
|
||||
return &backend.CheckHealthResult{Status: backend.HealthStatusError, Message: dsHandler.TransformQueryError(logger, err).Error()}, nil
|
||||
}
|
||||
|
||||
return &backend.CheckHealthResult{Status: backend.HealthStatusOk, Message: "Database Connection OK"}, nil
|
||||
}
|
||||
|
||||
func (t *postgresQueryResultTransformer) GetConverterList() []sqlutil.StringConverter {
|
||||
return []sqlutil.StringConverter{
|
||||
{
|
||||
|
||||
@@ -107,7 +107,7 @@ type QueryJson struct {
|
||||
Format string `json:"format"`
|
||||
}
|
||||
|
||||
func (e *DataSourceHandler) transformQueryError(logger log.Logger, err error) error {
|
||||
func (e *DataSourceHandler) TransformQueryError(logger log.Logger, err error) error {
|
||||
// OpError is the error type usually returned by functions in the net
|
||||
// package. It describes the operation, network type, and address of
|
||||
// an error. We log this error rather than return it to the client
|
||||
@@ -173,6 +173,10 @@ func (e *DataSourceHandler) Dispose() {
|
||||
e.log.Debug("Engine disposed")
|
||||
}
|
||||
|
||||
func (e *DataSourceHandler) Ping() error {
|
||||
return e.engine.Ping()
|
||||
}
|
||||
|
||||
func (e *DataSourceHandler) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
||||
result := backend.NewQueryDataResponse()
|
||||
ch := make(chan DBDataResponse, len(req.Queries))
|
||||
@@ -250,14 +254,14 @@ func (e *DataSourceHandler) executeQuery(query backend.DataQuery, wg *sync.WaitG
|
||||
// global substitutions
|
||||
interpolatedQuery, err := Interpolate(query, timeRange, e.dsInfo.JsonData.TimeInterval, queryJson.RawSql)
|
||||
if err != nil {
|
||||
errAppendDebug("interpolation failed", e.transformQueryError(logger, err), interpolatedQuery)
|
||||
errAppendDebug("interpolation failed", e.TransformQueryError(logger, err), interpolatedQuery)
|
||||
return
|
||||
}
|
||||
|
||||
// data source specific substitutions
|
||||
interpolatedQuery, err = e.macroEngine.Interpolate(&query, timeRange, interpolatedQuery)
|
||||
if err != nil {
|
||||
errAppendDebug("interpolation failed", e.transformQueryError(logger, err), interpolatedQuery)
|
||||
errAppendDebug("interpolation failed", e.TransformQueryError(logger, err), interpolatedQuery)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -267,7 +271,7 @@ func (e *DataSourceHandler) executeQuery(query backend.DataQuery, wg *sync.WaitG
|
||||
|
||||
rows, err := db.QueryContext(queryContext, interpolatedQuery)
|
||||
if err != nil {
|
||||
errAppendDebug("db query error", e.transformQueryError(logger, err), interpolatedQuery)
|
||||
errAppendDebug("db query error", e.TransformQueryError(logger, err), interpolatedQuery)
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
|
||||
@@ -407,7 +407,7 @@ func TestSQLEngine(t *testing.T) {
|
||||
log: log.New("test"),
|
||||
queryResultTransformer: transformer,
|
||||
}
|
||||
resultErr := dp.transformQueryError(dp.log, tc.err)
|
||||
resultErr := dp.TransformQueryError(dp.log, tc.err)
|
||||
assert.ErrorIs(t, resultErr, tc.expectedErr)
|
||||
assert.Equal(t, tc.expectQueryResultTransformerWasCalled, transformer.transformQueryErrorWasCalled)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user