Introduction
Themake-series
operator transforms event data into array-based time series. Instead of producing one row per time bucket, make-series
encodes the values and corresponding timestamps into arrays stored in table fields. This makes it possible to apply series_*
functions for advanced manipulations such as moving averages, smoothing, anomaly detection, or other time-series computations.
You find this operator useful when you want to:
- Turn event data into array-encoded time series for further analysis.
- Apply
series_*
functions (for example,series_fir
,series_stats
) to aggregated data. - Postprocess and then expand arrays back into rows with
mv-expand
for visualization or downstream queries.
summarize
, which produces row-based aggregations, make-series
is designed specifically for creating and manipulating array-based time series.
For users of other query languages
If you come from other query languages, this section explains how to adjust your existing queries to achieve the same results in APL.Splunk SPL users
Splunk SPL users
In Splunk SPL, the
timechart
command creates row-based time series, with one row per time bucket. In APL, the make-series
operator instead encodes the series into arrays, which you can later manipulate or expand. This is a key difference from SPL’s row-based approach.ANSI SQL users
ANSI SQL users
In ANSI SQL, you typically use
GROUP BY
with a generated series or calendar table to create row-based time buckets. In APL, make-series
creates arrays of values and timestamps in a single row. This lets you perform array-based computations on the time series before optionally expanding back into rows.Usage
Syntax
Parameters
Parameter | Description |
---|---|
Aggregation | One or more aggregation functions (for example, avg() , count() , sum() ) applied to each time bin, producing arrays of values. |
default | A value to use when no records exist in a time bin. |
TimeField | The field containing timestamps used for binning. |
Range | An optional range expression specifying the start and end of the series (for example, from ago(1h) to now() ). |
StepSize | The size of each time bin (for example, 1m , 5m , 1h ). |
GroupingField | Optional fields to split the series by, producing parallel arrays for each group. |
Returns
The operator returns a table where each aggregation produces an array of values aligned with an array of time bins. Each row represents a group (if specified), with arrays that encode the entire time series.Use case examples
- Log analysis
- OpenTelemetry traces
- Security logs
You want to create an array-based time series of request counts, then compute a rolling average using a Run in PlaygroundOutput
The query turns request counts into arrays, applies a smoothing function, and then expands the arrays back into rows for analysis.
series_*
function, and finally expand back into rows for visualization.Query_time | count_ | moving_avg_count |
---|---|---|
2025-09-29T10:00:00 | 120 | 118 |
2025-09-29T10:05:00 | 130 | 122 |
2025-09-29T10:10:00 | 110 | 121 |
List of related operators
- extend: Creates new calculated fields, often as preparation before
make-series
. Useextend
when you want to preprocess data for time series analysis. - mv-expand: Expands arrays into multiple rows. Use
mv-expand
to work with the arrays returned bymake-series
. - summarize: Aggregates rows into groups but does not generate continuous time bins. Use
summarize
when you want flexible grouping without forcing evenly spaced intervals. - top: Returns the top rows by a specified expression, not time series. Use
top
when you want to focus on the most significant values instead of trends over time.