(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.

