mirror of
https://github.com/grafana/grafana.git
synced 2025-09-23 18:52:33 +08:00

* first pass * fix tests * return errs * change signature * tidy * delete unnecessary fields from test * tidy * fix tests * simplify * separate error check in API * apply nits
109 lines
2.8 KiB
Go
109 lines
2.8 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
|
|
|
"github.com/grafana/grafana/pkg/plugins"
|
|
"github.com/grafana/grafana/pkg/services/datasources"
|
|
"github.com/grafana/grafana/pkg/services/oauthtoken"
|
|
"github.com/grafana/grafana/pkg/services/pluginsintegration/plugincontext"
|
|
"github.com/grafana/grafana/pkg/tsdb/legacydata"
|
|
)
|
|
|
|
type Service struct {
|
|
pluginsClient plugins.Client
|
|
oAuthTokenService oauthtoken.OAuthTokenService
|
|
dataSourcesService datasources.DataSourceService
|
|
pCtxProvider *plugincontext.Provider
|
|
}
|
|
|
|
func ProvideService(pluginsClient plugins.Client, oAuthTokenService oauthtoken.OAuthTokenService,
|
|
dataSourcesService datasources.DataSourceService, pCtxProvider *plugincontext.Provider) *Service {
|
|
return &Service{
|
|
pluginsClient: pluginsClient,
|
|
oAuthTokenService: oAuthTokenService,
|
|
dataSourcesService: dataSourcesService,
|
|
pCtxProvider: pCtxProvider,
|
|
}
|
|
}
|
|
|
|
//nolint:staticcheck // legacydata.DataResponse deprecated
|
|
func (h *Service) HandleRequest(ctx context.Context, ds *datasources.DataSource, query legacydata.DataQuery) (legacydata.DataResponse, error) {
|
|
req, err := h.generateRequest(ctx, ds, query)
|
|
if err != nil {
|
|
return legacydata.DataResponse{}, err
|
|
}
|
|
|
|
resp, err := h.pluginsClient.QueryData(ctx, req)
|
|
if err != nil {
|
|
return legacydata.DataResponse{}, err
|
|
}
|
|
|
|
tR := legacydata.DataResponse{
|
|
Results: make(map[string]legacydata.DataQueryResult, len(resp.Responses)),
|
|
}
|
|
|
|
for refID, r := range resp.Responses {
|
|
qr := legacydata.DataQueryResult{
|
|
RefID: refID,
|
|
}
|
|
|
|
for _, f := range r.Frames {
|
|
if f.RefID == "" {
|
|
f.RefID = refID
|
|
}
|
|
}
|
|
|
|
qr.Dataframes = legacydata.NewDecodedDataFrames(r.Frames)
|
|
|
|
if r.Error != nil {
|
|
qr.Error = r.Error
|
|
}
|
|
|
|
tR.Results[refID] = qr
|
|
}
|
|
|
|
return tR, nil
|
|
}
|
|
|
|
func (h *Service) generateRequest(ctx context.Context, ds *datasources.DataSource, query legacydata.DataQuery) (*backend.QueryDataRequest, error) {
|
|
if query.Headers == nil {
|
|
query.Headers = make(map[string]string)
|
|
}
|
|
|
|
pCtx, err := h.pCtxProvider.GetWithDataSource(ctx, ds.Type, query.User, ds)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
req := &backend.QueryDataRequest{
|
|
PluginContext: pCtx,
|
|
Queries: []backend.DataQuery{},
|
|
Headers: query.Headers,
|
|
}
|
|
|
|
for _, q := range query.Queries {
|
|
modelJSON, err := q.Model.MarshalJSON()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req.Queries = append(req.Queries, backend.DataQuery{
|
|
RefID: q.RefID,
|
|
Interval: time.Duration(q.IntervalMS) * time.Millisecond,
|
|
MaxDataPoints: q.MaxDataPoints,
|
|
TimeRange: backend.TimeRange{
|
|
From: query.TimeRange.GetFromAsTimeUTC(),
|
|
To: query.TimeRange.GetToAsTimeUTC(),
|
|
},
|
|
QueryType: q.QueryType,
|
|
JSON: modelJSON,
|
|
})
|
|
}
|
|
return req, nil
|
|
}
|
|
|
|
var _ legacydata.RequestHandler = &Service{}
|