Browse Source

stackdriver: wip - get metric descriptors in the backend

Erik Sundell 7 years ago
parent
commit
ff5f281508

+ 6 - 5
pkg/api/pluginproxy/ds_auth_provider.go

@@ -12,7 +12,6 @@ import (
 	m "github.com/grafana/grafana/pkg/models"
 	"github.com/grafana/grafana/pkg/plugins"
 	"github.com/grafana/grafana/pkg/util"
-	"golang.org/x/oauth2/google"
 )
 
 //ApplyRoute should use the plugin route data to set auth headers and custom headers
@@ -56,6 +55,7 @@ func ApplyRoute(ctx context.Context, req *http.Request, proxyPath string, route
 	}
 
 	gceAutoAuthentication := ds.JsonData.Get("gceAutomaticAuthentication").MustBool()
+	logger.Info("gceAutoAuthentication", "gceAutoAuthentication", gceAutoAuthentication)
 	if route.JwtTokenAuth != nil && !gceAutoAuthentication {
 		if token, err := tokenProvider.getJwtAccessToken(ctx, data); err != nil {
 			logger.Error("Failed to get access token", "error", err)
@@ -65,21 +65,22 @@ func ApplyRoute(ctx context.Context, req *http.Request, proxyPath string, route
 	}
 
 	if gceAutoAuthentication {
-		tokenSrc, err := google.DefaultTokenSource(ctx, route.JwtTokenAuth.Scopes...)
+		// tokenSrc, err := google.DefaultTokenSource(ctx, route.JwtTokenAuth.Scopes...)
 		if err != nil {
 			logger.Error("Failed to get default credentials", "error", err)
 		} else {
-			token, err := tokenSrc.Token()
+			// token, err := tokenSrc.Token()
+			token, err := tokenProvider.getJwtAccessToken(ctx, data)
 			if err != nil {
 				logger.Error("Failed to get default access token", "error", err)
 			} else {
-				req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token.AccessToken))
+				// req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token.AccessToken))
+				req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
 			}
 		}
 	}
 
 	logger.Info("Requesting", "url", req.URL.String())
-
 }
 
 func interpolateString(text string, data templateData) (string, error) {

+ 47 - 0
pkg/tsdb/stackdriver/metric_descriptors_query.go

@@ -0,0 +1,47 @@
+package stackdriver
+
+import (
+	"context"
+	"fmt"
+	"io/ioutil"
+
+	"github.com/grafana/grafana/pkg/cmd/grafana-cli/logger"
+	"github.com/grafana/grafana/pkg/components/simplejson"
+	"golang.org/x/net/context/ctxhttp"
+
+	"github.com/grafana/grafana/pkg/tsdb"
+)
+
+func (e *StackdriverExecutor) executeMetricDescriptors(ctx context.Context, tsdbQuery *tsdb.TsdbQuery) (*tsdb.Response, error) {
+	logger.Info("metricDescriptors", "metricDescriptors", tsdbQuery.Queries[0].RefId)
+	queryResult := &tsdb.QueryResult{Meta: simplejson.New(), RefId: tsdbQuery.Queries[0].RefId}
+	result := &tsdb.Response{
+		Results: make(map[string]*tsdb.QueryResult),
+	}
+
+	req, err := e.createRequest(ctx, e.dsInfo, "metricDescriptors")
+	if err != nil {
+		slog.Error("Failed to create request", "error", err)
+		return nil, fmt.Errorf("Failed to create request. error: %v", err)
+	}
+	res, err := ctxhttp.Do(ctx, e.httpClient, req)
+	if err != nil {
+		logger.Info("error2", err)
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(res.Body)
+	if err != nil {
+		logger.Info("error3", err)
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err != nil {
+		return nil, err
+	}
+
+	queryResult.Meta.Set("test", string(body))
+	logger.Info("string(body)", "string(body)", string(body))
+	result.Results[tsdbQuery.Queries[0].RefId] = queryResult
+
+	return result, nil
+}

+ 7 - 4
pkg/tsdb/stackdriver/stackdriver.go

@@ -74,6 +74,8 @@ func (e *StackdriverExecutor) Query(ctx context.Context, dsInfo *models.DataSour
 	switch queryType {
 	case "annotationQuery":
 		result, err = e.executeAnnotationQuery(ctx, tsdbQuery)
+	case "metricDescriptors":
+		result, err = e.executeMetricDescriptors(ctx, tsdbQuery)
 	case "timeSeriesQuery":
 		fallthrough
 	default:
@@ -268,7 +270,7 @@ func setAggParams(params *url.Values, query *tsdb.Query, durationSeconds int) {
 func (e *StackdriverExecutor) executeQuery(ctx context.Context, query *StackdriverQuery, tsdbQuery *tsdb.TsdbQuery) (*tsdb.QueryResult, StackdriverResponse, error) {
 	queryResult := &tsdb.QueryResult{Meta: simplejson.New(), RefId: query.RefID}
 
-	req, err := e.createRequest(ctx, e.dsInfo)
+	req, err := e.createRequest(ctx, e.dsInfo, "timeSeries")
 	if err != nil {
 		queryResult.Error = err
 		return queryResult, StackdriverResponse{}, nil
@@ -526,7 +528,8 @@ func getProjectName(ctx context.Context, dsInfo *models.DataSource, route *plugi
 	if gceAutomaticAuthentication {
 		defaultCredentials, err := google.FindDefaultCredentials(ctx, route.JwtTokenAuth.Scopes...)
 		if err != nil {
-			return "", err
+			// return "", err
+			projectName = "raintank-dev"
 		} else {
 			projectName = defaultCredentials.ProjectID
 		}
@@ -553,7 +556,7 @@ func calcBucketBound(bucketOptions StackdriverBucketOptions, n int) string {
 	return bucketBound
 }
 
-func (e *StackdriverExecutor) createRequest(ctx context.Context, dsInfo *models.DataSource) (*http.Request, error) {
+func (e *StackdriverExecutor) createRequest(ctx context.Context, dsInfo *models.DataSource, endpointName string)) (*http.Request, error) {
 	u, _ := url.Parse(dsInfo.Url)
 	u.Path = path.Join(u.Path, "render")
 
@@ -586,7 +589,7 @@ func (e *StackdriverExecutor) createRequest(ctx context.Context, dsInfo *models.
 	if err != nil {
 		return nil, err
 	}
-	proxyPass := fmt.Sprintf("stackdriver%s", "v3/projects/"+projectName+"/timeSeries")
+	proxyPass := fmt.Sprintf("stackdriver%s", "v3/projects/"+projectName+"/"+endpointName)
 
 	pluginproxy.ApplyRoute(ctx, req, proxyPass, stackdriverRoute, dsInfo)