首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PromQL if/else like表达式

PromQL if/else like表达式
EN

Stack Overflow用户
提问于 2020-10-05 16:21:57
回答 2查看 5.5K关注 0票数 2

我正在尝试使用 Gauss's Easter algorithm在PromQL中计算复活节星期天(我需要忽略一些公共假日的警报规则)。

我可以计算日期,但是月份有问题,因为我需要一个if/else表达式。如果东部时间在4月,我的记录规则easter_sunday_in_april返回1,如果时间在3月,则返回0。

(如何)我可以在PromQL中表达以下内容?

代码语言:javascript
运行
复制
if(easter_sunday_in_april > 0)
    return 4
else
    return 3

为了完整起见,我在这里附加了我的录制规则:

代码语言:javascript
运行
复制
- record: a
    expr: year(europe_time) % 4

  - record: b
    expr: year(europe_time) % 7

  - record: c
    expr: year(europe_time) % 19

  - record: d
    expr: (19*c + 24) % 30

  - record: e
    expr: (2*a + 4*b + 6*d + 5) % 7

  - record: f
    expr: floor((c + 11*d + 22*e)/451)

  - record: easter_sunday_day_of_month_temp
    expr: 22 + d +e - (7*f)


  - record: easter_sunday_day_of_month_in_april
    expr: easter_sunday_day_of_month_temp > bool 31

  - record: easter_sunday_day_of_month
    expr: easter_sunday_day_of_month_temp % 31
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-05 16:30:44

我想我找到了一个方法:

代码语言:javascript
运行
复制
((easter_sunday_day_of_month_temp > bool 31 ) +3)

easter_sunday_day_of_month_temp返回复活节周日月份的“原始”日期(1- 31 :三月的一天,四月的> 31天,我们必须计算模数31才能得到四月的日期)。

因此,如果easter_sunday_day_of_month_temp > bool 31为真,则返回1,然后我将3加到4(4月),否则,我将返回3作为3月。

编辑:请证明我错了,或者给我一个更好的解决方案:-)否则我会在两天内接受我的方案。

票数 2
EN

Stack Overflow用户

发布于 2020-10-23 23:49:17

来自Julien Pivotto的PromCon talk:https://promcon.io/2019-munich/talks/improved-alerting-with-prometheus-and-alertmanager/

代码语言:javascript
运行
复制
groups:
- name: Easter Meeus/Jones/Butcher Algorithm
interval: 60s
rules:
- record: easter_y
expr: year(belgium_localtime)
- record: easter_a
expr: easter_y % 19
- record: easter_b
expr: floor(easter_y / 100)
- record: easter_c
expr: easter_y % 100
- record: easter_d
expr: floor(easter_b / 4)
- record: easter_e
expr: easter_b % 4
- record: easter_f
expr: floor((easter_b +8 ) / 25)
- record: easter_g
expr: floor((easter_b - easter_f + 1 ) / 3)
- record: easter_h
expr: (19*easter_a + easter_b - easter_d - easter_g + 15 ) % 30
- record: easter_i
expr: floor(easter_c/4)
- record: easter_k
expr: easter_c%4
- record: easter_l
expr: (32 + 2*easter_e + 2*easter_i - easter_h - easter_k) % 7
- record: easter_m
expr: floor((easter_a + 11*easter_h + 22*easter_l) / 451)
- record: easter_month
expr: floor((easter_h + easter_l - 7*easter_m + 114) / 31)
- record: easter_day
expr: ((easter_h + easter_l - 7*easter_m + 114) %31) + 1

- record: public_holiday
expr: |
vector(1) and
day_of_month(belgium_localtime-86400) == easter_day
and month(belgium_localtime-86400) == easter_month
labels:
name: Easter Monday
- record: public_holiday
expr: |
vector(1) and
day_of_month(belgium_localtime-40*86400) == easter_day
and month(belgium_localtime-40*86400) == easter_month
labels:
name: Feast of the Ascension
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64204913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档