in sharedlibraries/configurablemetrics/configurablemetrics.go [90:131]
func CollectMetricsFromFile(ctx context.Context, reader FileReader, path string, metrics []*cmpb.EvalMetric) map[string]string {
labels := BuildMetricMap(metrics)
if len(metrics) == 0 {
return labels
}
file, err := reader(path)
if err != nil {
log.CtxLogger(ctx).Warnw("Could not read the file", "path", path, "error", err)
return labels
}
defer file.Close()
metricsByLabel := make(map[string]*cmpb.EvalMetric, len(metrics))
for _, m := range metrics {
metricsByLabel[m.GetMetricInfo().GetLabel()] = m
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
if len(metricsByLabel) == 0 {
break
}
line := strings.TrimSpace(scanner.Text())
for l, m := range metricsByLabel {
v, ok := Evaluate(ctx, m, Output{StdOut: line})
labels[l] = v
// For a result that evaluates as true, do not attempt to collect this metric again.
// This assumes that at most one metric will be collected per line scanned.
if ok {
delete(metricsByLabel, l)
break
}
}
}
if err := scanner.Err(); err != nil {
log.CtxLogger(ctx).Warnw("Could not read the file", "path", path, "error", err)
}
return labels
}