diff --git a/pkg/api/pluginproxy/ds_auth_provider.go b/pkg/api/pluginproxy/ds_auth_provider.go index 8c6646f42b5..d3b628b9de4 100644 --- a/pkg/api/pluginproxy/ds_auth_provider.go +++ b/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) { diff --git a/pkg/tsdb/stackdriver/metric_descriptors_query.go b/pkg/tsdb/stackdriver/metric_descriptors_query.go new file mode 100644 index 00000000000..da2e5f5d9e0 --- /dev/null +++ b/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 +} diff --git a/pkg/tsdb/stackdriver/stackdriver.go b/pkg/tsdb/stackdriver/stackdriver.go index dc7fbdc135e..d36487e344a 100644 --- a/pkg/tsdb/stackdriver/stackdriver.go +++ b/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)