package wrapper import ( "context" "errors" sdk "github.com/grafana/grafana-plugin-sdk-go/datasource" "github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2" "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/tsdb" ) func NewDatasourcePluginWrapperV2(log log.Logger, plugin sdk.DatasourcePlugin) *DatasourcePluginWrapperV2 { return &DatasourcePluginWrapperV2{DatasourcePlugin: plugin, logger: log} } type DatasourcePluginWrapperV2 struct { sdk.DatasourcePlugin logger log.Logger } func (tw *DatasourcePluginWrapperV2) Query(ctx context.Context, ds *models.DataSource, query *tsdb.TsdbQuery) (*tsdb.Response, error) { jsonData, err := ds.JsonData.MarshalJSON() if err != nil { return nil, err } pbQuery := &pluginv2.DatasourceRequest{ Datasource: &pluginv2.DatasourceInfo{ Name: ds.Name, Type: ds.Type, Url: ds.Url, Id: ds.Id, OrgId: ds.OrgId, JsonData: string(jsonData), DecryptedSecureJsonData: ds.SecureJsonData.Decrypt(), }, TimeRange: &pluginv2.TimeRange{ FromRaw: query.TimeRange.From, ToRaw: query.TimeRange.To, ToEpochMs: query.TimeRange.GetToAsMsEpoch(), FromEpochMs: query.TimeRange.GetFromAsMsEpoch(), }, Queries: []*pluginv2.DatasourceQuery{}, } for _, q := range query.Queries { modelJSON, err := q.Model.MarshalJSON() if err != nil { return nil, err } pbQuery.Queries = append(pbQuery.Queries, &pluginv2.DatasourceQuery{ ModelJson: string(modelJSON), IntervalMs: q.IntervalMs, RefId: q.RefId, MaxDataPoints: q.MaxDataPoints, }) } pbres, err := tw.DatasourcePlugin.Query(ctx, pbQuery) if err != nil { return nil, err } res := &tsdb.Response{ Results: map[string]*tsdb.QueryResult{}, } for _, r := range pbres.Results { qr := &tsdb.QueryResult{ RefId: r.RefId, } if r.Error != "" { qr.Error = errors.New(r.Error) qr.ErrorString = r.Error } if r.MetaJson != "" { metaJSON, err := simplejson.NewJson([]byte(r.MetaJson)) if err != nil { tw.logger.Error("Error parsing JSON Meta field: " + err.Error()) } qr.Meta = metaJSON } qr.Dataframes = r.Dataframes res.Results[r.RefId] = qr } return res, nil }