为你的数据源后端添加查询路由器或多路复用器
通常,你在后端插件中实现 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...
}
高级用法
可以在 Grafana 内置的 TestData 数据源中找到使用 QueryTypeMux
的示例。请参考此代码以获取实现示例
- 创建查询类型多路复用器 和 调用 registerScenarios
- registerScenarios 方法 使用 辅助方法 来注册每个查询类型处理程序。后者还展示了如何将实际处理程序包装在另一个处理程序中,以便将通用功能或中间件应用于所有处理程序。例如,日志记录和追踪。