概述
Prometheus:负责采集和存储监控数据,支持多维度查询和告警规则。
Grafana:提供数据可视化和仪表板功能,与多种数据源集成,用于创建自定义监控视图。
Alertmanager:处理来自 Prometheus 的告警通知,执行用户定义的操作,帮助及时响应和解决异常情况。
通过 docker compose 部署
配置文件
总配置文件
./docker-compose.yml
1 | version: '3' |
prometheus 配置文件
./prometheus/prometheus.yml
1 | global: |
报警系统配置文件
./alertmanager/alertmanager.yml
1 | route: |
./grafana/grafana.ini
1 | [server] |
新建docker
1 | docker compose up -d |
配置 nginx
遇到过的问题
1 | transport_websocket.js:32 WebSocket connection to 'wss://xxxx.io/api/live/ws' failed: |
1 | server { |
对接监控
抓取逻辑
prometheus需要配置监控对象,只有就会主动去抓取数据。
1 | global: |
这里面可以定义抓取的间隔时间。抓取的对象的连接地址,实例编号。
targets里面只能配置一个ip,端口,所以如果地址有些异样,需要自己想办法将其变成根目录的。下面这个例子就是通过nginx转发的实例。
1 | server { |
配置prometheus+grafana
配置连接到proemtheus数据源的时候,直接使用docker名称就好了。
这个地方无需去看docker inspire里面的ip地址。
配置altermanager
概述
- 配置全套prometheus+grafana+alertmanager;
- prometheus配置了关注node_experter down的警告;
- prometheus配置了推送给alertmanager;
- alertmanager配置了通过telegram通知;
效果图
如何配置
prometheus
由于我们这套是通过 docker compose 直接部署的,所以这些服务器都在同一个虚拟局域网中。这里配置 targets 的时候,只需要使用名称。这个信息能从这个docker 的
1 | alerting: |
警报文件,可能今后需要经常编写这个文件:
1 | groups: |
网站探针崩溃的检测程序。
1 | groups: |
alertmanager
group_wait: 30s:这个配置定义了在分组期间等待警报的时间。当一个警报被触发后,Alertmanager 会等待一段时间(在这个示例中为 30 秒),以便将其他与之相关的警报(具有相同 group_by 标签的警报)归类到同一个组中。如果在此等待时间内没有其他相关的警报,则立即进行下一步处理。
group_interval: 5m:这个配置定义了在发送警报通知之前,对每个警报组进行等待的时间。在这个示例中,Alertmanager 将等待 5 分钟,以便将同一组中的所有警报聚合起来,并一次性发送一个通知,而不是为每个警报分别发送通知。
repeat_interval: 1h:这个配置定义了重复发送警报通知的时间间隔。在这个示例中,Alertmanager 将在每个警报组的第一次发送通知之后,每隔 1 小时重复发送一次通知,直到该组中的所有警报被解决。
1 | route: |
发现的问题
1 | ts=2024-01-25T01:37:17.880Z caller=notify.go:745 level=warn component=dispatcher receiver=telegram integration=telegram[0] aggrGroup="{}:{alertname=\"NodeExporterDown\"}" msg="Notify attempt failed, will retry later" attempts=1 err="telegram: chat not found (400)" |
这个问题过了一段时间之后又好起来了。应该问题还是来自于没有将 prometheus 里面的警报规则配置好造成的。
报警出来的内容
1 | Alerts Resolved: |
分段时间来实现警报
要实现在晚上减少警报频率,白天增加警报积极性的功能,你可以使用 Prometheus 的告警路由(Alert Routing)和告警控制器(Alertmanager)来实现。下面是一种可能的实现方法:
- 定义两组警报规则:
一组规则用于在白天触发警报,可以更积极地监控系统状态。
另一组规则用于在晚上触发警报,可以减少频率或者延迟警报发送。
- 配置告警路由:
使用 Prometheus 的告警路由配置文件,定义不同时间段的警报路由策略。在白天,配置策略以更积极的方式处理警报(例如立即发送通知),而在晚上,配置策略以减少频率或延迟发送通知。
- 配置告警控制器:
在 Alertmanager 的配置文件中,定义两个接收者配置。一个接收者用于白天发送警报通知,另一个接收者用于晚上发送警报通知。根据定义的告警路由策略,Alertmanager 将根据时间段选择适当的接收者来处理警报。
- 定义警报规则时间条件:
在定义警报规则时,考虑添加时间条件,以便只在特定时间段触发警报。你可以使用 Prometheus 的 time() 函数来指定时间条件。
下面是一个简单的示例配置,仅用于说明概念:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24# Prometheus Alert Rules
groups:
- name: daytime.rules
rules:
- alert: HighRequestLatency
expr: request_latency_seconds > 1
labels:
severity: warning
annotations:
summary: "High request latency detected"
description: "The average request latency is above 1s."
time: 6h-18h
- name: nighttime.rules
rules:
- alert: HighRequestLatency
expr: request_latency_seconds > 1
labels:
severity: warning
annotations:
summary: "High request latency detected"
description: "The average request latency is above 1s."
time: 18h-6h
在这个示例中:
daytime.rules 组定义了白天的警报规则,仅在早上 6 点到晚上 6 点之间触发。
nighttime.rules 组定义了晚上的警报规则,仅在晚上 6 点到早上 6 点之间触发。
然后,根据你的实际需求和部署情况,配置 Alertmanager 来根据定义的时间条件选择适当的接收者,并根据需求调整警报触发策略和通知频率。
PromQL-ChatGPT
当然,我可以为你提供一个从基础到逐渐复杂的 Prometheus PromQL 学习梯度。PromQL 是 Prometheus 查询语言,用于从 Prometheus 时间序列数据库中提取和分析数据。
1. 基础概念:
Metric(度量标准):
- Prometheus 收集的数据的基本单位。
- 例子:
http_requests_total
,表示HTTP请求数量。
Selector(选择器):
- 通过标签(key-value对)来筛选数据。
- 例子:
http_requests_total{job="api-server", method="GET"}
,选择 API 服务器上的 GET 请求。
2. 基本操作:
基本查看:
- 查询所有指标:
up
。 - 查询特定指标:
http_requests_total
。
时间范围:
- 默认时间范围是最近5分钟。
- 指定时间范围:
http_requests_total{job="api-server"}[1h]
,表示过去1小时的数据。
3. 聚合和函数:
聚合操作:
sum()
:求和。avg()
:求平均。- 例子:
sum(http_requests_total)
,表示所有实例的请求数之和。
函数:
rate()
:计算速率。increase()
:计算增长量。- 例子:
rate(http_requests_total[5m])
,表示过去5分钟的请求速率。
4. 进阶操作:
多维数据操作:
- 使用
group by
对结果进行分组。 - 例子:
sum(http_requests_total) by (job)
,表示按作业(job)对请求数进行求和。
条件和比较:
- 使用
if
和==
等条件操作符。 - 例子:
http_requests_total > 100
,表示请求数量大于100的情况。
5. 子查询和子表达式:
子查询:
- 使用子查询可以嵌套一个查询到另一个查询中。
- 例子:
(sum(rate(http_requests_total[5m])) / 100) * 60
,表示每分钟请求数超过100的百分比。
子表达式:
- 使用括号来组合表达式。
- 例子:
http_requests_total * (1 - error_rate)
,表示请求总数减去错误率。
6. 函数式编程:
使用 label_replace
函数:
- 用于修改标签。
- 例子:
label_replace(http_requests_total, "status", "2xx", "", "(.*)" == "2.*")
,将 status 标签中以 “2” 开头的值替换为 “2xx”。
使用 absent
函数:
- 用于查找缺失的时间序列。
- 例子:
absent(http_requests_total)
,查找缺少 http_requests_total 时间序列的实例。
这是一个逐渐增加难度的学习路径,你可以根据需要深入研究每个主题。PromQL 是一个非常强大和灵活的查询语言,对于监控和分析系统性能非常有帮助。
golang gin 添加 Prometheus
1 | package main |
要使用 Prometheus 监控网站证书是否过期,你可以使用 blackbox_exporter
,这是 Prometheus 的一种 exporter,专门用于执行对端(例如 HTTP、HTTPS)的探测。以下是基本的步骤:
使用docker-compose安装:
blackbox_exporter
:1
2
3
4
5
6blackbox-exporter:
image: prom/blackbox-exporter
ports:
- "9115:9115"
networks:
- prom在这个例子中,我们定义了一个探测模块,它使用 HTTP GET 请求检测一个网站(
example.com
)的证书是否过期。你可以根据需要调整配置。配置 Prometheus:
将
blackbox_exporter
添加到 Prometheus 的配置文件中。以下是一个简单的示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16scrape_configs:
- job_name: 'blackbox'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
#需要监控SSL的域名
- https://www.baidu.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115
1 | groups: |
在这个例子中,我们配置了一个 blackbox
作业,告诉 Prometheus 去 /probe
路径下检测 http_2xx
模块。
重新启动 Prometheus:
重启 Prometheus 以应用新的配置。
查看监控数据:
在 Prometheus 的 Web UI 或 Grafana 等监控工具中查看证书过期的监控数据。你可以使用 Prometheus 查询语言(PromQL)来创建仪表板或警报规则。
请注意,上述步骤中的配置仅供参考,你需要根据你的具体需求和网络环境进行适当调整。此外,为了避免在生产环境中使用 insecure_skip_verify: true
,你应该配置证书验证来提高安全性。
在 Docker Compose 中部署 blackbox_exporter
,你可以使用一个简单的 Docker Compose 文件来定义 blackbox_exporter
服务。以下是一个基本的示例:
创建 Docker Compose 文件(
docker-compose.yml
):创建一个文件,例如
docker-compose.yml
,并添加以下内容:1
2
3
4
5
6
7
8
9
10
11version: '3'
services:
blackbox-exporter:
image: prom/blackbox-exporter
ports:
- "9115:9115"
command:
- "--config.file=/etc/blackbox_exporter/config.yml"
volumes:
- ./config.yml:/etc/blackbox_exporter/config.yml在这个示例中,我们使用
prom/blackbox-exporter
镜像,将容器的9115
端口映射到主机的9115
端口上,并将配置文件config.yml
挂载到容器的/etc/blackbox_exporter/
目录下。创建 Blackbox Exporter 配置文件(
config.yml
):在与
docker-compose.yml
同级的目录下创建config.yml
文件,用于配置blackbox_exporter
。以下是一个简单的示例:1
2
3
4
5
6
7
8modules:
http_2xx:
prober: http
timeout: 5s
http:
method: GET
tls:
insecure_skip_verify: false这个示例与之前提到的
blackbox.yml
类似。运行 Docker Compose:
在包含
docker-compose.yml
的目录中执行以下命令启动blackbox_exporter
:1
docker-compose up -d
-d
标志表示在后台运行。查看监控数据:
访问
http://localhost:9115/metrics
,你应该能够看到blackbox_exporter
的监控数据。你也可以将blackbox-exporter
集成到 Prometheus 中,并在 Grafana 或其他监控工具中查看数据。
确保你的主机上已经安装了 Docker 和 Docker Compose。此外,根据需要,可以调整配置文件和 docker-compose.yml
文件以适应你的环境和需求。
prometheus和springboot版本不匹配
1 | springboot 3.1.4 |
常用的 dashboard
https://grafana.com/grafana/dashboards/11074-node-exporter-for-prometheus-dashboard-en-v20201010/
https://grafana.com/grafana/dashboards/13659-blackbox-exporter-http-prober/
https://grafana.com/grafana/dashboards/4701-jvm-micrometer/
https://grafana.com/grafana/dashboards/1860-node-exporter-full/
https://grafana.com/grafana/dashboards/4701-jvm-micrometer/
https://grafana.com/grafana/dashboards/11378-justai-system-monitor/
blackbox_exporter
在Prometheus中监控一个健康接口,通常使用 probe
类型的 blackbox_exporter
,这个 exporter 可以通过 HTTP、TCP、ICMP 等方式进行健康检查。
以下是如何配置 blackbox_exporter
来监控一个健康接口的示例:
下载并安装
blackbox_exporter
:你可以从 blackbox_exporter 的 GitHub Releases 页面 下载二进制文件,并将其放置在你的系统上。
创建
blackbox.yml
配置文件:在同一目录下创建一个名为
blackbox.yml
的配置文件,用于定义健康检查的目标。以下是一个示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15modules:
http_healthy:
prober: http
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2"]
method: GET
headers:
Host: "example.com"
fail_if_ssl: false
fail_if_not_ssl: false
fail_if_body_not_matches_regexp:
- "OK"
fail_if_header_not_matches_regexp:
"Content-Type": ["text/html; charset=utf-8"]
timeout: 5s在这个示例中,我们定义了一个名为
http_healthy
的模块,使用 HTTP 探测器 (prober: http
),检查目标是否返回 HTTP 状态码 200、包含 “OK” 文本,并且Content-Type
是 “text/html; charset=utf-8”。运行
blackbox_exporter
:使用以下命令运行
blackbox_exporter
,指定配置文件路径:1
./blackbox_exporter --config.file=blackbox.yml
请根据你的操作系统和二进制文件的位置进行相应的调整。
配置 Prometheus 抓取规则:
在 Prometheus 的配置文件中添加以下内容,以定期抓取
blackbox_exporter
的结果:1
2
3
4
5
6
7
8scrape_configs:
- job_name: 'blackbox'
metrics_path: /probe
params:
module: [http_healthy]
static_configs:
- targets:
- http://example.com/health在这个示例中,我们定义了一个
blackbox
作业,配置了blackbox_exporter
的 URL 和blackbox.yml
中定义的模块。重新加载 Prometheus 配置:
重新加载 Prometheus 的配置,以使其读取新的抓取规则:
1
kill -HUP <prometheus_pid>
替换
<prometheus_pid>
为运行 Prometheus 的进程 ID。
现在,Prometheus 将定期抓取 blackbox_exporter
的结果,并将其作为监控指标存储在 Prometheus 中。你可以通过查询和仪表板来检查该健康检查的状态。
引用
- [1] grafana-dashboards
- [2] prometheus-node-exporter
- [3] altermanager-配置telegram方式
- [4] prometheus-PromQL-文档
- [5] b站-入门PromQL
- [6] b站-境界PromQL