>
> Another way to improve this. I think what we could do is a query
> optimization that automatically detects identical expressions and only
> evaluates them once. This would make it transparent to the user without
> having to change the language.
>

I like this idea!

How wide is `$aqi_interval here?
>

It can vary between 10s and 24h. Most of the time I use 24h. The query gets
slower the larger the interval is.

I'm guessing this is one of a few drop-down options, since it's not one of
> the dynamic values like $__interval.
>

Correct.

If you pre-recorded just that, it would be much faster to query.
>

Good point - I had considered doing this actually. I had a slight aversion
to pre-recording because I would need to pre-record the averages for each
$aqi_interval I was interested in looking at. Or else pre-record the longer
intervals and fallback to unrecorded calculations for the shorter
intervals. But if there is currently no better solution, then I may do this.

Thanks!

On Wed, Sep 20, 2023 at 12:57 AM Ben Kochie <[email protected]> wrote:

> One more question:
>
> How wide is `$aqi_interval here? I'm guessing this is one of a few
> drop-down options, since it's not one of the dynamic values like
> $__interval.
>
> If this value is hours or days, it's likely one of the main sources of
> slowness, since it needs to load a lot of samples. If you pre-recorded just
> that, it would be much faster to query.
>
> - record: instance:ambient_pm25_env:avg1d
>   expr: avg_over_time(ambient_pm25_env[1d])
>
> Then your query would be
> instance:ambient_pm25_env:avg$aqi_interval{instance=~"$room.*"}. This
> would be an instant vector, and much faster. You could also do a relabel at
> the same time to extract the room label without the full hostname:port
> number. Which I'm guessing is why you're doing the regexp.
>
> On Wed, Sep 20, 2023 at 5:27 AM David Leibovic <[email protected]>
> wrote:
>
>> Btw, here's the new promql I ended up with, in case it's helpful to
>> anyone else:
>>
>> ((50 - 0) / (12 - 0) * ((avg_over_time(ambient_pm25_env{instance=~
>> "$room.*"}[$aqi_interval]) <= 12) - 0) + 0) or
>> ((100 - 51) / (35.4 - 12.1) * ((avg_over_time(ambient_pm25_env{instance=~
>> "$room.*"}[$aqi_interval]) <= 35.4) - 12.1) + 51) or
>> ((150 - 101) / (55.4 - 35.5) * ((avg_over_time(ambient_pm25_env{instance
>> =~"$room.*"}[$aqi_interval]) <= 55.4) - 35.5) + 101) or
>> ((200 - 151) / (150.4 - 55.5) * ((avg_over_time(ambient_pm25_env{instance
>> =~"$room.*"}[$aqi_interval]) <= 150.4) - 55.5) + 151) or
>> ((300 - 201) / (250.4 - 150.5) * ((avg_over_time(ambient_pm25_env{
>> instance=~"$room.*"}[$aqi_interval]) <= 250.4) - 150.5) + 201) or
>> ((400 - 301) / (350.4 - 250.5) * ((avg_over_time(ambient_pm25_env{
>> instance=~"$room.*"}[$aqi_interval]) <= 350.4) - 250.5) + 301) or
>> ((500 - 401) / (500.4 - 350.5) * ((avg_over_time(ambient_pm25_env{
>> instance=~"$room.*"}[$aqi_interval]) <= 500.4) - 350.5) + 401) or
>> clamp_max(avg_over_time(ambient_pm25_env{instance=~"$room.*"}[
>> $aqi_interval]), 600)
>>
>> On Tuesday, September 19, 2023 at 11:24:58 PM UTC-4 David Leibovic wrote:
>>
>>> Thanks very much to you both for the suggestions! Changing the regexp
>>> matching to exact string matching didn't help noticeably in my case,
>>> perhaps because I have less than 5 instances over which it has to do a
>>> regexp match. But removing the unnecessary lower bounds checks from my
>>> inequality checks reduced loading time by about 3/5.
>>>
>>> It's too bad that prometheus doesn't support something like variables
>>> that could be repeatedly referenced in promql - that would probably speed
>>> things up even more.
>>>
>>> On Monday, September 18, 2023 at 3:23:43 AM UTC-4 Brian Candler wrote:
>>>
>>>> One possibility is to use a recording rule for the expensive repeated
>>>> query.
>>>>
>>>> If I
>>>> rewrite avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval])
>>>> to X, I get:
>>>>
>>>> ((50 - 0) / (12 - 0) * ((X <= 12) - 0) + 0) or
>>>> ((100 - 51) / (35.4 - 12.1) * ((X > 12 and X <= 35.4) - 12.1) + 51) or
>>>> ((150 - 101) / (55.4 - 35.5) * ((X > 35.4 and X <= 55.4) - 35.5) + 101)
>>>> or
>>>> ((200 - 151) / (150.4 - 55.5) * ((X > 55.4 and X <= 150.4) - 55.5) +
>>>> 151) or
>>>> ((300 - 201) / (250.4 - 150.5) * ((X > 150.4 and X <= 250.4) - 150.5) +
>>>> 201) or
>>>> ((400 - 301) / (350.4 - 250.5) * ((X > 250.4 and X <= 350.4) - 250.5) +
>>>> 301) or
>>>> ((500 - 401) / (500.4 - 350.5) * ((X > 350.4 and X <= 500.4) - 350.5) +
>>>> 401) or
>>>> clamp_max(X, 600)
>>>>
>>>> I guess you're trying to apply different scaling for different ranges
>>>> of X:
>>>> - if X is between 0 and 12 (or negative) then rescale to 0 to 50
>>>> - if X is between 12 and 35.4 then rescale to 50(?) to 100
>>>> - if X is between 35.4 and 55.4 then rescale to 100(?) to 150
>>>> etc (except there seem to be some small discontinuities at the
>>>> boundaries, e.g. 12 versus 12.1, 50 versus 51)
>>>>
>>>> "A or B" will suppress elements in the B vector where the A vector has
>>>> a value (i.e. with a matching label set). That means it's unnecessary to
>>>> test the lower bounds, and I think your expression could simplify to
>>>> something like this:
>>>>
>>>> (X <= 12) * k1 + o1 or
>>>> (X <= 35.4) * k2 + o2 or
>>>> (X <= 55.4) * k3 + o3 or
>>>> (X <= 150.4) * k4  + o4 or
>>>> (X <= 250.4) * k5 + o5 or
>>>> (X <= 350.4) * k6 + o6 or
>>>> (X <= 500.4) * k7 + o7 or
>>>> clamp_max(X, 600)
>>>>
>>>> That would roughly halve the number of the subexpressions X.
>>>>
>>>> On Monday, 18 September 2023 at 07:01:50 UTC+1 Ben Kochie wrote:
>>>>
>>>>> One thing you can do to speed things up is to eliminate the `=~` in
>>>>> your query. Using regexp matching means it has to do a string search over
>>>>> every instance in your Prometheus for each metric. Using exact matching
>>>>> (`=`) will speed things up a lot. Although you won't be able to do 
>>>>> multiple
>>>>> matching if you want that in your dashboard variables.
>>>>>
>>>>> On Mon, Sep 18, 2023 at 7:58 AM David Leibovic <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> Hi there, I'm trying to optimize a slow query of this form:
>>>>>>
>>>>>> (1 * avg_over_time(foo{instance=~"$i"}[$interval]) <= 10) or
>>>>>> (2 * avg_over_time(foo{instance=~"$i"}[$interval]) <= 20) or
>>>>>> (3 * avg_over_time(foo{instance=~"$i"}[$interval]) <= 30) or
>>>>>> (10 * avg_over_time(foo{instance=~"$i"}[$interval]))
>>>>>>
>>>>>> I suspect it's slow because of the many duplicate calls to
>>>>>> avg_over_time(foo{instance=~"$i"}[$interval])
>>>>>>
>>>>>> Is there some way to only call the avg_over_time function once and
>>>>>> re-use the results subsequently? I'm using Prometheus in conjunction with
>>>>>> Grafana, in case it's relevant.
>>>>>>
>>>>>> The full query I'm trying to optimize is much more complicated, but I
>>>>>> figured the above would be enough to understand the problem. But in case
>>>>>> it's helpful, here is the full query I am trying to optimize (it's an Air
>>>>>> Quality Index computation):
>>>>>>
>>>>>> ((50 - 0) / (12 - 0) *
>>>>>> ((avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) <=
>>>>>> 12) - 0) + 0) or
>>>>>> ((100 - 51) / (35.4 - 12.1) *
>>>>>> ((avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) > 
>>>>>> 12
>>>>>> and avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) 
>>>>>> <=
>>>>>> 35.4) - 12.1) + 51) or
>>>>>> ((150 - 101) / (55.4 - 35.5) *
>>>>>> ((avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) >
>>>>>> 35.4 and
>>>>>> avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) <=
>>>>>> 55.4) - 35.5) + 101) or
>>>>>> ((200 - 151) / (150.4 - 55.5) *
>>>>>> ((avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) >
>>>>>> 55.4 and
>>>>>> avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) <=
>>>>>> 150.4) - 55.5) + 151) or
>>>>>> ((300 - 201) / (250.4 - 150.5) *
>>>>>> ((avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) >
>>>>>> 150.4 and
>>>>>> avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) <=
>>>>>> 250.4) - 150.5) + 201) or
>>>>>> ((400 - 301) / (350.4 - 250.5) *
>>>>>> ((avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) >
>>>>>> 250.4 and
>>>>>> avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) <=
>>>>>> 350.4) - 250.5) + 301) or
>>>>>> ((500 - 401) / (500.4 - 350.5) *
>>>>>> ((avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) >
>>>>>> 350.4 and
>>>>>> avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]) <=
>>>>>> 500.4) - 350.5) + 401) or
>>>>>> clamp_max(avg_over_time(ambient_pm25_env{instance=~"$room.*"}[$aqi_interval]),
>>>>>> 600)
>>>>>>
>>>>>> Thanks for any help you can provide!
>>>>>>
>>>>>> --
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "Prometheus Users" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>> send an email to [email protected].
>>>>>> To view this discussion on the web visit
>>>>>> https://groups.google.com/d/msgid/prometheus-users/664689b3-9f45-4b05-9438-4225e2dce773n%40googlegroups.com
>>>>>> <https://groups.google.com/d/msgid/prometheus-users/664689b3-9f45-4b05-9438-4225e2dce773n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>> --
>> You received this message because you are subscribed to the Google Groups
>> "Prometheus Users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/prometheus-users/46b7e4ee-fb4e-4f6c-9b65-5955bc93b7b2n%40googlegroups.com
>> <https://groups.google.com/d/msgid/prometheus-users/46b7e4ee-fb4e-4f6c-9b65-5955bc93b7b2n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Prometheus Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/prometheus-users/CAHnxub%2B1kV8x%2Bc%2BZhz0hPJAWFqTbVJDd%3D5vQicinphTaJAuE1w%40mail.gmail.com.

Reply via email to