|
|
|
@ -28,7 +28,7 @@ func ProvideService(cfg *setting.Cfg) *Service { |
|
|
|
|
tlsManager: newTLSManager(logger, cfg.DataPath), |
|
|
|
|
logger: logger, |
|
|
|
|
} |
|
|
|
|
s.im = datasource.NewInstanceManager(s.newInstanceSettings(cfg)) |
|
|
|
|
s.im = datasource.NewInstanceManager(s.newInstanceSettings()) |
|
|
|
|
return s |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -55,7 +55,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) |
|
|
|
|
return dsInfo.QueryData(ctx, req) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func newPostgres(ctx context.Context, cfg *setting.Cfg, dsInfo sqleng.DataSourceInfo, cnnstr string, logger log.Logger, settings backend.DataSourceInstanceSettings) (*sql.DB, *sqleng.DataSourceHandler, error) { |
|
|
|
|
func newPostgres(ctx context.Context, userFacingDefaultError string, rowLimit int64, dsInfo sqleng.DataSourceInfo, cnnstr string, logger log.Logger, settings backend.DataSourceInstanceSettings) (*sql.DB, *sqleng.DataSourceHandler, error) { |
|
|
|
|
connector, err := pq.NewConnector(cnnstr) |
|
|
|
|
if err != nil { |
|
|
|
|
logger.Error("postgres connector creation failed", "error", err) |
|
|
|
@ -82,7 +82,7 @@ func newPostgres(ctx context.Context, cfg *setting.Cfg, dsInfo sqleng.DataSource |
|
|
|
|
config := sqleng.DataPluginConfiguration{ |
|
|
|
|
DSInfo: dsInfo, |
|
|
|
|
MetricColumnTypes: []string{"UNKNOWN", "TEXT", "VARCHAR", "CHAR"}, |
|
|
|
|
RowLimit: cfg.DataProxyRowLimit, |
|
|
|
|
RowLimit: rowLimit, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
queryResultTransformer := postgresQueryResultTransformer{} |
|
|
|
@ -93,7 +93,7 @@ func newPostgres(ctx context.Context, cfg *setting.Cfg, dsInfo sqleng.DataSource |
|
|
|
|
db.SetMaxIdleConns(config.DSInfo.JsonData.MaxIdleConns) |
|
|
|
|
db.SetConnMaxLifetime(time.Duration(config.DSInfo.JsonData.ConnMaxLifetime) * time.Second) |
|
|
|
|
|
|
|
|
|
handler, err := sqleng.NewQueryDataHandler(cfg.UserFacingDefaultError, db, config, &queryResultTransformer, newPostgresMacroEngine(dsInfo.JsonData.Timescaledb), |
|
|
|
|
handler, err := sqleng.NewQueryDataHandler(userFacingDefaultError, db, config, &queryResultTransformer, newPostgresMacroEngine(dsInfo.JsonData.Timescaledb), |
|
|
|
|
logger) |
|
|
|
|
if err != nil { |
|
|
|
|
logger.Error("Failed connecting to Postgres", "err", err) |
|
|
|
@ -104,20 +104,25 @@ func newPostgres(ctx context.Context, cfg *setting.Cfg, dsInfo sqleng.DataSource |
|
|
|
|
return db, handler, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *Service) newInstanceSettings(cfg *setting.Cfg) datasource.InstanceFactoryFunc { |
|
|
|
|
func (s *Service) newInstanceSettings() datasource.InstanceFactoryFunc { |
|
|
|
|
logger := s.logger |
|
|
|
|
return func(ctx context.Context, settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { |
|
|
|
|
logger.Debug("Creating Postgres query endpoint") |
|
|
|
|
cfg := backend.GrafanaConfigFromContext(ctx) |
|
|
|
|
sqlCfg, err := cfg.SQL() |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
jsonData := sqleng.JsonData{ |
|
|
|
|
MaxOpenConns: cfg.SqlDatasourceMaxOpenConnsDefault, |
|
|
|
|
MaxIdleConns: cfg.SqlDatasourceMaxIdleConnsDefault, |
|
|
|
|
ConnMaxLifetime: cfg.SqlDatasourceMaxConnLifetimeDefault, |
|
|
|
|
MaxOpenConns: sqlCfg.DefaultMaxOpenConns, |
|
|
|
|
MaxIdleConns: sqlCfg.DefaultMaxIdleConns, |
|
|
|
|
ConnMaxLifetime: sqlCfg.DefaultMaxConnLifetimeSeconds, |
|
|
|
|
Timescaledb: false, |
|
|
|
|
ConfigurationMethod: "file-path", |
|
|
|
|
SecureDSProxy: false, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err := json.Unmarshal(settings.JSONData, &jsonData) |
|
|
|
|
err = json.Unmarshal(settings.JSONData, &jsonData) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, fmt.Errorf("error reading settings: %w", err) |
|
|
|
|
} |
|
|
|
@ -143,7 +148,12 @@ func (s *Service) newInstanceSettings(cfg *setting.Cfg) datasource.InstanceFacto |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_, handler, err := newPostgres(ctx, cfg, dsInfo, cnnstr, logger, settings) |
|
|
|
|
userFacingDefaultError, err := cfg.UserFacingDefaultError() |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_, handler, err := newPostgres(ctx, userFacingDefaultError, sqlCfg.RowLimit, dsInfo, cnnstr, logger, settings) |
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
logger.Error("Failed connecting to Postgres", "err", err) |
|
|
|
|