blob: bb224c7868288aea915a155dcae0f9040c293b9d [file] [log] [blame]
// Package prom has functions for Prometheus.
package prom
import (
"regexp"
"strings"
)
var (
// atComparison is used to chop up expressions at a comparison. Note that we
// require a trailing space, which avoids matching the equals sign inside
// a label, such as {app="foo"}.
atComparison = regexp.MustCompile(`[<>=!]+\s`)
)
// EquationFromExpr returns the equation from an expression. For example:
//
// "liveness_ci_pubsub_receive_s > 60 * 60 * 24 * 2"
//
// Will return:
//
// "liveness_ci_pubsub_receive_s"
//
// Note that for this to work the equation needs to be on the right hand side fo
// the expression, and there must be spaces on either side of any comparison
// operator.
//
// If an equation can't be extracted from the expression then false is returned.
func EquationFromExpr(expr string) (string, bool) {
if expr == "" {
return "", false
}
// Ignore computed metrics, which by convention have a ":".
if strings.Contains(expr, ":") {
return "", true
}
parts := atComparison.Split(expr, -1)
// Ignore multipart relations, e.g. "a < b and b > c".
if len(parts) != 2 {
return "", true
}
ret := strings.TrimSpace(parts[0])
if ret == "" {
return "", false
}
return ret, false
}