diff --git a/pkg/tsdb/stackdriver/stackdriver.go b/pkg/tsdb/stackdriver/stackdriver.go index f555ebfa3f4..87856e3f36c 100644 --- a/pkg/tsdb/stackdriver/stackdriver.go +++ b/pkg/tsdb/stackdriver/stackdriver.go @@ -18,6 +18,7 @@ import ( "github.com/grafana/grafana/pkg/cmd/grafana-cli/logger" "golang.org/x/net/context/ctxhttp" + "golang.org/x/oauth2/google" "github.com/grafana/grafana/pkg/api/pluginproxy" "github.com/grafana/grafana/pkg/components/null" @@ -518,6 +519,23 @@ func replaceWithMetricPart(metaPartName string, metricType string) []byte { return nil } +func getProjectName(ctx context.Context, dsInfo *models.DataSource, route *plugins.AppPluginRoute) (string, error) { + var projectName string + gceAutoAuthentication := dsInfo.JsonData.Get("gceAutoAuthentication").MustBool() + if gceAutoAuthentication { + defaultCredentials, err := google.FindDefaultCredentials(ctx, route.JwtTokenAuth.Scopes...) + if err != nil { + return "", err + } else { + projectName = defaultCredentials.ProjectID + } + } else { + projectName = dsInfo.JsonData.Get("defaultProject").MustString() + } + logger.Info("projectName", "projectName", projectName) + return projectName, nil +} + func calcBucketBound(bucketOptions StackdriverBucketOptions, n int) string { bucketBound := "0" if n == 0 { @@ -552,9 +570,6 @@ func (e *StackdriverExecutor) createRequest(ctx context.Context, dsInfo *models. if !ok { return nil, errors.New("Unable to find datasource plugin Stackdriver") } - projectName := dsInfo.JsonData.Get("defaultProject").MustString() - logger.Info("projectName", "projectName", projectName) - proxyPass := fmt.Sprintf("stackdriver%s", "v3/projects/"+projectName+"/timeSeries") var stackdriverRoute *plugins.AppPluginRoute for _, route := range plugin.Routes { @@ -564,6 +579,14 @@ func (e *StackdriverExecutor) createRequest(ctx context.Context, dsInfo *models. } } + // projectName := dsInfo.JsonData.Get("defaultProject").MustString() + // logger.Info("projectName", "projectName", projectName) + projectName, err := getProjectName(ctx, dsInfo, stackdriverRoute) + if err != nil { + return nil, err + } + proxyPass := fmt.Sprintf("stackdriver%s", "v3/projects/"+projectName+"/timeSeries") + pluginproxy.ApplyRoute(ctx, req, proxyPass, stackdriverRoute, dsInfo) return req, nil