Dimension Exploration
Dimension exploration gives users the ability to create alerts for every value of a certain dimension or combination of dimensions. This is similar to running a for loop on different sets of values on the same detection workflow.Problem description
Let’s take a look at the page views example.pageviews
is a metric which computes the views aggregated by sum over a given time period. You can create an alert that fires if pageviews
drops by 5% using a single alert.
However, what if the user wants to be alerted for a pageviews
drop of 5% by country? The user would have to create a separate alert for each country.

country = { ‘US’, ‘IN’, ‘FR’ }
.
Approach
The approach here leverages the flexibility of the detection pipeline to be able to model a ‘loop’ within a workflow.Detection pipeline DAG
The detection pipeline supports nodes that allow multiple named input and output streams. This section provides a simplified directed acyclic graph (DAG).
- Enumerator Node
- Fork Join Node
- Combiner Node

Enumerator node
An enumerator node outputs a set of key-value pairs. These key-value pairs will be used to determine the template variables used for running the ‘loop’.Output schema
Dynamic dimensions using dataframe enumerator (Beta)
ThirdEye supports enumerating an alert based on the results of a query. The query can be any valid SQL query that returns a dataframe. The dataframe is then used to enumerate the alert. Here is an example alert payload.enumeratorQuery
parameter takes a SQL query that returns a dataframe.
Manual listing using default enumerator
The default enumerator node could be configured to emit a series of values configured as-is. This allows the user to pass a set of template properties that can be fed into the child pipeline. In this example, different values of thequeryFilter
property will be fed into the pipeline for each run.
enumerationItems
is a template variable that can be fed in using a JSON like this
Combiner node
The combiner node accepts the results of a fork operator and combines all the results. A combiner can have different types. Initial approach would be to have a combiner that combines anomalies from each of the enumerations and tags them accordingly. Example: The expectation here is to consume a list of outputs from each DAG and emit a single consolidated output. Note that each node can have multiple outputs. It is essentially flattening a set of lists into a single list.Fork join node
A fork join node follows a fork + join model which allows the user to input a set of enumerations. The fork join node forks the pipeline to execute a sub workflow DAG for each of the enumerations.Operation
The Fork Join Node takes 3 parameters:- Enumerator: This is an enumerator node that will be used to get all the enumerations that need to be executed
- Root: This is the root node of the sub DAG that the fork join is supposed to execute feeding in the enumerations
- Combiner: This is the combiner node that will consume the list of outputs from each enumeration execution.