Ending Support for Non-Accelerable OPAL in Monitors

,

In the past, it was possible to create monitors using non-accelerable OPAL — queries that cannot take advantage of Observe’s performance optimizations.

We are making some adjustments to non-accelerable OPAL support:

  • you can only use non-accelerable in monitors with a custom schedule.

  • for normal (continuous) monitors, only accelerable opal is allowed.

Why Non-Accelerable OPAL Is a Problem in Monitors

Monitors in Observe run continuously — they evaluate the query repeatedly as new data arrives. For this to work reliably, queries must be deterministic and incremental.

Non-accelerable OPAL breaks this rule because its results depend on the query window — the time range the system happens to evaluate when the monitor runs.

This can lead to issues such as:

  • Alerts that appear in the preview but never actually fire.

  • Alerts firing on unexpected data points.

  • Slower performance.

Example 1 — timechart without a frame

When you write timechart count(), the number and boundaries of time buckets are determined dynamically based on the query window.

As the window shifts over time, these bucket boundaries can move — meaning the same data might fall into different buckets on each run, producing inconsistent results.

:white_check_mark: Fix: Add an explicit bucket interval, e.g.

timechart 5m, count()

This ensures consistent 5-minute buckets on every evaluation.


Example 2 — Using query_end_time() or now()

Functions like query_end_time() or now() change every time the monitor runs.

One run may include a few extra seconds of data, while another may miss them — leading to inconsistent alerting.

:white_check_mark: Fix: Convert the monitor into a scheduled monitor.

Continuous monitors run as soon as data arrives (non-deterministic timing), while scheduled monitors run at predictable, fixed times.

To create a scheduled monitor, click Add custom schedule in the monitor editor.

If you don’t see this option, contact Observe Support to enable it.

Common Patterns That Make OPAL Non-Accelerable — and How to Fix Them

Problematic Pattern Fix
timechart count() Specify a frame: timechart 5m, count()
timechart, options(empty_bins:true), count() Remove empty_bins in option and specify a frame: timechart 5m, count()
make_col a:window(avg()) Specify a frame: make_col a:window(avg(), frame(back:10m))
fill 0 Use fill 0, frame(back:10m)
Using query_start_time(), query_end_time(), or now() Convert to a scheduled monitor, which supports function related to query time or wall-clock time.
Using table-transforming verbs like statsby or make_table Re-write the logic to preserve time-series structure, e.g. replace statsby with timechart, or use a scheduled monitor instead

If you’re unsure how to make your OPAL accelerable, check the OPAL documentation or contact Observe Support for help.

1 Like