单机简单部署测试
Prometheus部署
1.下载安装
wget https://github.com/prometheus/prometheus/releases/download/v2.35.0-rc0/prometheus-2.35.0-rc0.linux-amd64.tar.gz
1.1 创建安装目录
mkdir -p /usr/local/prometheus/
1.2 解压到该目录
tar xvf prometheus-2.35.0-rc0.linux-amd64.tar.gz -C /usr/local/prometheus
mv /usr/local/prometheus/prometheus-2.35.0-rc0.linux-amd64 /usr/local/prometheus/2.35.0
2.运行Prometheus
#第一种方法,传统启动(更新配置需重启服务生效)
./prometheus --config.file=prometheus.yml
#第二种方法,热加载配置(更新配置不需重启服务)
./prometheus --config.file=prometheus.yml --web.enable-lifecycle
#更新配置后可使用此命令热加载
curl -X POST http://localhost:9090/-/reload
添加系统服务,设置服务开机自启
vim /usr/lib/systemd/system/prometheus.service
追加内容
[Unit]
Description=prometheus is service
[Service]
Type=simple
ExecStart=/usr/local/prometheus/2.35.0/prometheus --config.file=/usr/local/prometheus/2.35.0/prometheus.yml --web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
systemctl 启动
systemctl daemon-reload
systemctl restart prometheus
systemctl enable prometheus
3.防火墙9090端口放开
使用的是 firewall-cmd
时
firewall-cmd --permanent --add-port=9090/tcp
firewall-cmd --reload
使用 iptable
时,后续默认使用iptable的方式关闭端口。小提示:iptable使用参考文章
iptables -I INPUT -p tcp --dport 9090 -j ACCEPT
4.Prometheus登录
4.1监控指标
默认地址 http://10.10.50.211:9090/metrics
4.2监控界面
默认地址 http://10.10.50.211:9090/graph
5.Prometheus参数配置
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. 默认15s 全局每次数据收集的间隔
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. 规则扫描时间间隔是15秒,默认不填写是 1分钟
# scrape_timeout is set to the global default (10s). 超时时间
# external_labels: # 用于外部系统标签的,不是用于metrics(度量)数据
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus" # 任务目标名,可以理解成分组,每个分组包含具体的target组员
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
global: 全局配置(如果有内部单独设定,会覆盖这个参数)
alerting: 告警插件定义。主要是指定prometheus将报警规则推送到指定的alertManager实例地址rule_files: 告警规则。 按照设定参数进行扫描加载,用于自定义报警规则,其报警媒介和route路由由alertmanager插件实现。
scrape_configs:采集配置。配置数据源,包含分组job_name以及具体target。又分为静态配置和服务发现。prometheus的数据采集通过此片段配置
remote_writer:指定后端的存储的写入地址
remote_reader:指定后端的存储的读取api地址。
数据存储流程
Prometheus运行后会生成“data”目录,Prometheus内存和硬盘都是以为KB为单位分块存储的。
在Prometheus的世界中,无论是内存还是磁盘,它都是以1KB单位分成块来操作的。
整体流程是 抓取数据 -> 写到head chunk,写满1KB,就再生成新的块,完成的块,是不可再变更的 -> 根据配置文件的设置,有一部份chunk会被保留在内存里,按照LRU算法,定期将块写进磁盘文件内。
安装监控节点
1.node_exporter 安装配置
Node-exporter 可以采集机器(物理机、虚拟机、云主机)的监控指标数据,能够采集到的指标包括cpu、内存、磁盘、网络、文件数等信息。
1.1下载node_exporter包
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
1.2 创建安装目录
mkdir /usr/local/node_exporter
1.3 解压到该目录
tar xvf node_exporter-1.3.1.linux-amd64.tar.gz -C /usr/local/node_exporter
cd /usr/local/node_exporter/
mv node_exporter-1.3.1.linux-amd64/ 1.3.1
2.运行node_exporter
编写service文件,vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=prometheus node_exporter
[Service]
Type=simple
ExecStart=/usr/local/node_exporter/1.3.1/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
MemoryLimit=300M //内存最大占用300M
CPUQuota=100% //最多占用一个CPU线程
[Install]
WantedBy=multi-user.target
重新加载启动文件目录,并设置开机自启
systemctl daemon-reload
systemctl start node_exporter
systemctl enable node_exporter
3.防火墙9100端口放开
iptables -I INPUT -p tcp --dport 9100 -j ACCEPT
4.Prometheus添加node_exporter节点
vim /usr/local/prometheus/2.35.0/prometheus.yml
......
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus" # 任务目标名,可以理解成分组,每个分组包含具体的target组员
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
#- targets: ["localhost:9090"]
- targets: ["10.10.50.211:9100"]
5.查看已监听主机
地址 http://10.10.50.211:9090/targets
Grafana部署
1.下载安装
Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.3-1.x86_64.rpm
yum localinstall -y grafana-enterprise-9.4.3-1.x86_64.rpm
2.添加系统服务
systemctl daemon-reload
systemctl start grafana-server
systemctl enable grafana-server
3.防火墙3000端口放开
iptables -I INPUT -p tcp --dport 3000 -j ACCEPT
4.Grafana登录
grafana默认登录的管理员账号密码都是:admin 默认端口3000
5.Prometheus集成Grafana可视化监控
5.1 创建数据源
添加配置Prometheus数据源,修改Prometheus的URL,保存提交
5.2 导入监控面板
Grafana 官方和社区对已经做好了常用的 DashBoard,可以在官网通过下载json文件或copy id将其导入到自己grafana面板。(熟练后可以自己创建编辑模板)
官网:https://grafana.com/grafana/dashboards/
选择Prometheus数据源,根据需求搜索相关模板。
通过Grafana + 图标导入(import)。输入复制的DashBoard模板id,选择数据源保存即可。
导入完成
alertmanager安装配置
1.Alertmanager介绍
Prometheus会根据配置的参数周期性的对警报规则进行计算, 如果满足警报条件,生产一条警报信息,将其推送到 Alertmanager 组件,Alertmanager 收到警报信息之后,会对警告信息进行处理,进行 分组 Group 并将它们通过定义好的路由 Routing 规则转到 正确的接收器 receiver, 比如 Email Slack 钉钉、企业微信 Robot(webhook) 企业微信 等,最终异常事件 Warning、Error通知给定义好的接收人,其中如钉钉是基于第三方通知来实现的,对于通知人定义是在钉钉的第三方组件中配置。
prometheus触发一条告警的过程:
prometheus—>触发阈值—>超出持续时间—>alertmanager—>分组|抑制|静默—>媒体类型—>邮件|钉钉|微信等。
分组|抑制|静默 概念
-
分组
Grouping 是 Alertmanager 把同类型的警报进行分组,合并多条警报到一个通知中。在生产环境中,特别是云环境下的业务之间密集耦合时,若出现多台 Instance 故障,可能会导致成千上百条警报触发。在这种情况下使用分组机制, 可以把这些被触发的警报合并为一个警报进行通知,从而避免瞬间突发性的接受大量警报通知,使得管理员无法对问题进行快速定位。
举例:就是一个集群部署中,有一半的服务实例不再可以访问数据库,Prometheus中的警报规则配置为在每个服务实例无法与数据库通信时为其发送警报。结果,数百个警报被发送到Alertmanager。作为运维组或者相关业务组的开发人员,可能更关心的是在一个通知中就可以快速查看到哪些服务实例被本次故障影响了。为此,我们对服务所在集群或者服务警报名称的维度进行分组配置,把警报汇总成一条通知时,就不会受到警报信息的频繁发送影响了。
-
抑制
Inhibition指当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。
举例:当警报被触发,通知整个集群不可达,可以配置Alertmanager忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。抑制机制可以通过Alertmanager的配置文件来配置。
-
静默
Silences 提供了一个简单的机制,根据标签快速对警报进行静默处理;对传进来的警报进行匹配检查,如果接受到警报符合静默的配置,Alertmanager 则不会发送警报通知。
以上除了分组、抑制是在 Alertmanager 配置文件中配置,静默是需要在 WEB UI 界面中设置临时屏蔽指定的警报通知。
2.下载安装
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
mkdir /usr/local/alertmanager
tar xvf alertmanager-0.24.0.linux-amd64.tar.gz -C /usr/local/alertmanager/
cd /usr/local/alertmanager
mv alertmanager-0.24.0.linux-amd64/ 0.24.0
TEST
[root@localhost alertmanager]# ./0.24.0/alertmanager --version
alertmanager, version 0.24.0 (branch: HEAD, revision: f484b17fa3c583ed1b2c8bbcec20ba1db2aa5f11)
build user: root@265f14f5c6fc
build date: 20220325-09:31:33
go version: go1.17.8
platform: linux/amd64
3.配置alertmanager告警方式(邮箱、钉钉、微信)
当前测试使用企业微信方式
复制一份源文件cd 0.24.0/ && cp alertmanager.yml alertmanager.yml.bak
重写alertmanager.yml
内容
global:
resolve_timeout: 5m
templates:
# 这里要加载template的文件
- ./templates/*.tmpl
route:
group_by: [alertname]
group_wait: 10s
group_interval: 1m
repeat_interval: 30m
# 这里的名称要上下一致
receiver: prometheus
routes:
# 同上一致
- receiver: prometheus
group_wait: 60s
match:
level: 1
receivers:
# 同上一致
- name: prometheus
webhook_configs:
# 这里的配置是调用adapter服务的接口
- url: http://10.10.50.211:8089/adapter/wx
# 匹配adapter的接口,匹配企业微信prometheus机器人
send_resolved: true
inhibit_rules:
- source_match:
severity: critical
target_match:
severity: warning
equal: [alertname, dev, instance]
http://10.10.50.211:8089/adapter/wx
是webhook-adapter
服务的地址,它是企业微信报警插件,后面会安装它,此处是提前写好的
创建模板配置 mkdir templates && vim templates/wechat.tmpl
define "wechat.default.message"
- if gt (len .Alerts.Firing) 0 -
- range $index, $alert := .Alerts -
- if eq $index 0
==========异常告警==========
告警类型: $alert.Labels.alertname
告警级别: $alert.Labels.severity
告警详情: $alert.Annotations.message $alert.Annotations.description;$alert.Annotations.summary
故障时间: ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"
- if gt (len $alert.Labels.instance) 0
实例信息: $alert.Labels.instance
- end
- if gt (len $alert.Labels.namespace) 0
命名空间: $alert.Labels.namespace
- end
- if gt (len $alert.Labels.node) 0
节点信息: $alert.Labels.node
- end
- if gt (len $alert.Labels.pod) 0
实例名称: $alert.Labels.pod
- end
============END============
- end
- end
- end
- if gt (len .Alerts.Resolved) 0 -
- range $index, $alert := .Alerts -
- if eq $index 0
==========异常恢复==========
告警类型: $alert.Labels.alertname
告警级别: $alert.Labels.severity
告警详情: $alert.Annotations.message $alert.Annotations.description;$alert.Annotations.summary
故障时间: ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"
恢复时间: ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05"
- if gt (len $alert.Labels.instance) 0
实例信息: $alert.Labels.instance
- end
- if gt (len $alert.Labels.namespace) 0
命名空间: $alert.Labels.namespace
- end
- if gt (len $alert.Labels.node) 0
节点信息: $alert.Labels.node
- end
- if gt (len $alert.Labels.pod) 0
实例名称: $alert.Labels.pod
- end
============END============
- end
- end
- end
- end
使用amtool检查配置
[root@localhost 0.24.0]# ./amtool check-config ./alertmanager.yml
Checking './alertmanager.yml' SUCCESS
Found:
- global config
- route
- 1 inhibit rules
- 1 receivers
- 1 templates
SUCCESS
4.添加系统服务
新建文件并写入内容vim /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=alertmanager is service
[Service]
Type=simple
ExecStart=/usr/local/alertmanager/0.24.0/alertmanager --config.file=/usr/local/alertmanager/0.24.0/alertmanager.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
配置自启
systemctl daemon-reload
systemctl restart alertmanager
systemctl enable alertmanager
5.Alertmanager登录
http://10.10.50.211:9093/#/alerts
6.webhook-adapter安装
因为通过docker安装,所以先安装好docker
curl -sSL https://get.daocloud.io/docker | sh
systemctl start docker
systemctl daemon-reload
查看docker版本
[root@localhost 0.24.0]# docker -v
Docker version 23.0.1, build a5ee5b1
安装docker-compose
yum -y install docker-compose
创建docker-composer的webhook-adapter.yml存放文件目录,并写入内容
mkdir /usr/local/docker_component
cd /usr/local/docker_component
vim docker-compose.yml
>>>docker-compose.yml内容>>>
version: '3'
services:
webhook-adapter:
image: guyongquan/webhook-adapter:latest
version: '3'
services:
webhook-adapter:
image: guyongquan/webhook-adapter:latest
container_name: webhook-adapter
hostname: webhook-adapter
ports:
- "8089:80"
restart: always
command:
#/wx=后面是匹配企业微信机器人的webhook地址
- "--adapter=/app/prometheusalert/wx.js=/wx=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=cc7026b1-xxx-xxxx-xxxx-xxxxxxxxxx"
启动webhook-adapter
,在/usr/local/docker_component
目录下执行
docker-compose up -d
查看容器服务
[root@localhost docker_component]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
713e93df0b95 guyongquan/webhook-adapter:latest "node /app/index.js …" 2 hours ago Up 2 hours 0.0.0.0:8089->80/tcp, :::8089->80/tcp webhook-adapter
如果容器需要销毁重建,可以执行
docker-compose up -d --force-recreate --build
查看webhook adapter是否启动成功
[root@localhost docker_component]# curl http://10.10.50.211:8089
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot GET /</pre>
</body>
</html>
模拟测试
1.Prometheus配置
修改Prometheus配置文件 vim /usr/local/prometheus/2.35.0/prometheus.yml
......
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
- 10.10.50.211:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
- rules/*.yml
......
2.创建报警规则
mkdir /usr/local/prometheus/2.35.0/rules
写入规则 vim /usr/local/prometheus/2.35.0/rules/service_status.yml
groups:
- name: 实例存活告警规则
rules:
- alert: 实例存活告警
expr: up == 0
for: 1m
labels:
user: prometheus
severity: warning
annotations:
summary: "主机宕机 !!!"
description: "该实例主机已经宕机超过一分钟了。"
- name: 内存报警规则
rules:
- alert: 内存使用率告警
expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 80
for: 1m
labels:
severity: warning
annotations:
summary: "服务器可用内存不足。"
description: "内存使用率已超过80%(当前值:{{ $value }}%)"
- name: CPU报警规则
rules:
- alert: CPU使用率告警
expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]) )) * 100 > 80
for: 1m
labels:
severity: warning
annotations:
summary: "CPU使用率正在飙升。"
description: "CPU使用率超过80%(当前值:{{ $value }}%)"
- name: 磁盘使用率报警规则
rules:
- alert: 磁盘使用率告警
expr: 100 - node_filesystem_free_bytes{fstype=~"xfs|ext4"} / node_filesystem_size_bytes{fstype=~"xfs|ext4"} * 100 > 80
for: 20m
labels:
severity: warning
annotations:
summary: "硬盘分区使用率过高"
description: "分区使用大于80%(当前值:{{ $value }}%)"
3.重新加载Prometheus配置
curl -X POST http://localhost:9090/-/reload
4.检查告警配置
登陆prometheus的UI界面,查看Alerts规则
5. shell方法测试企业微信的推送
cd /usr/local/alertmanager/0.24.0/ && vim test_alert.sh
写入如下内容
#!/usr/bin/env bash
alerts_message='[
{
"labels": {
"alertname": "磁盘已满",
"dev": "sda1",
"instance": "实例1",
"msgtype": "testing"
},
"annotations": {
"info": "程序员小王提示您:这个磁盘sda1已经满了,快处理!",
"summary": "请检查实例示例1"
}
},
{
"labels": {
"alertname": "磁盘已满",
"dev": "sda2",
"instance": "实例1",
"msgtype": "testing"
},
"annotations": {
"info": "程序员小王提示您:这个磁盘sda2已经满了,快处理!",
"summary": "请检查实例示例1",
"runbook": "以下链接http://test-url应该是可点击的"
}
}
]'
curl -XPOST -d"$alerts_message" http://127.0.0.1:9093/api/v1/alerts
手动测试
[root@localhost 0.24.0]# sh test_alert.sh
{"status":"success"}[root@localhost 0.24.0]#
企业微信收到警告,等一段时间再收到警告恢复
也可以使用stress-ng做压测
我当前机器是2核4G
stress-ng --vm 2 --vm-bytes 2G --vm-hang 100 --timeout 100s
开启2个进程分配内存,每次分配2GB内存,保持100秒后释放,100秒后退出。