- Axiom Processing Language (APL) lets you query datasets with events, OTel logs, and OTel traces. For more information, see Introduction to APL.
- Metrics Processing Language (MPL) lets you query OTel metrics. This page explains how to use MPL.
Support for MPL (Metrics Processing Language) is currently in public preview. For more information, see Feature states.
Limitations
The current implementation of MPL comes with the following limitations:- You can only query one dataset in a query.
Concepts
- Dataset: A group of related metrics.
- Metric: Two-dimensional time series data with a metric name and a set of tags.
- Tag: Key-value pair identifying a series.
- Series: A unique combination of a metric and tag set.
Query structure
A typical MPL query contains the following:- Source: Defines dataset, metric, and optional time range
- Filter: Applies conditions to series via tags
- Transformation can be the following:
- Map: Maps the data to a new value.
- Align: Aggregates the data over time to align to a given time interval.
- Group: Aggregates the data over tag values.
- Bucket: A two-dimensional transformation that aggregates along both the time and tag dimensions.
otel-demo-metrics dataset’s go.memory.used metric one hour before the current time. It filters results to the frontend service and aggregates values over 5-minute time windows into their average.
Elements of queries
The following explains each element of an MPL query. To learn more about the language features of MPL, see Language features.Source
Specify the dataset, the metric, and optional time bounds. Syntax:- dataset: Name of the dataset.
- metric: Name of the metric.
- time range: Optional: The time range of the query. For more information, see Time ranges.
- alias: Optional: Renames the metric for later use.
Filter
Usewhere to filter series based on tag values.
Syntax:
<tag> <operator> <value>— a single tag filter<filter-expression> and <filter-expression>— logical AND of two expressions<filter-expression> or <filter-expression>— logical OR of two expressionsnot <filter-expression>— negation of an expression(<filter-expression>)— parentheses to control order of evaluation
- Equality:
==,!= - Comparisons:
<,<=,>,>=
Map
Usemap to transform individual values.
Available functions:
Examples:
filter:: functions
Usefilter:: functions to remove data points that don’t match a condition. Data points that don’t match are removed from the series entirely. Unlike where, which filters series based on tag values, filter:: operates on the numeric values of data points within a series.
Example:
is:: functions
Useis:: functions to test data points against a condition. Matching data points are set to 1.0 and non-matching data points are set to 0.0. The series retains all its data points.
Use is:: instead of filter:: when you need to preserve the shape of the time series, for example in SLO calculations where gaps in data would produce incorrect results.
Example:
Align
Usealign to aggregate over time windows. You can specify the time window and the aggregation function to apply.
Syntax:
5m or 1h. MPL does not support an automatic window size. If you omit align, Axiom returns raw data points without time-based aggregation.
Available aggregation functions:
Examples:
Group
Usegroup by to combine series by tags.
Syntax:
Examples:
Bucket
Usebucket to aggregate over time and tag dimensions simultaneously.
Syntax:
interpolate_cumulative_histogram works on histogram metrics using cumulative temporality. interpolate_delta_histogram works on histogram metrics using delta temporality.Other operations
Compute
Combine multiple subqueries into a single result. Each subquery can target the same metric or different metrics within the same dataset. This is how you express ratio calculations, deltas, and other cross-series comparisons in MPL.compute produces one named output series. If you need several independent series in one view, run separate queries.
Example:
The following example queries the same metric (
http.server.request.duration) twice with different filters to compute an error rate. Both subqueries target the same timeseries; the first applies a status code filter to isolate errors.
Language features
Data types
- Strings:
"string" - Integers:
42 - Floats:
3.14 - Booleans:
true,false - Regex:
#/.*metrics.*/
Identifier naming rules
Identifiers represent fields, metrics, datasets, function names, and other named entities in your query. Valid identifier names are case-sensitive and follow these rules:- Start with an ASCII letter.
- Followed by zero or more ASCII letters, digits, or underscores (
_).
Quote identifiers
Quote an identifier in your MPL query if any of the following is true:- The identifier name doesn’t match the rules for valid identifier names.
- The identifier name is identical to one of the reserved keywords of the MPL query language. For example,
byorwhere.
`). For example, `my-field`.
If none of the above is true, you don’t need to quote the identifier in your MPL query. For example, myfield. In this case, quoting the identifier name is optional.
Time ranges
Syntax:- Start time: Inclusive beginning of the time range.
- End time: Optional, exclusive end of the time range. If you don’t specify the end time, Axiom uses the current time.
...
Time can be defined in one of the following ways:
- Relative time. The time unit can be one of the following:
msfor milliseconds (will be rounded to seconds)sfor secondsmfor minuteshfor hoursdfor dayswfor weeksMfor monthsyfor years Examples:-1h,+5m
- Unix epoch timestamp in seconds. For example:
1723982394 - An RFC3339 timestamp. For example:
2025-03-01T13:00:00Z