func()

in metric_storeview_routing.go [398:460]


func (s *StoreViewRoutingChecker) CheckPromQlQuery(query string, sourceProjects []ProjectStore) ([]MetricRoutingResult, error) {
	expr, err := parser.ParseExpr(query)
	if err != nil {
		return nil, err
	}

	dstProjects := make([]MetricRoutingResult, 0, 4)
	parser.Inspect(expr, func(node parser.Node, path []parser.Node) error {
		switch n := node.(type) {
		case *parser.VectorSelector:
			metricNameOnEqual := ""
			for _, matcher := range n.LabelMatchers {
				if matcher.Name == "__name__" && matcher.Type == labels.MatchEqual {
					metricNameOnEqual = matcher.Value
					break
				}
			}
			if metricNameOnEqual == "" {
				// default: all stores matched
				dstProjects = append(dstProjects, MetricRoutingResult{MetricName: n.Name, ProjectStores: sourceProjects})
				return nil
			}
			matchedStrategies := make([]*StoreViewRoutingMatchStrategy, 0, len(s.strategyItem.Strategies))
			for _, strategy := range s.strategyItem.Strategies {
				metricNameMatched := false
				for _, metricNameCond := range strategy.MetricNameConds {
					if metricNameCond.Match(metricNameOnEqual) {
						metricNameMatched = true
						break
					}
				}
				if metricNameMatched {
					matchedStrategies = append(matchedStrategies, strategy)
				}
			}
			if (len(matchedStrategies)) == 0 {
				// default: all stores matched
				dstProjects = append(dstProjects, MetricRoutingResult{MetricName: n.Name, ProjectStores: sourceProjects})
				return nil
			}
			routingResult := MetricRoutingResult{MetricName: n.Name}
			for _, projectStore := range sourceProjects {
				storeMatched := false
				for _, strategy := range matchedStrategies {
					for _, storeCond := range strategy.ProjectStoreConds {
						if storeCond.Match(projectStore.ProjectName, projectStore.MetricStore) {
							storeMatched = true
							break
						}
					}
					if storeMatched {
						routingResult.ProjectStores = append(routingResult.ProjectStores, projectStore)
						break
					}
				}
			}
			dstProjects = append(dstProjects, routingResult)
		}
		return nil
	})

	return dstProjects, nil
}