Binary operators

Binary operators combine two expressions. Between vectors, series are matched by label set — the vector matching keywords control exactly how.

Arithmetic operators

Combines two expressions — or an expression and a scalar — with +, -, *, /, %, or ^. Between two vectors, series with identical label sets are matched pairwise; unmatched series drop out of the result.

Syntax

<expr> <op> <expr>    where <op> is + - * / % ^
none

Parameters

Parameter Required Description

<expr>

Required

A vector expression or scalar literal on either side.

Example

Compute each Kloudfuse query service’s share of the group’s total goroutines, as a percentage.

  sum by (app_kubernetes_io_name) (go_goroutines{app_kubernetes_io_name=~".*query-service"})
/ on () group_left ()
  sum(go_goroutines{app_kubernetes_io_name=~".*query-service"})
* 100
Expected output
app_kubernetes_io_name Value

trace-query-service

3.342

events-query-service

3.296

logs-query-service

21.32

rum-query-service

1.438

query-service

70.6

Division by zero produces no result for that series rather than an error.

Standard precedence applies (^ highest, then * / %, then + -); parenthesize to override.

Comparison operators

Compares values with ==, !=, >, >=, <, or . Against a scalar the comparison filters: series that fail the test are dropped — exactly the shape an alert condition needs. The bool modifier keeps every series and returns 1 or 0 instead.

Syntax

<expr> > <scalar>    (also ==, !=, >=, <, <=; add bool for 0/1)
none

Parameters

Parameter Required Description

<scalar>

Required

The threshold, or another vector for pairwise comparison.

bool

Optional

Return 1/0 per series instead of filtering: > bool 100.

Example

Keep only the Kloudfuse services currently running more than 100 goroutines.

sum by (app_kubernetes_io_name) (go_goroutines{app_kubernetes_io_instance="kfuse"})
> 100
Expected output
app_kubernetes_io_name Value

zapper

2,566

kfuse-redis

584

az-service

1,009

logs-query-service

19,306

query-service

64,236

Alert rules use this form directly: the alert fires while the filtered result is non-empty.

Set operators (and, or, unless)

Combines two vectors as sets keyed by label values: and keeps left-side series with a match on the right, or returns the left plus unmatched right-side series, and unless keeps left-side series with no match on the right. Values come from the left side.

Syntax

<expr> and <expr>  |  <expr> or <expr>  |  <expr> unless <expr>
none

Parameters

Parameter Required Description

<expr>

Required

Vector expressions on both sides; matching is by identical label sets.

Example

List Kloudfuse services' goroutine counts, excluding services that are currently above 500 — unless subtracts the right-hand set.

  sum by (app_kubernetes_io_name) (go_goroutines{app_kubernetes_io_instance="kfuse"})
unless
  sum by (app_kubernetes_io_name) (go_goroutines{app_kubernetes_io_instance="kfuse"}) > 500
Expected output
app_kubernetes_io_name Value

recorder

14

archive-writer

103

analytics-service

11

<query> or vector(0) is the standard fallback idiom for guaranteeing a result row.

Vector matching (on, ignoring, group_left)

By default a binary operator matches series whose full label sets are identical. on (labels) restricts matching to the listed labels; ignoring (labels) matches on everything else. When one side has fewer series, group_left / group_right declare the many-to-one direction and can copy labels from the one side.

Syntax

<expr> <op> on (<labels>) [group_left [(<labels>)]] <expr>
none

Parameters

Parameter Required Description

on (<labels>)

Optional

Match series using only these labels.

ignoring (<labels>)

Optional

Match series using all labels except these.

group_left / group_right

Optional

Allow many-to-one matching; the side named by the modifier is the many side.

Example

Divide each service’s goroutine count by the all-service total: on () matches every left series to the single right-side series, and group_left () permits the many-to-one pairing.

  sum by (app_kubernetes_io_name) (go_goroutines{app_kubernetes_io_instance="kfuse"})
/ on () group_left ()
  sum(go_goroutines{app_kubernetes_io_instance="kfuse"})
Expected output
app_kubernetes_io_name Value

logs-transformer

0.00696586

recorder

3.63482e-05

trace-transformer

0.2496

hydration-service

0.00142796

ingress-nginx

0.01019

Without group_left, a many-to-one match is an error — PromQL makes the direction explicit on purpose.