Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

prometheus

概述

Prometheus:负责采集和存储监控数据,支持多维度查询和告警规则。

Grafana:提供数据可视化和仪表板功能,与多种数据源集成,用于创建自定义监控视图。

Alertmanager:处理来自 Prometheus 的告警通知,执行用户定义的操作,帮助及时响应和解决异常情况。

通过 docker compose 部署

配置文件

总配置文件

./docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
version: '3'

services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus:/etc/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
ports:
- '9090:9090'
networks:
- prom

grafana:
image: grafana/grafana:10.2.0
volumes:
- ./grafana:/etc/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
ports:
- '3000:3000'
depends_on:
- prometheus
networks:
- prom

alertmanager:
image: prom/alertmanager
volumes:
- ./alertmanager:/etc/alertmanager
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
ports:
- '9093:9093'
depends_on:
- prometheus
networks:
- prom

node_exporter:
container_name: node_exporter
image: prom/node-exporter:latest
command:
- '--path.rootfs=/host'
pid: host
restart: unless-stopped
ports:
- 0.0.0.0:9100:9100
volumes:
- '/:/host:ro,rslave'
networks:
- prom
networks:
prom:
driver: bridge

prometheus 配置文件

./prometheus/prometheus.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
global:
scrape_interval: 15s

scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']

- job_name: 'node-1'
static_configs:
- targets: ['your-ip:your-port']
labels:
namespace: 'node'
instance: node-1

报警系统配置文件

./alertmanager/alertmanager.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
# 重复的信息,cd时间
repeat_interval: 12h
receiver: "telegram"
receivers:
- name: 'telegram'
telegram_configs:
- api_url: https://api.telegram.org
bot_token: '<你的电报token>'
chat_id: <发送到的群组>
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']

./grafana/grafana.ini

1
2
[server]
http_port = 3000

新建docker

1
docker compose up -d 

配置 nginx

遇到过的问题

1
2
3
transport_websocket.js:32  WebSocket connection to 'wss://xxxx.io/api/live/ws' failed:
Login failed origin not allowed.
这里需要将nginx的配置检查一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name host-name;

ssl_certificate "/usr/local/nginx/conf/ssl/xxxx.pem";
ssl_certificate_key "/usr/local/nginx/conf/ssl/xxxx.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

client_max_body_size 500m;

location / {
proxy_pass http://grafana_backend;
# 添加以下头部,允许所有来源的请求
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept';
add_header 'Access-Control-Allow-Credentials' 'true';

# 下面这样的配置才能支持websocket,
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;

# 防止超时
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 3600s;
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}

access_log /data/wwwlogs/xxx.access.log;
error_log /data/wwwlogs/xxx.error.log;
}

upstream grafana_backend {
server 127.0.0.1:13000;
# 如果有多个后端服务器,可以添加多个 server 指令
# server grafana_server_ip2:grafana_server_port2;
# ...
}

对接监控

抓取逻辑

prometheus需要配置监控对象,只有就会主动去抓取数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
global:
scrape_interval: 15s

scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']

- job_name: 'node-1'
static_configs:
- targets: ['your-ip:your-port']
labels:
namespace: 'node'
instance: node-1

这里面可以定义抓取的间隔时间。抓取的对象的连接地址,实例编号。

targets里面只能配置一个ip,端口,所以如果地址有些异样,需要自己想办法将其变成根目录的。下面这个例子就是通过nginx转发的实例。

