prometheus-2.36.0.linux-amd64 条件与的写法
设想:
每天早上9点02分前检查一次https证书是否过期,如果过期了就发出告警,其他时间不做ssl证书是否过期的检查
时间条件:
floor(node_time_seconds{ instance="20.30.40.204:9100"}%(3600*24)/3600+8)%24 ==9 and floor(node_time_seconds{instance="20.30.40.204:9100"}%(3600*24)/60%60)<2
单独测试成功
ssl证书过期:
(probe_ssl_earliest_cert_expiry-time())/3600/24<332.1242
单独测试也成功
但当两个条件合并在一起的时候,也就是早上9点02分检查ssl证书,过期就发出告警
floor(node_time_seconds{ instance="20.30.40.204:9100"}%(3600*24)/3600+8)%24 ==9 and floor(node_time_seconds{instance="20.30.40.204:9100"}%(3600*24)/60%60)<2 and (probe_ssl_earliest_cert_expiry-time())/3600/24<332.1242
却死活无法发出告警,求解,谢谢
该回答引用ChatGPT
以下是可能导致规则无法正确工作的一些问题和建议:
1、检查 Prometheus 服务器时间是否正确,因为规则中使用了 Prometheus 服务器的时间。可以使用 date 命令检查 Prometheus 服务器的时间是否正确。
2、确保证书过期时间的条件 (probe_ssl_earliest_cert_expiry-time())/3600/24<332.1242 可以正常工作。可以尝试将此条件添加到单独的告警规则中,以确保它可以正常工作。
3、确保 SSL 监控器(例如 blackbox_exporter)配置正确,并且证书可以通过监控器访问。可以尝试使用 curl 命令从 Prometheus 服务器测试 SSL 连接,并检查证书是否过期。
4、确保监控器在 Prometheus 中正确配置,并且能够通过该监控器正确采集 SSL 证书的指标。可以使用 Prometheus Web UI 上的 Metrics 页面,检查是否可以从监控器中获取 SSL 指标数据。
5、可以尝试拆分规则条件并单独测试每个条件。例如,尝试先测试时间条件,确保它可以正确地识别早上9点02分,然后测试证书过期条件。
可以使用 Prometheus 的 promtool check-rules 命令检查规则文件中的语法错误和规则是否正确。
以下是一种可能的 Prometheus 规则,可在早上9点02分检查 SSL 证书是否过期并发出告警:
groups:
- name: ssl-certificate-expiry
rules:
- alert: ssl-certificate-expiry
expr: floor(node_time_seconds{ instance="20.30.40.204:9100"}%(3600*24)/3600+8)%24 ==9 and floor(node_time_seconds{instance="20.30.40.204:9100"}%(3600*24)/60%60)==2 and (probe_ssl_earliest_cert_expiry{job="ssl-monitoring-job"}-time())/3600/24<30
for: 5m
labels:
severity: critical
annotations:
summary: SSL certificate will expire soon
description: "SSL certificate for {{ $labels.instance }} will expire in {{ humanizeDuration (probe_ssl_earliest_cert_expiry{job="ssl-monitoring-job"}-time()) }}"
floor(node_time_seconds{instance="20.30.40.204:9100"}%(360024)/3600+8)%24 ==9 and floor(node_time_seconds{instance="20.30.40.204:9100"}%(360024)/60%60)<2 and (probe_ssl_earliest_cert_expiry{job="your-job-name"}-time())/3600/24<332.1242
参考GPT:
首先,请确认以下事项:
Prometheus是否收到了有关ssl证书过期的数据。
1.如果您尝试过手动设置证书过期时间,那么它是否正确地触发了警报。
2.您的Prometheus配置文件是否正确地配置了SSL证书探针(probe)。
3.如果上述事项都已确认无误,那么您可以通过以下步骤来进一步调试:
使用Prometheus表达式浏览器(Expression Browser)来测试您的PromQL表达式是否正确。您可以在表达式浏览器中执行以下查询:
floor(node_time_seconds{ instance="20.30.40.204:9100"}%(3600*24)/3600+8)%24 ==9 and floor(node_time_seconds{instance="20.30.40.204:9100"}%(3600*24)/60%60)<2
并检查它是否在预期的时间范围内返回结果。
2.在表达式浏览器中,您可以测试以下表达式,以确认是否收到了有关ssl证书过期的数据:
probe_ssl_earliest_cert_expiry_seconds{job="your_job_name_here"}
3.如果您已确认表达式正确并且已经收到了有关证书过期的数据,那么您可以尝试在警报规则文件中使用以下表达式:
ALERT SSL_CERT_EXPIRING
IF probe_ssl_earliest_cert_expiry_seconds{job="your_job_name_here"} / 86400 < 332.1242
AND ON() vector(1)
FOR 5m
LABELS {
severity="warning"
}
ANNOTATIONS {
summary = "SSL certificate is expiring soon",
description = "SSL certificate will expire in less than 332 days.",
}
确保您将上述表达式中的“your_job_name_here”替换为您的作业名称。如果您的警报规则已正确设置并且仍未触发警报,请检查警报日志以查看是否存在任何错误或警告消息。
希望这些步骤能够帮助您进一步调试问题并找到解决方案。
参考gpt和自己的思路,你可以使用PromQL中的or和and运算符来组合条件。
以下是根据你的需求编写的Prometheus查询语句:
(probe_ssl_earliest_cert_expiry - time()) / 86400 < 332.1242 and (
(
(
floor(node_time_seconds{instance="20.30.40.204:9100"} % (3600*24) / 3600 + 8) % 24 == 9
) and (
floor(node_time_seconds{instance="20.30.40.204:9100"} % (3600*24) / 60 % 60) < 2
)
) or (
time() - probe_ssl_earliest_cert_expiry > 86400
)
)
这个查询语句的含义是:
检查证书是否过期,如果过期时间小于332.1242天,进行下一步判断;
如果当前时间是每天早上9点02分之前,进行下一步判断;
如果证书已经过期了,进行下一步判断;
如果满足上述任意一个条件,就发出告警。
请注意,这个查询语句假设你的服务器时间是正确的,且你的SSL证书与服务器时间同步。如果这些条件不成立,可能会导致告警无法正确触发。
Prometheus 中的条件与或的写法可以使用括号来进行分组,使用逻辑运算符 && 表示与,使用 || 表示或。例如,表达式 (A && B) || (C && D) 表示 A 和 B 中至少有一个为真,或者 C 和 D 中至少有一个为真。
您的 PromQL 查询条件使用了逻辑运算符 and,意味着两个条件都必须同时成立,才能触发告警。根据您的需求,您需要使用逻辑运算符 or,因为只有一个条件成立,也应该触发告警。
下面是您可以尝试的查询条件:
floor(node_time_seconds{ instance="20.30.40.204:9100"}%(3600*24)/3600+8)%24 ==9 and floor(node_time_seconds{instance="20.30.40.204:9100"}%(3600*24)/60%60)<2 and (probe_ssl_earliest_cert_expiry-time())/3600/24<332.1242 or on() vector(0)
在这个查询条件中,我们使用了 or on() vector(0) 语句。这个语句的作用是:当前面的条件不成立时,返回一个空向量,相当于条件不成立,但是可以触发告警。
请注意,使用空向量触发告警的行为是一种 hack,并不是 PromQL 的正式用法,因此请谨慎使用。
您好,您的Prometheus查询语句中可能存在一些问题。您可以尝试如下的查询语句来检查SSL证书是否过期:
probe_ssl_earliest_cert_expiry{job="your-job-name"} - time() < 86400 * 7
其中,'你的工作名称
如果您需要在每天早上 9 点 02 分前检查一次 SSL 证书是否过期并发出告警,则可以使用如下的告警规则:
groups:
- name: your-group-name
rules:
- alert: SSLCertificateExpiry
expr: probe_ssl_earliest_cert_expiry{job="your-job-name"} - time() < 86400 * 7
for: 0s
labels:
severity: warning
annotations:
summary: "SSL certificate will expire soon"
description: "The SSL certificate for {{ $labels.instance }} will expire soon. Please renew the certificate."
- alert: SSLCertificateExpiryCheck
expr: floor(node_time_seconds{instance="20.30.40.204:9100"}%(3600*24)/3600+8)%24 == 9 and floor(node_time_seconds{instance="20.30.40.204:9100"}%(3600*24)/60%60) == 2
for: 1m
labels:
severity: info
annotations:
summary: "Checking SSL certificate expiry"
description: "Checking SSL certificate expiry for {{ $labels.instance }} at 9:02 AM every day"
其中,'您的组
上面的告警规则包括两个告警,'SSLCertificateExpirySSLCertificateExpiryCheck是每天早上 9 点 02 分进行检查的告警。您可以根据需要进行修改。
注意,为了让告警规则生效,您需要将上面的规则添加到 Prometheus 的配置文件中,并重新加载 Prometheus 的配置文件。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
您的表达式的确存在问题。prometheus 表达式是基于向量、标量和布尔运算构建的,可以使用 and
, or
和 unless
等运算符。但是在您的表达式中,使用了一个函数和几个算术运算,这并不是 prometheus 表达式的标准语法,因此您无法得到预期的结果。
在这种情况下,您可以将它们分为两个表达式。一个表达式,用于判断当前是否为指定时间段,这里您已经给出了正确的表达式。另一个表达式用于检查证书是否过期,并使用 Alertmanager 发出警报。
下面是您可以使用的表达式的示例代码:
# Step 1:时间条件
time_in_range = (floor(node_time_seconds{ instance="20.30.40.204:9100"}%(3600*24)/3600+8)%24 == 9 and floor(node_time_seconds{instance="20.30.40.204:9100"}%(3600*24)/60%60) < 2)
# Step 2:检查 ssl 证书
ssl_expiry = probe_ssl_earliest_cert_expiry_seconds{job="ssl-job-name", instance="domain.com:443"}
cert_expired = ssl_expiry < time()
# Step 3:警报条件
expr_alert = cert_expired and time_in_range
# Step 4:警报规则
- alert: SSLCertExpiringSoon
expr: expr_alert
labels:
severity: warning
annotations:
summary: "SSL certificate will expire soon"
description: "The SSL certificate for {{ $labels.instance }} will expire soon. Please renew it before expiry date."
其中,第一步指定时段的表达式不变。第二步,我们选择了 probe_ssl_earliest_cert_expiry_seconds
这个指标来获取 ssl 证书的过期时间,然后计算其是否过期。最后,我们将两个条件合并,构建一个用于警报的表达式。
请注意,这里我们还添加了一个带有警报规则的警报器规则。Alertmanager 将使用该规则发送任何符合警报条件的警报。
您可能需要根据自己的环境和配置进行微调。但是,如果您遵循这里的模式,表达式应该能够像您所期望的那样进行计算和监控。
如果我的回答解决了您的问题,请采纳!
该回答引用CHATGPT
每天早上9点02分前检查一次https证书是否过期,如果过期了就发出告警,其他时间不做ssl证书是否过期的检查。
floor(node_time_seconds{ instance="20.30.40.204:9100"}%(3600*24)/3600+8)%24 ==9 and floor(node_time_seconds{instance="20.30.40.204:9100"}%(3600*24)/60%60)<2
单独测试成功。
(probe_ssl_earliest_cert_expiry-time())/3600/24<332.1242
单独测试成功。
但当两个条件合并在一起的时候,也就是早上9点02分检查ssl证书,过期就发出告警:
floor(node_time_seconds{ instance="20.30.40.204:9100"}%(3600*24)/3600+8)%24 ==9 and floor(node_time_seconds{instance="20.30.40.204:9100"}%(3600*24)/60%60)<2 and (probe_ssl_earliest_cert_expiry-time())/3600/24<332.1242
却死活无法发出告警,求解,谢谢。
在合并条件时,需要确保两个条件都为真才会触发告警。前一个条件只有在每天早上9点02分前才为真,而后一个条件只有在证书过期时才为真。如果在其他时间检查证书,条件就不会同时为真,所以无法触发告警。
建议您将这两个条件拆开,分别配置不同的告警规则,这样就可以实现您的预期效果了。
这个问题可能是由于PromQL查询中的逻辑错误导致的。推荐您尝试使用括号来明确优先级,以确保查询逻辑的正确性。
建议您将查询语句改为以下形式:
(floor(node_time_seconds{ instance="20.30.40.204:9100"}%(3600*24)/3600+8)%24 ==9 and floor(node_time_seconds{instance="20.30.40.204:9100"}%(3600*24)/60%60)<2) and (probe_ssl_earliest_cert_expiry-time())/3600/24<332.1242
这样可以确保时间条件先被判断,只有在时间条件符合时才会再判断SSL证书是否过期。同时,括号也可以让查询逻辑更加清晰易懂。
如果问题还未解决,建议您提供更多详细信息,例如告警规则配置和日志信息,以便更好地分析问题。