I see; so this is just to workaround the limited functionality of Grafana 
alerting.

Then I guess you can just modify the rule you already have, to use (hour() 
+ minute()/60).

e.g. I tested this briefly:
(node_filesystem_avail_bytes < 10000000) and on () (hour() + minute()/60) 
>= 6.5 < 19

But it's pretty ugly.  For a long-running problem, the alert will be 
"resolved" at 19:00 and then re-activate at 06:30 the next day.

If you have a lot of this to do, then you could find out if Grafana can be 
plugged into an external system like OpsGenie or PagerDuty (I have no idea 
if it can; there is a separate discussion group for Grafana).  Or consider 
moving to Alertmanager.

On Sunday, 26 June 2022 at 00:10:40 UTC+1 [email protected] wrote:

> Hi Brian, and thank you very much for your detailed answer... which I have 
> read very carefully several times.
>
> Maybe I forgot a detail in my question, that is: I'm using Grafana!
> Your concepts also related to the muting of the reports are clear to me 
> and absolutely correct. These are not related to the alerts in grafana, 
> unfortunately, but to the communication points where the recipients of the 
> messages are defined. 
>
> So to simplify, it would be... in this particular case easier to fix it 
> directly in the prom-QL code.
> I would simply like to know how I can also include the 30 minutes only 
> from 8:00 AM so that it becomes 8:30 AM... I don't know if exists the right 
> syntax in prom-QL
>
> Thanks again and have a nice day.
> ALEN
>
> Il giorno sabato 25 giugno 2022 alle 11:21:51 UTC+2 Brian Candler ha 
> scritto:
>
>> Firstly, given that you have put "or vector(0)", I think you may 
>> misunderstand how alerting works in Prometheus.
>>
>> PromQL expressions return vectors - a set of 0 or more values. In an 
>> alerting expression, the alert is treated as firing if the vector is 
>> non-empty - i.e. it contains 1 or more values, regardless of what those 
>> values actually are.  Therefore, the expression vector(0) gives an alert 
>> which fires all of the time, which isn't very useful.
>>
>> Next, PromQL comparison operators are filters, not booleans.  Suppose you 
>> have the following metrics in your database:
>>
>> node_disk_space{instance="a"} 100
>> node_disk_space{instance="b"} 200
>> node_disk_space{instance="c"} 300
>>
>> The PromQL expression "node_disk_space > 150" returns a vector of 2 
>> values:
>>
>> node_disk_space{instance="b"} 200
>> node_disk_space{instance="c"} 300
>>
>> That is, the expression "node_disk_space" returns a vector of all metrics 
>> with that metric name, and "node_disk_space > 150" filters it down to just 
>> those metrics whose value is over 150.  It does not return a "true" or 
>> "false" value (or values).
>>
>> Similarly, "and/or/unless" don't work like booleans either.  The 
>> expression "node_disk_space > 150 or vector(0)" will return the following:
>>
>> node_disk_space{instance="b"} 200
>> node_disk_space{instance="c"} 300
>> {} 0
>>
>> In this case you get a vector of 3 values.  The explanation of how "or" 
>> works is here:
>>
>> https://prometheus.io/docs/prometheus/latest/querying/operators/#logical-set-binary-operators
>> It's another vector operator, which matches the label sets of the LHS and 
>> RHS.
>>
>> Now, let me go back to your original problem about time periods.  I think 
>> you're approach this the wrong way.
>>
>> I believe the business rule amounts to this:  "I only want to receive 
>> alerts on this condition if the time falls between 8:30am and 9pm".  It's 
>> not that the problem doesn't happen outside business hours; it's that the 
>> problem isn't important enough to send a notification outside of business 
>> hours.
>>
>> Therefore, the right way to handle this is with time periods within 
>> alertmanager, to control when the alerts are sent - not within the PromQL 
>> expression which determines whether there is a problem or not.
>>
>> The way you do this is with time intervals in alertmanager routing trees. 
>> See:
>> https://prometheus.io/docs/alerting/latest/configuration/#route
>> https://prometheus.io/docs/alerting/latest/configuration/#time_interval
>>
>> Not only is this far easier to implement than attempting to do it in 
>> PromQL, it's also more flexible - for example you can have the same alert 
>> (from the same PromQL alerting rule) sent to different groups depending on 
>> the time of day.
>>
>> Note that you can add labels to your alert in the alerting rule to 
>> categorise the alert, and you can match on those labels in your alert 
>> routing tree.  This gives you further flexibility to categorise your alerts 
>> in whatever way is useful to you.
>>
>> On Friday, 24 June 2022 at 23:20:42 UTC+1 [email protected] wrote:
>>
>>> Hi,
>>> I'm try to write this simple code for Prometheus
>>> but I don't understand how can I include also minutes... with a valide 
>>> range of hour.
>>>
>>> Alert could firing only between: *08:30 AM to all 09:00 P.M*.
>>>
>>> Here below the hours are in CET (+2 from Italy where I'm)
>>>
>>> (count by (exported_instance, counter_instance) 
>>> (database_status{job="aaaa", exported_instance="myserver", 
>>> status!="ONLINE"})
>>> and on() hour() >= 6 <= 19
>>> *......... miss minute .......*
>>> ) or vector(0)
>>>
>>> Thanks Alen
>>>
>>

-- 
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/d1038641-be85-4398-ad5d-5f8ad018b5c6n%40googlegroups.com.

Reply via email to