1
2
3
4
5
6
7
8
9
10
server {
listen 9300;
server_name localhost;
location /metrics {
proxy_pass http://127.0.0.1:9301/debug/metrics/prometheus;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

配置prometheus+grafana

配置连接到proemtheus数据源的时候,直接使用docker名称就好了。

http://prometheus:9090

这个地方无需去看docker inspire里面的ip地址。

配置altermanager

概述

  1. 配置全套prometheus+grafana+alertmanager;
  2. prometheus配置了关注node_experter down的警告;
  3. prometheus配置了推送给alertmanager;
  4. alertmanager配置了通过telegram通知;

效果图

prometheus-alerts

prometheus-alerts

alertmanager

alertmanager

如何配置

prometheus

由于我们这套是通过 docker compose 直接部署的,所以这些服务器都在同一个虚拟局域网中。这里配置 targets 的时候,只需要使用名称。这个信息能从这个docker 的

1
2
3
4
5
6
7
8
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
# 配置自己的警报文件
rule_files:
- "/home/rules/*.yml"

警报文件,可能今后需要经常编写这个文件:

1
2
3
4
5
6
7
8
9
groups:
- name: example
rules:
- alert: NodeExporterDown
expr: up == 0
for: 5m
annotations:
summary: "Node Exporter is down"
description: "Node Exporter on {{ $labels.instance }} is down. Please investigate."

网站探针崩溃的检测程序。

1
2
3
4
5
6
7
8
9
10
11
12
groups:
- name: example
rules:
- alert: WebsiteProbeFailed
expr: probe_success == 0
for: 1h
labels:
severity: critical
annotations:
summary: "Website probe failed (instance {{ $labels.instance }})"
description: "The Blackbox Exporter probe failed to reach the website {{ $labels.target }}"

alertmanager
  1. group_wait: 30s:这个配置定义了在分组期间等待警报的时间。当一个警报被触发后,Alertmanager 会等待一段时间(在这个示例中为 30 秒),以便将其他与之相关的警报(具有相同 group_by 标签的警报)归类到同一个组中。如果在此等待时间内没有其他相关的警报,则立即进行下一步处理。

  2. group_interval: 5m:这个配置定义了在发送警报通知之前,对每个警报组进行等待的时间。在这个示例中,Alertmanager 将等待 5 分钟,以便将同一组中的所有警报聚合起来,并一次性发送一个通知,而不是为每个警报分别发送通知。

  3. repeat_interval: 1h:这个配置定义了重复发送警报通知的时间间隔。在这个示例中,Alertmanager 将在每个警报组的第一次发送通知之后,每隔 1 小时重复发送一次通知,直到该组中的所有警报被解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
route:
group_by: ['alertname']
group_wait: 30s # 在分组后,等待 30 秒,以便将相关的报警聚合到同一通知中。
group_interval: 5m # 在发送一次通知后,等待 5 分钟再发送下一次相同分组的通知。
repeat_interval: 1h # 在发送通知后,等待 1 小时再次发送相同分组的通知。
receiver: "telegram"
receivers:
- name: 'telegram'
telegram_configs:
- api_url: https://api.telegram.org
bot_token: '<机器人-token>'
chat_id: <聊天群编号/个人编号>
inhibit_rules:
- source_match: # 匹配满足某些条件的源报警。
severity: 'critical' # 匹配严重性为 'critical' 的报警。
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']

发现的问题

1
2
3
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)"
ts=2024-01-25T01:42:16.210Z caller=dispatch.go:352 level=error component=dispatcher msg="Notify for alerts failed" num_alerts=1 err="telegram/telegram[0]: notify retry canceled after 16 attempts: telegram: chat not found (400)"
ts=2024-01-25T01:42:16.536Z 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
2
3
4
5
6
7
8
9
Alerts Resolved:
Labels:
- alertname = NodeExporterDown
- instance = 开发机
- job = 开发
Annotations:
- description = Node Exporter on 开发机 is down. Please investigate.
- summary = Node Exporter is down
Source:

分段时间来实现警报

要实现在晚上减少警报频率,白天增加警报积极性的功能,你可以使用 Prometheus 的告警路由(Alert Routing)和告警控制器(Alertmanager)来实现。下面是一种可能的实现方法:

  1. 定义两组警报规则:

一组规则用于在白天触发警报,可以更积极地监控系统状态。
另一组规则用于在晚上触发警报,可以减少频率或者延迟警报发送。

  1. 配置告警路由:

使用 Prometheus 的告警路由配置文件,定义不同时间段的警报路由策略。在白天,配置策略以更积极的方式处理警报(例如立即发送通知),而在晚上,配置策略以减少频率或延迟发送通知。

  1. 配置告警控制器:

在 Alertmanager 的配置文件中,定义两个接收者配置。一个接收者用于白天发送警报通知,另一个接收者用于晚上发送警报通知。根据定义的告警路由策略,Alertmanager 将根据时间段选择适当的接收者来处理警报。

  1. 定义警报规则时间条件:

在定义警报规则时,考虑添加时间条件,以便只在特定时间段触发警报。你可以使用 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
"github.com/gin-contrib/prometheus"
"github.com/gin-gonic/gin"
"github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
r := gin.Default()

// 使用 gin-contrib/prometheus 中间件
p := prometheus.NewPrometheus("gin")
p.Use(r)

// 添加路由
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello, Prometheus!",
})
})

// 添加 /metrics 路由,用于 Prometheus 收集
r.GET("/metrics", gin.WrapH(promhttp.Handler()))

// 启动服务器
r.Run(":8080")
}

Prometheus 监控网站证书是否过期

