Просмотр исходного кода

Use datasource cache for backend tsdb/query endpoint (#13266)

fix: use datasource cache for backend datasources
Torkel Ödegaard 7 лет назад
Родитель
Сommit
0e9a6dcedc
3 измененных файлов с 13 добавлено и 15 удалено
  1. 1 1
      pkg/api/api.go
  2. 5 7
      pkg/api/dataproxy.go
  3. 7 7
      pkg/api/metrics.go

+ 1 - 1
pkg/api/api.go

@@ -320,7 +320,7 @@ func (hs *HTTPServer) registerRoutes() {
 		apiRoute.Get("/search/", Search)
 
 		// metrics
-		apiRoute.Post("/tsdb/query", bind(dtos.MetricRequest{}), Wrap(QueryMetrics))
+		apiRoute.Post("/tsdb/query", bind(dtos.MetricRequest{}), Wrap(hs.QueryMetrics))
 		apiRoute.Get("/tsdb/testdata/scenarios", Wrap(GetTestDataScenarios))
 		apiRoute.Get("/tsdb/testdata/gensql", reqGrafanaAdmin, Wrap(GenerateSQLTestData))
 		apiRoute.Get("/tsdb/testdata/random-walk", Wrap(GetTestDataRandomWalk))

+ 5 - 7
pkg/api/dataproxy.go

@@ -13,19 +13,20 @@ import (
 
 const HeaderNameNoBackendCache = "X-Grafana-NoCache"
 
-func (hs *HTTPServer) getDatasourceByID(id int64, orgID int64, nocache bool) (*m.DataSource, error) {
+func (hs *HTTPServer) getDatasourceFromCache(id int64, c *m.ReqContext) (*m.DataSource, error) {
+	nocache := c.Req.Header.Get(HeaderNameNoBackendCache) == "true"
 	cacheKey := fmt.Sprintf("ds-%d", id)
 
 	if !nocache {
 		if cached, found := hs.cache.Get(cacheKey); found {
 			ds := cached.(*m.DataSource)
-			if ds.OrgId == orgID {
+			if ds.OrgId == c.OrgId {
 				return ds, nil
 			}
 		}
 	}
 
-	query := m.GetDataSourceByIdQuery{Id: id, OrgId: orgID}
+	query := m.GetDataSourceByIdQuery{Id: id, OrgId: c.OrgId}
 	if err := bus.Dispatch(&query); err != nil {
 		return nil, err
 	}
@@ -37,10 +38,7 @@ func (hs *HTTPServer) getDatasourceByID(id int64, orgID int64, nocache bool) (*m
 func (hs *HTTPServer) ProxyDataSourceRequest(c *m.ReqContext) {
 	c.TimeRequest(metrics.M_DataSource_ProxyReq_Timer)
 
-	nocache := c.Req.Header.Get(HeaderNameNoBackendCache) == "true"
-
-	ds, err := hs.getDatasourceByID(c.ParamsInt64(":id"), c.OrgId, nocache)
-
+	ds, err := hs.getDatasourceFromCache(c.ParamsInt64(":id"), c)
 	if err != nil {
 		c.JsonApiErr(500, "Unable to load datasource meta data", err)
 		return

+ 7 - 7
pkg/api/metrics.go

@@ -13,21 +13,21 @@ import (
 )
 
 // POST /api/tsdb/query
-func QueryMetrics(c *m.ReqContext, reqDto dtos.MetricRequest) Response {
+func (hs *HTTPServer) QueryMetrics(c *m.ReqContext, reqDto dtos.MetricRequest) Response {
 	timeRange := tsdb.NewTimeRange(reqDto.From, reqDto.To)
 
 	if len(reqDto.Queries) == 0 {
 		return Error(400, "No queries found in query", nil)
 	}
 
-	dsID, err := reqDto.Queries[0].Get("datasourceId").Int64()
+	datasourceId, err := reqDto.Queries[0].Get("datasourceId").Int64()
 	if err != nil {
 		return Error(400, "Query missing datasourceId", nil)
 	}
 
-	dsQuery := m.GetDataSourceByIdQuery{Id: dsID, OrgId: c.OrgId}
-	if err := bus.Dispatch(&dsQuery); err != nil {
-		return Error(500, "failed to fetch data source", err)
+	ds, err := hs.getDatasourceFromCache(datasourceId, c)
+	if err != nil {
+		return Error(500, "Unable to load datasource meta data", err)
 	}
 
 	request := &tsdb.TsdbQuery{TimeRange: timeRange}
@@ -38,11 +38,11 @@ func QueryMetrics(c *m.ReqContext, reqDto dtos.MetricRequest) Response {
 			MaxDataPoints: query.Get("maxDataPoints").MustInt64(100),
 			IntervalMs:    query.Get("intervalMs").MustInt64(1000),
 			Model:         query,
-			DataSource:    dsQuery.Result,
+			DataSource:    ds,
 		})
 	}
 
-	resp, err := tsdb.HandleRequest(context.Background(), dsQuery.Result, request)
+	resp, err := tsdb.HandleRequest(c.Req.Context(), ds, request)
 	if err != nil {
 		return Error(500, "Metric request error", err)
 	}