(dim charttpl.Dimension, visibleMetrics map[string]struct{})
| 193 | } |
| 194 | |
| 195 | func compileDimension(dim charttpl.Dimension, visibleMetrics map[string]struct{}) (compiledDimension, error) { |
| 196 | compiledSel, err := metrixselector.ParseCompiled(dim.Selector) |
| 197 | if err != nil { |
| 198 | return compiledDimension{}, fmt.Errorf("selector: %w", err) |
| 199 | } |
| 200 | |
| 201 | meta := compiledSel.Meta() |
| 202 | if len(visibleMetrics) > 0 { |
| 203 | for _, metricName := range meta.MetricNames { |
| 204 | if _, ok := visibleMetrics[metricName]; !ok { |
| 205 | return compiledDimension{}, fmt.Errorf("selector: metric %q is not visible in current group scope", metricName) |
| 206 | } |
| 207 | } |
| 208 | } |
| 209 | |
| 210 | name := strings.TrimSpace(dim.Name) |
| 211 | nameFromLabel := strings.TrimSpace(dim.NameFromLabel) |
| 212 | // If dimension naming is omitted, runtime planner resolves dynamic key source |
| 213 | // from series origin metadata (metrix.Reader.SeriesMeta on flattened series). |
| 214 | inferFromSeriesMeta := name == "" && nameFromLabel == "" |
| 215 | if inferFromSeriesMeta && !supportsRuntimeInferredDimension(meta) { |
| 216 | return compiledDimension{}, fmt.Errorf( |
| 217 | "name inference requires inferable selector (histogram bucket/summary quantile/stateset-like metric); set name or name_from_label", |
| 218 | ) |
| 219 | } |
| 220 | |
| 221 | nameTemplate := program.Template{} |
| 222 | dynamicLabelKeys := make([]string, 0, 1) |
| 223 | if name != "" { |
| 224 | nameTemplate, err = parseTemplate(name) |
| 225 | if err != nil { |
| 226 | return compiledDimension{}, fmt.Errorf("name: %w", err) |
| 227 | } |
| 228 | } else if nameFromLabel != "" { |
| 229 | dynamicLabelKeys = append(dynamicLabelKeys, nameFromLabel) |
| 230 | } |
| 231 | |
| 232 | metricKinds := metricKindsFromNames(meta.MetricNames) |
| 233 | options := compileDimensionOptions(dim.Options) |
| 234 | |
| 235 | return compiledDimension{ |
| 236 | dimension: program.Dimension{ |
| 237 | Selector: program.SelectorBinding{ |
| 238 | Expression: strings.TrimSpace(dim.Selector), |
| 239 | Matcher: selectorMatcher{compiled: compiledSel}, |
| 240 | MetricNames: append([]string(nil), meta.MetricNames...), |
| 241 | ConstrainedLabelKeys: append([]string(nil), meta.ConstrainedLabelKeys...), |
| 242 | }, |
| 243 | NameTemplate: nameTemplate, |
| 244 | NameFromLabel: nameFromLabel, |
| 245 | InferNameFromSeriesMeta: inferFromSeriesMeta, |
| 246 | Hidden: options.hidden, |
| 247 | Multiplier: options.multiplier, |
| 248 | Divisor: options.divisor, |
| 249 | Float: options.float, |
| 250 | Dynamic: inferFromSeriesMeta || nameFromLabel != "", |
| 251 | }, |
| 252 | selectorKeys: append([]string(nil), meta.ConstrainedLabelKeys...), |
no test coverage detected
searching dependent graphs…