要使用 Prometheus 监控网站证书是否过期,你可以使用 blackbox_exporter,这是 Prometheus 的一种 exporter,专门用于执行对端(例如 HTTP、HTTPS)的探测。以下是基本的步骤:

  1. 使用docker-compose安装: blackbox_exporter

    1
    2
    3
    4
    5
    6
    blackbox-exporter:
    image: prom/blackbox-exporter
    ports:
    - "9115:9115"
    networks:
    - prom

    在这个例子中,我们定义了一个探测模块,它使用 HTTP GET 请求检测一个网站(example.com)的证书是否过期。你可以根据需要调整配置。

  2. 配置 Prometheus:

    blackbox_exporter 添加到 Prometheus 的配置文件中。以下是一个简单的示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    scrape_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
2
3
4
5
6
7
8
9
10
11
12
groups:
- name: example
rules:
- alert: WebsiteProbeFailed
expr: probe_success == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Website probe failed (instance {{ $labels.instance }})"
description: "The Blackbox Exporter probe failed to reach the website {{ $labels.target }}"

在这个例子中,我们配置了一个 blackbox 作业,告诉 Prometheus 去 /probe 路径下检测 http_2xx 模块。

  1. 重新启动 Prometheus:

    重启 Prometheus 以应用新的配置。

  2. 查看监控数据:

    在 Prometheus 的 Web UI 或 Grafana 等监控工具中查看证书过期的监控数据。你可以使用 Prometheus 查询语言(PromQL)来创建仪表板或警报规则。

请注意,上述步骤中的配置仅供参考,你需要根据你的具体需求和网络环境进行适当调整。此外,为了避免在生产环境中使用 insecure_skip_verify: true,你应该配置证书验证来提高安全性。
在 Docker Compose 中部署 blackbox_exporter,你可以使用一个简单的 Docker Compose 文件来定义 blackbox_exporter 服务。以下是一个基本的示例:

  1. 创建 Docker Compose 文件(docker-compose.yml):

    创建一个文件,例如 docker-compose.yml,并添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    version: '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/ 目录下。

  2. 创建 Blackbox Exporter 配置文件(config.yml):

    在与 docker-compose.yml 同级的目录下创建 config.yml 文件,用于配置 blackbox_exporter。以下是一个简单的示例:

    1
    2
    3
    4
    5
    6
    7
    8
    modules:
    http_2xx:
    prober: http
    timeout: 5s
    http:
    method: GET
    tls:
    insecure_skip_verify: false

    这个示例与之前提到的 blackbox.yml 类似。

  3. 运行 Docker Compose:

    在包含 docker-compose.yml 的目录中执行以下命令启动 blackbox_exporter

    1
    docker-compose up -d

    -d 标志表示在后台运行。

  4. 查看监控数据:

    访问 http://localhost:9115/metrics,你应该能够看到 blackbox_exporter 的监控数据。你也可以将 blackbox-exporter 集成到 Prometheus 中,并在 Grafana 或其他监控工具中查看数据。

确保你的主机上已经安装了 Docker 和 Docker Compose。此外,根据需要,可以调整配置文件和 docker-compose.yml 文件以适应你的环境和需求。

prometheus和springboot版本不匹配

1
2
3
4
springboot 3.1.4
prom/prometheus:v2.42.0
grafana/grafana:8.5.27
错了版本之后,将会有406版本。


常用的 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 来监控一个健康接口的示例:

  1. 下载并安装 blackbox_exporter

    你可以从 blackbox_exporter 的 GitHub Releases 页面 下载二进制文件,并将其放置在你的系统上。

  2. 创建 blackbox.yml 配置文件:

    在同一目录下创建一个名为 blackbox.yml 的配置文件,用于定义健康检查的目标。以下是一个示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    modules:
    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”。

  3. 运行 blackbox_exporter

    使用以下命令运行 blackbox_exporter,指定配置文件路径:

    1
    ./blackbox_exporter --config.file=blackbox.yml

    请根据你的操作系统和二进制文件的位置进行相应的调整。

  4. 配置 Prometheus 抓取规则:

    在 Prometheus 的配置文件中添加以下内容,以定期抓取 blackbox_exporter 的结果:

    1
    2
    3
    4
    5
    6
    7
    8
    scrape_configs:
    - job_name: 'blackbox'
    metrics_path: /probe
    params:
    module: [http_healthy]
    static_configs:
    - targets:
    - http://example.com/health

    在这个示例中,我们定义了一个 blackbox 作业,配置了 blackbox_exporter 的 URL 和 blackbox.yml 中定义的模块。

  5. 重新加载 Prometheus 配置:

    重新加载 Prometheus 的配置,以使其读取新的抓取规则:

    1
    kill -HUP <prometheus_pid>

    替换 <prometheus_pid> 为运行 Prometheus 的进程 ID。

现在,Prometheus 将定期抓取 blackbox_exporter 的结果,并将其作为监控指标存储在 Prometheus 中。你可以通过查询和仪表板来检查该健康检查的状态。

引用