跳至主要内容

在您的数据源后端添加查询路由器或多路复用器

通常,您会在后端插件中实现 QueryData 方法以进行数据查询。但是,如果您需要支持不同类型的查询,例如指标、日志和跟踪,该怎么办?这就是使用查询路由器(也称为多路复用器)派上用场的地方。

插件开发要求您需要在客户端填充查询模型的 queryType 属性,请参见 DataQuery 接口。

当在查询中填充 queryType 并发送到后端插件时,以下是如何使用 datasource.QueryTypeMux 多路复用或将不同的查询类型路由到单独的查询处理程序的示例。

通过这种方式实现,每个查询处理程序然后可以 json.Unmarshal DataQuery 中的每个查询 JSON 字段到某个 Go 结构体,如本示例所示

package mydatasource

import (
"context"

"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/backend/datasource"
)

type MyDatasource struct {
queryHandler backend.QueryDataHandler
}

func New() *MyDatasource {
ds := &MyDatasource{}
queryTypeMux := datasource.NewQueryTypeMux()
queryTypeMux.HandleFunc("metrics", ds.handleMetricsQuery)
queryTypeMux.HandleFunc("logs", ds.handleLogsQuery)
queryTypeMux.HandleFunc("traces", ds.handleTracesQuery)
queryTypeMux.HandleFunc("", ds.handleQueryFallback)
ds.queryHandler := queryTypeMux
return ds
}

func (d *MyDatasource) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
return d.queryHandler.QueryData(ctx, req)
}

// handleMetricsQuery handle queries of query type "metrics".
// All queries in backend.QueryDataRequest is guaranteed to only
// include queries with queryType "metrics".
func (d *MyDatasource) handleMetricsQuery(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
// implementation...
}

// handleLogsQuery handle queries of query type "logs".
// All queries in backend.QueryDataRequest is guaranteed to only
// include queries with queryType "logs".
func (d *MyDatasource) handleLogsQuery(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
// implementation...
}

// handleTracesQuery handle queries of query type "logs".
// All queries in backend.QueryDataRequest is guaranteed to only
// include queries with queryType "traces".
func (d *MyDatasource) handleTracesQuery(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
// implementation...
}

// handleQueryFallback handle queries without a matching query type handler registered.
func (d *MyDatasource) handleQueryFallback(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
// implementation...
}

高级用法

使用 QueryTypeMux 的示例可以在 Grafana 的内置 TestData 数据源中找到。参考此代码以获取实施示例