2024-02-02 06:27:30 +08:00
|
|
|
package datasource
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
2024-09-04 19:53:14 +08:00
|
|
|
"github.com/grafana/grafana/pkg/apimachinery/utils"
|
2024-02-02 06:27:30 +08:00
|
|
|
"github.com/grafana/grafana/pkg/plugins"
|
|
|
|
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
|
|
|
|
"github.com/grafana/grafana/pkg/services/datasources"
|
|
|
|
)
|
|
|
|
|
2024-09-04 19:53:14 +08:00
|
|
|
type QuerierFactoryFunc func(ctx context.Context, ri utils.ResourceInfo, pj plugins.JSONData) (Querier, error)
|
2024-02-02 06:27:30 +08:00
|
|
|
|
|
|
|
type QuerierProvider interface {
|
2024-09-04 19:53:14 +08:00
|
|
|
Querier(ctx context.Context, ri utils.ResourceInfo, pj plugins.JSONData) (Querier, error)
|
2024-02-02 06:27:30 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type DefaultQuerierProvider struct {
|
|
|
|
factory QuerierFactoryFunc
|
|
|
|
}
|
|
|
|
|
|
|
|
func ProvideDefaultQuerierProvider(pluginClient plugins.Client, dsService datasources.DataSourceService,
|
|
|
|
dsCache datasources.CacheService) *DefaultQuerierProvider {
|
2024-09-04 19:53:14 +08:00
|
|
|
return NewQuerierProvider(func(ctx context.Context, ri utils.ResourceInfo, pj plugins.JSONData) (Querier, error) {
|
2024-02-02 06:27:30 +08:00
|
|
|
return NewDefaultQuerier(ri, pj, pluginClient, dsService, dsCache), nil
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewQuerierProvider(factory QuerierFactoryFunc) *DefaultQuerierProvider {
|
|
|
|
return &DefaultQuerierProvider{
|
|
|
|
factory: factory,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-09-04 19:53:14 +08:00
|
|
|
func (p *DefaultQuerierProvider) Querier(ctx context.Context, ri utils.ResourceInfo, pj plugins.JSONData) (Querier, error) {
|
2024-02-02 06:27:30 +08:00
|
|
|
return p.factory(ctx, ri, pj)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Querier is the interface that wraps the Query method.
|
|
|
|
type Querier interface {
|
|
|
|
// Query runs the query on behalf of the user in context.
|
|
|
|
Query(ctx context.Context, query *backend.QueryDataRequest) (*backend.QueryDataResponse, error)
|
|
|
|
// Health checks the health of the plugin.
|
|
|
|
Health(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error)
|
|
|
|
// Resource gets a resource plugin.
|
|
|
|
Resource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error
|
|
|
|
}
|
|
|
|
|
|
|
|
type DefaultQuerier struct {
|
2024-09-04 19:53:14 +08:00
|
|
|
connectionResourceInfo utils.ResourceInfo
|
2024-02-02 06:27:30 +08:00
|
|
|
pluginJSON plugins.JSONData
|
|
|
|
pluginClient plugins.Client
|
|
|
|
dsService datasources.DataSourceService
|
|
|
|
dsCache datasources.CacheService
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewDefaultQuerier(
|
2024-09-04 19:53:14 +08:00
|
|
|
connectionResourceInfo utils.ResourceInfo,
|
2024-02-02 06:27:30 +08:00
|
|
|
pluginJSON plugins.JSONData,
|
|
|
|
pluginClient plugins.Client,
|
|
|
|
dsService datasources.DataSourceService,
|
|
|
|
dsCache datasources.CacheService,
|
|
|
|
) *DefaultQuerier {
|
|
|
|
return &DefaultQuerier{
|
|
|
|
connectionResourceInfo: connectionResourceInfo,
|
|
|
|
pluginJSON: pluginJSON,
|
|
|
|
pluginClient: pluginClient,
|
|
|
|
dsService: dsService,
|
|
|
|
dsCache: dsCache,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (q *DefaultQuerier) Query(ctx context.Context, query *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
|
|
|
_, err := request.NamespaceInfoFrom(ctx, true)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return q.pluginClient.QueryData(ctx, query)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (q *DefaultQuerier) Resource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
|
|
|
|
_, err := request.NamespaceInfoFrom(ctx, true)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return q.pluginClient.CallResource(ctx, req, sender)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (q *DefaultQuerier) Health(ctx context.Context, query *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
|
|
|
|
_, err := request.NamespaceInfoFrom(ctx, true)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return q.pluginClient.CheckHealth(ctx, query)
|
|
|
|
}
|