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
}