Reduce runs right after Values filtering, directly on the filtered raw points — not on resampled buckets. It combines them into the DPS result according to a scope (how many series are combined together) and a function (how values are combined). Leaving Reduce scope/function unset skips this step — the DPS instead returns its raw filtered series (optionally resampled, see Resample).

Why reduce before resample, not after: a reduce function like Last must return the actual last raw point’s value, matching what a Last value filter would return. If resample ran first, Last would instead return the average of the last resample bucket — a different, and surprising, number. Running Reduce on the raw filtered points keeps its result consistent with what filtering alone would produce.

Scope: One

One flattens every point from every matched series into a single list, then reduces once — the result is a single number for the whole DPS, regardless of how many series matched.

Example series:

agentA:metricA agentB:metricB
Points (10:00:00, 10)
(10:00:30, 20)
(10:01:00, 30)
(10:00:15, 5)
(10:00:45, 40)

Flattened together: [10, 20, 30, 5, 40] (5 points, series order preserved, not sorted by time).

Average Max Min Count First Last Plateau (tol 10)
Result (10+20+30+5+40)/5 = 21 40 5 5 earliest by ts (10:00:00, agentA) = 10 latest by ts (10:01:00, agentA) = 30 longest run within tol: (10:00:00, 10)
(10:00:15, 5)
(diff 5), average = 7.5

Plateau ties resolve to the earliest run. In the example above, (10:00:45, 40) and (10:01:00, 30) (diff 10) is also a valid 2-point run, but since it’s found later while scanning left to right and doesn’t exceed the current best length, the first run found wins.

If nothing matched at all, Count returns 0; every other function returns no value.

Resample has no effect on this scope. One always collapses to a single value straight from the raw filtered points — an optional Resample target points field would have nothing left to bucket by the time it would run. See Resample.

Scope: One per series

One per series reduces each matched series independently — one result value per series, no flattening across series.

Using the same two series as above, straight from the raw filtered points:

Reduce function agentA:metricA (10, 20, 30) agentB:metricB (5, 40)
Average 20 22.5
Max 30 40
Min 10 5
Count 3 2
First 10 (10:00:00) 5 (10:00:15)
Last 30 (10:01:00) 40 (10:00:45)
Plateau (tolerance 10) 20 (the whole series is one run: diffs 10 and 10, both <= tolerance) no row

A series with nothing to reduce is dropped, not shown as empty. agentB‘s Plateau above has only a 35-point jump (over tolerance) between its two points, so no run of 2+ exists and there’s no value to report — that series is simply left out of the result rather than appearing as a null/“-“ row. The same happens whenever Values filtering empties a series out entirely (see the full worked example). The one exception is Count, which legitimately returns 0 for an empty series — that row is always kept, since “zero matches” is itself meaningful information.

Resample has no effect on this scope either. Just like One, One per series collapses each series to a single value from its raw filtered points before any resample would run. See Resample.

Scope: One serie

One serie merges every matched series into a single series (not a single value) by grouping points across series by exact shared timestamp, and reducing each timestamp’s group independently. The result has one point per distinct timestamp seen across the input.

Example series (chosen so some timestamps are shared across series and one isn’t):

agentA:metricA agentB:metricB
Points (10:00:00, 10)
(10:00:30, 20)
(10:00:00, 5)
(10:00:30, 8)
(10:01:00, 9)

Grouped by timestamp: 10:00:00 = [10, 5], 10:00:30 = [20, 8], 10:01:00 = [9] (series are always visited in a stable agentName:metricPath order, so agentA’s value comes first whenever it has one).

Reduce function 10:00:00 10:00:30 10:01:00 Result (merged series)
Average 7.5 14 9 (10:00:00, 7.5)
(10:00:30, 14)
(10:01:00, 9)
Max 10 20 9 (10:00:00, 10)
(10:00:30, 20)
(10:01:00, 9)
Min 5 8 9 (10:00:00, 5)
(10:00:30, 8)
(10:01:00, 9)
Count 2 2 1 (10:00:00, 2)
(10:00:30, 2)
(10:01:00, 1)
how many series had a point at that timestamp
First 10 (agentA’s value) 20 (agentA’s value) 9 (only agentB has this timestamp) (10:00:00, 10)
(10:00:30, 20)
(10:01:00, 9)
Last 5 (agentB’s value) 8 (agentB’s value) 9 (10:00:00, 5)
(10:00:30, 8)
(10:01:00, 9)
Plateau not applicable evaluating throws an error — Plateau is not valid for One serie

First / Last here mean “which series wins”, not “which time”. Since every value being combined at a given row already shares the exact same timestamp, First picks the earliest series (in agentName:metricPath order) that has a point there, and Last picks the latest one — this is a different meaning from the same functions under One/One per series, where they instead pick the earliest/latest point in time.

Resample, if configured, applies afterward. Unlike One/One per series, One serie still produces a full time series (one point per timestamp) rather than a single scalar — so an optional Resample target points runs next, bucketing this merged series down. See Resample.

Function validity by scope

Function One One per series One serie
Average Yes Yes Yes
Max Yes Yes Yes
Min Yes Yes Yes
Count Yes Yes Yes
First Yes (earliest point in time) Yes (earliest point in time, per series) Yes (first series, per timestamp)
Last Yes (latest point in time) Yes (latest point in time, per series) Yes (last series, per timestamp)
Plateau Yes Yes No — rejected with an error