|
@@ -17,24 +17,16 @@ import (
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
type InfluxDBExecutor struct {
|
|
type InfluxDBExecutor struct {
|
|
|
- *models.DataSource
|
|
|
|
|
|
|
+ //*models.DataSource
|
|
|
QueryParser *InfluxdbQueryParser
|
|
QueryParser *InfluxdbQueryParser
|
|
|
ResponseParser *ResponseParser
|
|
ResponseParser *ResponseParser
|
|
|
- HttpClient *http.Client
|
|
|
|
|
|
|
+ //HttpClient *http.Client
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func NewInfluxDBExecutor(datasource *models.DataSource) (tsdb.TsdbQueryEndpoint, error) {
|
|
func NewInfluxDBExecutor(datasource *models.DataSource) (tsdb.TsdbQueryEndpoint, error) {
|
|
|
- httpClient, err := datasource.GetHttpClient()
|
|
|
|
|
-
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return nil, err
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
return &InfluxDBExecutor{
|
|
return &InfluxDBExecutor{
|
|
|
- DataSource: datasource,
|
|
|
|
|
QueryParser: &InfluxdbQueryParser{},
|
|
QueryParser: &InfluxdbQueryParser{},
|
|
|
ResponseParser: &ResponseParser{},
|
|
ResponseParser: &ResponseParser{},
|
|
|
- HttpClient: httpClient,
|
|
|
|
|
}, nil
|
|
}, nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -47,10 +39,10 @@ func init() {
|
|
|
tsdb.RegisterTsdbQueryEndpoint("influxdb", NewInfluxDBExecutor)
|
|
tsdb.RegisterTsdbQueryEndpoint("influxdb", NewInfluxDBExecutor)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (e *InfluxDBExecutor) Query(ctx context.Context, context *tsdb.TsdbQuery) *tsdb.BatchResult {
|
|
|
|
|
|
|
+func (e *InfluxDBExecutor) Query(ctx context.Context, dsInfo *models.DataSource, context *tsdb.TsdbQuery) *tsdb.BatchResult {
|
|
|
result := &tsdb.BatchResult{}
|
|
result := &tsdb.BatchResult{}
|
|
|
|
|
|
|
|
- query, err := e.getQuery(context.Queries, context)
|
|
|
|
|
|
|
+ query, err := e.getQuery(dsInfo, context.Queries, context)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return result.WithError(err)
|
|
return result.WithError(err)
|
|
|
}
|
|
}
|
|
@@ -64,12 +56,17 @@ func (e *InfluxDBExecutor) Query(ctx context.Context, context *tsdb.TsdbQuery) *
|
|
|
glog.Debug("Influxdb query", "raw query", rawQuery)
|
|
glog.Debug("Influxdb query", "raw query", rawQuery)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- req, err := e.createRequest(rawQuery)
|
|
|
|
|
|
|
+ req, err := e.createRequest(dsInfo, rawQuery)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return result.WithError(err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ httpClient, err := dsInfo.GetHttpClient()
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return result.WithError(err)
|
|
return result.WithError(err)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- resp, err := ctxhttp.Do(ctx, e.HttpClient, req)
|
|
|
|
|
|
|
+ resp, err := ctxhttp.Do(ctx, httpClient, req)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return result.WithError(err)
|
|
return result.WithError(err)
|
|
|
}
|
|
}
|
|
@@ -98,10 +95,10 @@ func (e *InfluxDBExecutor) Query(ctx context.Context, context *tsdb.TsdbQuery) *
|
|
|
return result
|
|
return result
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (e *InfluxDBExecutor) getQuery(queries []*tsdb.Query, context *tsdb.TsdbQuery) (*Query, error) {
|
|
|
|
|
|
|
+func (e *InfluxDBExecutor) getQuery(dsInfo *models.DataSource, queries []*tsdb.Query, context *tsdb.TsdbQuery) (*Query, error) {
|
|
|
for _, v := range queries {
|
|
for _, v := range queries {
|
|
|
|
|
|
|
|
- query, err := e.QueryParser.Parse(v.Model, e.DataSource)
|
|
|
|
|
|
|
+ query, err := e.QueryParser.Parse(v.Model, dsInfo)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return nil, err
|
|
return nil, err
|
|
|
}
|
|
}
|
|
@@ -112,8 +109,8 @@ func (e *InfluxDBExecutor) getQuery(queries []*tsdb.Query, context *tsdb.TsdbQue
|
|
|
return nil, fmt.Errorf("query request contains no queries")
|
|
return nil, fmt.Errorf("query request contains no queries")
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (e *InfluxDBExecutor) createRequest(query string) (*http.Request, error) {
|
|
|
|
|
- u, _ := url.Parse(e.Url)
|
|
|
|
|
|
|
+func (e *InfluxDBExecutor) createRequest(dsInfo *models.DataSource, query string) (*http.Request, error) {
|
|
|
|
|
+ u, _ := url.Parse(dsInfo.Url)
|
|
|
u.Path = path.Join(u.Path, "query")
|
|
u.Path = path.Join(u.Path, "query")
|
|
|
|
|
|
|
|
req, err := http.NewRequest(http.MethodGet, u.String(), nil)
|
|
req, err := http.NewRequest(http.MethodGet, u.String(), nil)
|
|
@@ -123,18 +120,18 @@ func (e *InfluxDBExecutor) createRequest(query string) (*http.Request, error) {
|
|
|
|
|
|
|
|
params := req.URL.Query()
|
|
params := req.URL.Query()
|
|
|
params.Set("q", query)
|
|
params.Set("q", query)
|
|
|
- params.Set("db", e.Database)
|
|
|
|
|
|
|
+ params.Set("db", dsInfo.Database)
|
|
|
params.Set("epoch", "s")
|
|
params.Set("epoch", "s")
|
|
|
req.URL.RawQuery = params.Encode()
|
|
req.URL.RawQuery = params.Encode()
|
|
|
|
|
|
|
|
req.Header.Set("User-Agent", "Grafana")
|
|
req.Header.Set("User-Agent", "Grafana")
|
|
|
|
|
|
|
|
- if e.BasicAuth {
|
|
|
|
|
- req.SetBasicAuth(e.BasicAuthUser, e.BasicAuthPassword)
|
|
|
|
|
|
|
+ if dsInfo.BasicAuth {
|
|
|
|
|
+ req.SetBasicAuth(dsInfo.BasicAuthUser, dsInfo.BasicAuthPassword)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if !e.BasicAuth && e.User != "" {
|
|
|
|
|
- req.SetBasicAuth(e.User, e.Password)
|
|
|
|
|
|
|
+ if !dsInfo.BasicAuth && dsInfo.User != "" {
|
|
|
|
|
+ req.SetBasicAuth(dsInfo.User, dsInfo.Password)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
glog.Debug("Influxdb request", "url", req.URL.String())
|
|
glog.Debug("Influxdb request", "url", req.URL.String())
|