mirror of
https://github.com/grafana/grafana.git
synced 2025-07-30 16:43:07 +08:00
SSE: Group data source node execution by data source (#72935)
Execute all queries to the same datasource in a single request. Uses the query index and the graph node ID index, and then a stable dependency graph sort based on node input index number in attempt to keep the original query order intact.
This commit is contained in:
@ -55,7 +55,24 @@ type DataPipeline []Node
|
||||
// map of the refId of the of each command
|
||||
func (dp *DataPipeline) execute(c context.Context, now time.Time, s *Service) (mathexp.Vars, error) {
|
||||
vars := make(mathexp.Vars)
|
||||
|
||||
// Execute datasource nodes first, and grouped by datasource.
|
||||
dsNodes := []*DSNode{}
|
||||
for _, node := range *dp {
|
||||
if node.NodeType() != TypeDatasourceNode {
|
||||
continue
|
||||
}
|
||||
dsNodes = append(dsNodes, node.(*DSNode))
|
||||
}
|
||||
|
||||
if err := executeDSNodesGrouped(c, now, vars, s, dsNodes); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, node := range *dp {
|
||||
if node.NodeType() == TypeDatasourceNode {
|
||||
continue // already executed via executeDSNodesGrouped
|
||||
}
|
||||
c, span := s.tracer.Start(c, "SSE.ExecuteNode")
|
||||
span.SetAttributes("node.refId", node.RefID(), attribute.Key("node.refId").String(node.RefID()))
|
||||
if node.NodeType() == TypeCMDNode {
|
||||
@ -112,8 +129,10 @@ func (s *Service) buildDependencyGraph(req *Request) (*simple.DirectedGraph, err
|
||||
}
|
||||
|
||||
// buildExecutionOrder returns a sequence of nodes ordered by dependency.
|
||||
// Note: During execution, Datasource query nodes for the same datasource will
|
||||
// be grouped into one request and executed first as phase after this call.
|
||||
func buildExecutionOrder(graph *simple.DirectedGraph) ([]Node, error) {
|
||||
sortedNodes, err := topo.Sort(graph)
|
||||
sortedNodes, err := topo.SortStabilized(graph, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -145,7 +164,7 @@ func buildNodeRegistry(g *simple.DirectedGraph) map[string]Node {
|
||||
func (s *Service) buildGraph(req *Request) (*simple.DirectedGraph, error) {
|
||||
dp := simple.NewDirectedGraph()
|
||||
|
||||
for _, query := range req.Queries {
|
||||
for i, query := range req.Queries {
|
||||
if query.DataSource == nil || query.DataSource.UID == "" {
|
||||
return nil, fmt.Errorf("missing datasource uid in query with refId %v", query.RefID)
|
||||
}
|
||||
@ -169,6 +188,7 @@ func (s *Service) buildGraph(req *Request) (*simple.DirectedGraph, error) {
|
||||
TimeRange: query.TimeRange,
|
||||
QueryType: query.QueryType,
|
||||
DataSource: query.DataSource,
|
||||
idx: int64(i),
|
||||
}
|
||||
|
||||
var node Node
|
||||
|
Reference in New Issue
Block a user