(foo==1)[24h:1m]
creates a range vector, which you then need to process further. If you run 
a function over it to count the values in the range you will get an instant 
vector, which as I showed in my original post makes this:
*count_over_time((foo==1)[24h:1m])*
That is valid (I've tested it with 'up' instead of 'foo'), and that is the 
solution I propose.

foo[24h] == 1
is not currently valid prometheus syntax, as I already said. There are some 
use cases where it would be nice *if* prometheus implemented this - but it 
doesn't.

On Thursday, 23 March 2023 at 03:34:06 UTC BHARATH KUMAR wrote:

> (foo==1)[24h:1m]. I tried this query. But I am getting an error message " 
> *bad_data: 
> invalid expression type "range vector" for range query, must be Scalar or 
> instant Vector* ".
>
> foo[24h] == 1. Error message: "* bad_data: 1:1: parse error: binary 
> expression must contain only scalar and instant vector types* "
> I am scraping at 1-minute intervals. 
>
> *Brian: I also note that you're only sampling periodically whether 
> something is in state 0, 1, or 2: you don't really know what happened in 
> between those samples, so you're never going to get a truly accurate value 
> for how long it was in each state. For example, it could flip from 1 to 2 
> and back to 1 between scrapes.*
>
> *Me: It's fine. *Even if it flips from 1 to 2 and back to 1 between 
> scrapes. I only bother about the output samples. For example last 24 hours 
> I will have 1440 samples. I want to find a number of 1's. It's fine even 
> though it flips in between scrapes.
>
> On Wednesday, 22 March 2023 at 13:36:23 UTC+5:30 Brian Candler wrote:
>
>> It's not easy to do exactly.
>>
>> To get a rough answer, you can do a subquery 
>> <https://prometheus.io/docs/prometheus/latest/querying/basics/#subquery>:  
>> (foo == 1)[24h:1m] will resample the timeseries at 1 minute intervals, then 
>> you can wrap that with count_over_time, giving:
>>     count_over_time((foo == 1)[24h:1m])
>>
>> But if you weren't scraping at exactly 1 minute intervals, the count may 
>> not be accurate. Also if there are missed samples, the value of foo at time 
>> T will look back for the previous value (up to 5 minutes by default), which 
>> means in that situation some samples may be double-counted (in effect, 
>> assuming the metric value remained constant over that time, when you don't 
>> actually know what value it had).
>>
>> The only way I know to get an exact answer is to send the range vector 
>> query "foo[24h]" to the *instant* query endpoint 
>> <https://prometheus.io/docs/prometheus/latest/querying/api/#instant-queries>,
>>  
>> then filter and count the samples client-side.  A range vector like that 
>> gives the raw values with their raw timestamps as stored in the TSDB.
>>
>> For this use case it would be nice if Prometheus were to allow certain 
>> operators to work directly on range vectors, so you could write
>>     foo[24h] == 1
>> But that would add quite a lot of complexity into the semantics of the 
>> query language, which already has to consider argument combinations for 
>> (scalar, scalar), (scalar, instant vector) and (instant vector, instant 
>> vector).
>>
>> On Wednesday, 22 March 2023 at 05:19:01 UTC BHARATH KUMAR wrote:
>>
>>> Hello All,
>>>
>>> I have a Prometheus metric that will give output as 0 or 1 or 2. It can 
>>> be anything(0 or 1 or 2). Could you tell me the number of 1's that occurred 
>>> in the last 24 hours?
>>>
>>> I tried with count_over_time. but I am getting errors. I tried 
>>> sum_over_time, but it is not working for a few test cases.
>>>
>>> Any lead?
>>>
>>> I really appreciate any help you can provide.
>>>
>>> Thanks & regards,
>>> Bharath Kumar
>>>
>>

-- 
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/13c10987-3f91-4770-ba74-f839550c898an%40googlegroups.com.

Reply via email to