diff --git a/pkg/api/metrics.go b/pkg/api/metrics.go index 4f4edda2f2a..804faea1956 100644 --- a/pkg/api/metrics.go +++ b/pkg/api/metrics.go @@ -16,6 +16,7 @@ import ( "github.com/grafana/grafana/pkg/util" ) +// QueryMetricsV2 returns query metrics // POST /api/ds/query DataSource query w/ expressions func (hs *HTTPServer) QueryMetricsV2(c *models.ReqContext, reqDto dtos.MetricRequest) Response { if !setting.IsExpressionsEnabled() { @@ -29,6 +30,7 @@ func (hs *HTTPServer) QueryMetricsV2(c *models.ReqContext, reqDto dtos.MetricReq request := &tsdb.TsdbQuery{ TimeRange: tsdb.NewTimeRange(reqDto.From, reqDto.To), Debug: reqDto.Debug, + User: c.SignedInUser, } expr := false @@ -92,6 +94,7 @@ func (hs *HTTPServer) QueryMetricsV2(c *models.ReqContext, reqDto dtos.MetricReq return JSON(statusCode, &resp) } +// QueryMetrics returns query metrics // POST /api/tsdb/query func (hs *HTTPServer) QueryMetrics(c *models.ReqContext, reqDto dtos.MetricRequest) Response { timeRange := tsdb.NewTimeRange(reqDto.From, reqDto.To) @@ -113,7 +116,11 @@ func (hs *HTTPServer) QueryMetrics(c *models.ReqContext, reqDto dtos.MetricReque return Error(500, "Unable to load datasource meta data", err) } - request := &tsdb.TsdbQuery{TimeRange: timeRange, Debug: reqDto.Debug} + request := &tsdb.TsdbQuery{ + TimeRange: timeRange, + Debug: reqDto.Debug, + User: c.SignedInUser, + } for _, query := range reqDto.Queries { request.Queries = append(request.Queries, &tsdb.Query{ @@ -165,7 +172,7 @@ func GetTestDataScenarios(c *models.ReqContext) Response { return JSON(200, &result) } -// Generates a index out of range error +// GenerateError generates a index out of range error func GenerateError(c *models.ReqContext) Response { var array []string // nolint: govet diff --git a/pkg/api/plugins.go b/pkg/api/plugins.go index 5bacc68ca5c..eb32bcae786 100644 --- a/pkg/api/plugins.go +++ b/pkg/api/plugins.go @@ -205,6 +205,7 @@ func ImportDashboard(c *models.ReqContext, apiCmd dtos.ImportDashboardCommand) R return JSON(200, cmd.Result) } +// CheckHealth returns the health of a plugin. // /api/plugins/:pluginId/health func (hs *HTTPServer) CheckHealth(c *models.ReqContext) Response { pluginID := c.Params("pluginId") @@ -226,8 +227,9 @@ func (hs *HTTPServer) CheckHealth(c *models.ReqContext) Response { } payload := map[string]interface{}{ - "status": resp.Status.String(), - "message": resp.Message, + "status": resp.Status.String(), + "message": resp.Message, + "jsonDetails": resp.JSONDetails, } if resp.Status != backendplugin.HealthStatusOk { diff --git a/pkg/plugins/backendplugin/backend_plugin.go b/pkg/plugins/backendplugin/backend_plugin.go index 39f0e2cf6af..f64e8a27b2e 100644 --- a/pkg/plugins/backendplugin/backend_plugin.go +++ b/pkg/plugins/backendplugin/backend_plugin.go @@ -230,6 +230,15 @@ func (p *BackendPlugin) callResource(ctx context.Context, req CallResourceReques Body: req.Body, } + if req.User != nil { + protoReq.User = &pluginv2.User{ + Name: req.User.Name, + Login: req.User.Login, + Email: req.User.Email, + Role: string(req.User.OrgRole), + } + } + if req.Config.DataSourceConfig != nil { protoReq.Config.DatasourceConfig = &pluginv2.DataSourceConfig{ Id: req.Config.DataSourceConfig.ID, diff --git a/pkg/plugins/backendplugin/contracts.go b/pkg/plugins/backendplugin/contracts.go index 1d52582c286..f6e13854df6 100644 --- a/pkg/plugins/backendplugin/contracts.go +++ b/pkg/plugins/backendplugin/contracts.go @@ -5,6 +5,7 @@ import ( "time" "github.com/grafana/grafana/pkg/components/simplejson" + "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2" ) @@ -37,8 +38,9 @@ func (hs HealthStatus) String() string { // CheckHealthResult check health result. type CheckHealthResult struct { - Status HealthStatus - Message string + Status HealthStatus + Message string + JSONDetails string } func checkHealthResultFromProto(protoResp *pluginv2.CheckHealth_Response) *CheckHealthResult { @@ -51,8 +53,9 @@ func checkHealthResultFromProto(protoResp *pluginv2.CheckHealth_Response) *Check } return &CheckHealthResult{ - Status: status, - Message: protoResp.Message, + Status: status, + Message: protoResp.Message, + JSONDetails: protoResp.JsonDetails, } } @@ -83,6 +86,7 @@ type CallResourceRequest struct { URL string Headers map[string][]string Body []byte + User *models.SignedInUser } // CallResourceResult call resource result. diff --git a/pkg/plugins/backendplugin/manager.go b/pkg/plugins/backendplugin/manager.go index 8ed2510542c..e873089b96c 100644 --- a/pkg/plugins/backendplugin/manager.go +++ b/pkg/plugins/backendplugin/manager.go @@ -208,6 +208,7 @@ func (m *manager) CallResource(config PluginConfig, c *models.ReqContext, path s URL: clonedReq.URL.String(), Headers: clonedReq.Header, Body: body, + User: c.SignedInUser, } stream, err := p.callResource(clonedReq.Context(), req) diff --git a/pkg/plugins/datasource/wrapper/datasource_plugin_wrapper_v2.go b/pkg/plugins/datasource/wrapper/datasource_plugin_wrapper_v2.go index f608520fa5f..9fc66b34d50 100644 --- a/pkg/plugins/datasource/wrapper/datasource_plugin_wrapper_v2.go +++ b/pkg/plugins/datasource/wrapper/datasource_plugin_wrapper_v2.go @@ -51,6 +51,15 @@ func (tw *DatasourcePluginWrapperV2) Query(ctx context.Context, ds *models.DataS Queries: []*pluginv2.DataQuery{}, } + if query.User != nil { + pbQuery.User = &pluginv2.User{ + Name: query.User.Name, + Login: query.User.Login, + Email: query.User.Email, + Role: string(query.User.OrgRole), + } + } + for _, q := range query.Queries { modelJSON, err := q.Model.MarshalJSON() if err != nil { diff --git a/pkg/tsdb/models.go b/pkg/tsdb/models.go index 27111d22e24..13683534cf3 100644 --- a/pkg/tsdb/models.go +++ b/pkg/tsdb/models.go @@ -6,10 +6,12 @@ import ( "github.com/grafana/grafana/pkg/models" ) +// TsdbQuery contains all information about a query request. type TsdbQuery struct { TimeRange *TimeRange Queries []*Query Debug bool + User *models.SignedInUser } type Query struct {