Kubernetes监控Prometheus
Prometheus概述
Prometheus是一个开源系统监控和警报工具包,最初是在SoundCloud上构建的。自2012年成立以来,许
多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发者和用户社区。
Prometheus现在是一个独立的开源项目,独立于任何公司进行维护。为了强调这一点,并澄清项目的治
理结构,Prometheus于2016年加入云原生计算基金会,作为继Kubernetes之后的第二个托管项目。
我们可以简单的理解Prometheus是一个监控系统同时也是一个时间序列数据库。
推荐阅读:
官网地址:
https://prometheus.io
官方文档:
https://prometheus.io/docs/introduction/overview/
GitHub地址:
https://github.com/prometheus
如下图所示,展示了普罗米修斯(prometheus)的建筑和它的一些生态系统组成部分。
(1)#Prometheus server:
prometheus的服务端,负责收集指标和存储时间序列数据,并提供查询接口。
(2)#exporters:
如果想要监控,前提是能获取被监控端数据,并且这个数据格式必须遵循Prometheus数据模型,这样才能识别和采集,一般使用exporter数据采集器(类似于zabbix_agent端)提供监控指标数据。
exporter数据采集器,除了官方和GitHub提供的常用组件exporter外,我们也可以为自己自研的产品定制exporters组件哟。
(3)#Pushgateway:
短期存储指标数据,主要用于临时性的任务。比如备份数据库任务监控等。
本质上我们可以理解为Pushgateway可以帮咱们监控自定义的监控项,这需要咱们自己编写脚本来推送到Pushgateway端,而后由Prometheus server从Pushgateway去pull监控数据。
换句话说,请不要被官方的架构图蒙骗了,咱们完全可以基于Pushgateway来监控咱们自定义的监控项哟,这些监控项完全可以是长期运行的呢!
(4)#Service discovery:
服务发现,例如我们可以配置动态的服务监控,无需重启Prometheus server实例就能实现动态监控。
(5)#Alertmanager:
支持报警功能,比如可以支持基于邮件,微信,钉钉报警。
据网友反馈该组件在生产环境中存在缺陷,因此我们可以考虑使用Grafana来展示并实现报警功能。
(6)#Prometheus Web UI
Prometheus比较简单的Web控制台,通常我们可以使用grafana来集成做更漂亮的Web展示哟。
#温馨提示:
大多数Prometheus组件都是用Go编写的,这使得它们易于构建和部署为静态二进制文件。
Prometheus安装方式
1)docker docker-compose
2)K8S资源清单
3)Prometheus-operator
4)二进制
prometheus部署 Kubernetes资源清单方式
cat > prom-cm.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: prom-config
namespace: prom
data:
prometheus.yml: |
global: #全局配置
scrape_interval: 15s #抓取数据间隔时间
scrape_timeout: 15s #抓取数据超时时间
scrape_configs: #抓取配置
- job_name: 'prometheus' #任务名称
static_configs: #静态配置
- targets: ['localhost:9090'] #抓取数据节点的IP端口
EOF
PV和PVC
cat > prom-pv-pvc.yaml <<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: prom-localhost
labels:
app: prometheus
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
storageClassName: local-storage
local:
path: /data/k8s/prometheus
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- elkstack02
persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: prom-data
namespace: prom
spec:
selector:
matchLabels:
app: prometheus
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: local-storage
EOF
RBAC
cat > prom-rbac.yml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: prom
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups:
- ""
resources:
- nodes
- services
- endpoints
- pods
- nodes/proxy
verbs:
- get
- list
- watch
- apiGroups:
- "extensions"
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
- nodes/metrics
verbs:
- get
- nonResourceURLs:
- /metrics
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus
namespace: prom
EOF
Deployment
cat > prom-dp.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
namespace: prom
labels:
app: prometheus
spec:
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
serviceAccountName: prometheus
volumes:
- name: data
persistentVolumeClaim:
claimName: prom-data
- name: config-volume
configMap:
name: prom-config
initContainers:
- name: fix-permissions
image: busybox
command: [chown, -R, "nobody:nobody", /prometheus]
volumeMounts:
- name: data
mountPath: /prometheus
containers:
- name: prometheus
image: prom/prometheus:v2.24.1
args:
- "--config.file=/etc/prometheus/prometheus.yml" # 配置文件路径
- "--storage.tsdb.path=/prometheus" # 数据保存路径
- "--storage.tsdb.retention.time=24h" # 数据保留,默认15天
- "--web.enable-admin-api" # 控制对admin HTTP API访问
- "--web.enable-lifecycle" # 支持热更新
ports:
- containerPort: 9090
volumeMounts:
- name: config-volume
mountPath: /etc/prometheus
- name: data
mountPath: /prometheus
resources:
requests:
cpu: 100m
memory: 512Mi
limits:
cpu: 100m
memory: 512Mi
EOF
Service
cat > prom-svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: prometheus
namespace: prom
labels:
app: prometheus
spec:
selector:
app: prometheus
ports:
- name: web
port: 9090
targetPort: http
type: ClusterIP
EOF
ingress
cat > prom-ingress.yaml <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometheus
namespace: prom
labels:
app: prometheus
spec:
rules:
- host: prom.drz.com
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: prometheus
port:
number: 9090
EOF
二进制部署prometheus
环境准备
主机 | IP | 角色 | 应用 |
---|---|---|---|
nfs | 10.0.0.91 | 服务端 | Prometheus-server、grafana、node_export、alertmanager、pushgateway |
master-1 | 10.0.0.110 | 客户端 | node_exporter |
node-1 | 10.0.0.111 | 客户端 | node_exporter |
node-2 | 10.0.0.112 | 客户端 | node_exporter |
部署prometheus
下载地址TP
# 下载应用
pushgateway-1.6.2.linux-amd64.tar.gz
alertmanager-0.26.0.linux-amd64.tar.gz
node_exporter-1.6.1.linux-amd64.tar.gz
prometheus-2.47.0.linux-amd64.tar.gz
# 创建站点目录
[root@nfs ~]# mkdir /app
# 解压
[root@nfs ~]# tar xf prometheus-2.47.0.linux-amd64.tar.gz -C /app/
[root@nfs ~]# tar xf alertmanager-0.26.0.linux-amd64.tar.gz -C /app/
[root@nfs ~]# tar xf node_exporter-1.6.1.linux-amd64.tar.gz -C /app/
[root@nfs ~]# tar xf pushgateway-1.6.2.linux-amd64.tar.gz -C /app/
# 改名
[root@nfs app]# mv alertmanager-0.26.0.linux-amd64/ alertmanager-0.26.0
[root@nfs app]# mv node_exporter-1.6.1.linux-amd64/ node_exporter-1.6.1
[root@nfs app]# mv prometheus-2.47.0.linux-amd64/ prometheus-2.47.0
[root@nfs app]# mv pushgateway-1.6.2.linux-amd64/ pushgateway-1.6.2
# 软链接
[root@nfs app]# ln -s /app/prometheus-2.47.0/ /app/prometheus
# 修改配置文件
[root@nfs ~]# vim /app/prometheus/prometheus.yml
global: ## 全局配置模块
scrape_interval: 15s ### 静态配置,获取后端数据的间隔时间 15s获取一次
evaluation_interval: 15s ### 数据与触发器值进行匹配(数据评估)15s评估一次
alerting: ## 告警模块
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
rule_files: ## 告警规则(触发器)
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs: ## 后端静态配置
- job_name: "prometheus" ### 任务名称
static_configs: ### 静态配置
- targets: ["10.0.0.91:9090"] ### 目标地址和端口
# 启动普罗米修斯
[root@nfs prometheus-2.47.0]# ./prometheus --config.file="prometheus.yml"
浏览器访问10.0.0.91:9090
查看后端数据
部署node_exporter(所有客户端都需要执行)
# 下载
node_exporter-1.6.1.linux-amd64.tar.gz
# 创建站点目录
[root@master-1 ~]# mkdir /app
# 解压
[root@master-1 ~]# tar xf node_exporter-1.6.1.linux-amd64.tar.gz -C /app/
# 改名
[root@master-1 ~]# mv /app/node_exporter-1.6.1.linux-amd64/ /app/node_exporter-1.6.1
# 软连接
[root@master-1 ~]# ln -s /app/node_exporter-1.6.1/ /app/node_exporter
# 启动node_exporter
[root@master-1 node_exporter]# ./node_exporter
prometheus关联node_exporter
[root@nfs ~]# vim /app/prometheus/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"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["10.0.0.91:9090"]
- job_name: "master_node_exporter"
static_configs:
- targets: ["10.0.0.110:9100"]
# 重新启动
[root@nfs prometheus-2.47.0]# ./prometheus --config.file="prometheus.yml"
prometheus动态发现
动态发现官网:TP
# 修改配置文件
[root@nfs ~]# vim /app/prometheus/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"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["10.0.0.91:9090"]
- job_name: "master_node_exporter"
static_configs:
- targets: ["10.0.0.110:9100"]
- job_name: "dong tai fa xian"
file_sd_configs:
- files:
- /app/prometheus/file_sd/all.yml
refresh_interval: 5s
# 创建目录
[root@nfs ~]# mkdir /app/prometheus/file_sd/
# 编辑动态发现文件
[root@nfs ~]# vim /app/prometheus/file_sd/all.yml
[
{
"targets": ["10.0.0.111:9100","10.0.0.112:9100"]
}
]
# 重新启动
[root@nfs prometheus]# ./prometheus --config.file="prometheus.yml"
docker部署cadvisor并使用prometheus动态发现
# 编辑动态发现文件
[root@nfs ~]# vim /app/prometheus/file_sd/all.yml
[
{
"targets": ["10.0.0.111:9100","10.0.0.112:9100"],
"labels": {
"name": "node_exporter"
}
},
{
"targets": ["10.0.0.111:8080"],
"labels": {
"name": "cAdvisor"
}
}
]
# docker启动cadvisor
[root@node-1 node_exporter]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/zls/data/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest
Prometheus管理接口
## 健康状态
[root@node-1 ~]# curl -XGET http://10.0.0.91:9090/-/healthy
Prometheus Server is Healthy.
## 查看redy
[root@node-1 ~]# curl -XGET http://10.0.0.91:9090/-/ready
Prometheus Server is Ready.
## 启动Prometheus
[root@web01 prometheus]# ./prometheus --config.file="prometheus.yml" --web.enable-lifecycle
## 重新加载配置
[root@node-1 ~]# curl -XPUT http://10.0.0.91:9090/-/reload
## 退出
[root@node-1 ~]# curl -XPUT http://10.0.0.91:9090/-/quit
prometheus自定义监控
# 下载应用
pushgateway-1.6.2.linux-amd64.tar.gz
# 解压
[root@nfs ~]# tar xf pushgateway-1.6.2.linux-amd64.tar.gz -C /app/
# 改名
[root@nfs app]# mv pushgateway-1.6.2.linux-amd64/ pushgateway-1.6.2
# 软链接
[root@nfs app]# [root@nfs ~]# ln -s /app/pushgateway-1.6.2/ /app/pushgateway
# 启动
[root@nfs pushgateway]# ./pushgateway
配置prometheus拉取pushgateway数据
# 编辑动态发现文件
[root@nfs file_sd]# vim /app/prometheus/file_sd/all.yml
[
{
"targets": ["10.0.0.111:9100","10.0.0.112:9100"],
"labels": {
"name": "node_exporter"
}
},
{
"targets": ["10.0.0.111:8080"],
"labels": {
"name": "cAdvisor"
}
},
{
"targets": ["10.0.0.91:9091"],
"labels": {
"name": "pushgateway"
}
}
]
Prometheus自定义监控脚本
[root@master-1 ~]# mkdir script
-----------------------------------------------------------------------------------------------
## 单行数据版
cat > tcp_conn.sh <<'EOF'
#!/bin/bash
#instance_name=`hostname -i` # 该指令要求hosts文件必须有解析
# instance_name=`hostname -f | cut -d '.' -f 1` # 以点号作为分割只取第一段作为本机的主机标签
INSTANCE_NAME=`hostname -s`
# 要求机器名不能是"localhost"不然标签就没有区分了
if [ $INSTANCE_NAME == "localhost" ]
then
echo "Must FQDN hostname"
exit
fi
# 定义Prometheus抓取的KEY值,用于保存TCP的wait状态相关的连接(connections)
METRICS_NAME="ljy_tcp_conn"
# 通过netstat工具抓取connected链接的数量
TCP_CONN_VALUE=`netstat -an| grep -i connected | wc -l`
# 发送数据
echo "$METRICS_NAME $TCP_CONN_VALUE" | curl --data-binary @- http://10.0.0.91:9091/metrics/job/sh-linux/instance/$INSTANCE_NAME
EOF
-----------------------------------------------------------------------------------------------
## 多行数据
#!/bin/bash
instance_name=`hostname -f | cut -d '.' -f 1` # 以点号作为分割只取第一段作为本机的主机标签
# 要求机器名不能是"localhost"不然标签就没有区分了
if [ $instance_name == "localhost" ]
then
echo "Must FQDN hostname"
exit
fi
# 获取所有运行的容器名称
allname=`docker ps --format "{{.Names}}"`
function dockerruntime(){
# 获取各个容器的启动时间
t=`docker inspect -f '{{.State.StartedAt}}' $1`
# 将时间转成时间戳
t1=`date +%s -d "$t"`
# 获取当前时间的时间戳
t2=`date +%s`
# 计算运行时间
let tt=$t2-$t1
echo $tt
return $tt
}
# 将需要往pushgateway上传的数据写入"ljy_temp.log"文件
echo """# TYPE docker_runtime gauge
# HELP docker_runtime time sec""" > ljy_temp.log
for i in ${allname}
do
t=`dockerruntime $i`
echo "ljy_docker_runtime{name=\"$i\"} $t" >> ljy_temp.log # 格式化写入数据
done
# 修改地址和参数名向特定的url上传数据,数据在ljy_temp.log文件中
curl --data-binary "@ljy_temp.log" http://10.0.0.91:9091/metrics/job/docker_runtime/instance/$instance_name
# 清空临时文件
rm -f ljy_temp.log
-------------------------------------------------------------------------------------
systemd管理prometheus
vim /lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=simple
User=root
ExecStart=/app/prometheus/prometheus --config.file=/app/prometheus/prometheus.yml
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
systemd管理Pushgateway
vim /lib/systemd/system/pushgateway.service
[Unit]
Description=Pushgateway
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=simple
User=root
ExecStart=/app/pushgateway/pushgateway
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
systemd管理node_exporter
vim /lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=simple
User=root
ExecStart=/app/node_exporter/node_exporter
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
获取TCP11种状态
#!/bin/bash
# 获取所有运行的容器名称
allname=
# 获取TCP11种状态的函数
tcp_status(){
netstat -ant|grep -ci "$1"
}
# 将需要往pushgateway上传的数据写入"ljy_temp.log"文件
echo """# TYPE docker_runtime gauge
# HELP docker_runtime time sec""" > ljy_temp.log
for i in ${allname[*]};do
count=`tcp_status $1`
echo "tcp_status{name=\"$i\"} $count" >> ljy_tcp.log # 格式化写入数据
done
# 修改地址和参数名向特定的url上传数据,数据在ljy_temp.log文件中
curl --data-binary "@ljy_temp.log" http://10.0.0.91:9091/metrics/job/docker_runtime/instance/$HOSTNAME
# 清空临时文件
rm -f ljy_tcp.log
redis info
#!/bin/bash
allname=`redis-cli info|grep "^[a-z]"|awk -F: '{print $1}'`
echo """# TYPE tcp_status gauge
# HELP tcp_status time sec""" > zls_redis.log
for i in ${allname};do
value=`redis-cli info|grep -w "$i"|awk -F: '{print $2}'`
echo "redis_info{name=\"$i\"} $value" >> zls_redis.log # 格式化写入数据
done
# 修改地址和参数名向特定的url上传数据,数据在ljy_redis.log文件中
curl --data-binary "@ljy_redis.log" http://10.0.0.7:9091/metrics/job/tcp_status/instance/$HOSTNAME
通过CPU认识prometheus语法(PQL)
node_cpu_seconds_total{mode='idle'}
node_cpu_seconds_total{mode=~'i.*'}
node_cpu_seconds_total{mode!='idle'}
node_cpu_seconds_total{mode!~'i.*'}
>
<
<=
>=
指标类型
prometheus监控中对于采集过来的数据统一称为metrics数据。
metrics是一种对采样数据的总称,其并不代表一种具体的数据格式,而是一种对于度量计算单位的抽象。
当我们需要为某个系统或者某个服务做监控,统计时,就需要用到metrics。
gauge: 瞬时值,跟zabbix last()(瞬间状态)
Gauges是最简单的度量指标,只有一个简单的返回值,或者叫瞬时状态。例如,我们想衡量一个待处理队列中任务的个数,这个个数是会变化的
当我们要监控硬盘容量或者内存的使用量,那么就应该使用Gauges的metrics格式来衡量,因为硬盘的容量或者内存的使用量是随时间的推移,不断瞬时且无规则变化的。
这种变化没有规律,当前是多少,采集回来就是多少
counter: 计数器类型
Counters就是计数器,从数据量0开始积累计算,在理想情况下,只能是永远的增长,不会降低(一些特殊情况另说,比如说粉丝数,未必就是只增不减。)
比如统计一小时,一天,一周,一个月的用户的访问量,这就是一个累加的操作。
histograms: 统计数据分布情况。
比如最小值,最大值,中间值,还有中位数,75百分位,90百分位,95百分位,98百分位,99百分位和99.9百分位的值。
很显然,这是一种特殊的metrics数据类型,代表的是一种近似百分比估算数值。
summary: 统计数据分布情况
因为histogram在客户端就是简单的分桶计数,在prometheus服务端基于这么有限的数据做百分位估算,所以的确不是很准确,summary就是解决百分位准确的问题而来的。
我们可以简单理解summary是Histogram的扩展类型,如果想要清楚的了解histograms和summary的更多细节,可自行查阅相关的文档。
promQL数据类型
即时向量:特定或全部的时间序列集合上,具有相同时间戳的一组样本称为即时向量。
范围向量:特定或全部的时间序列集合上,在指定的同一范围内的所有样本值。
标量:一个浮点型的数据值
字符串:支持使用单引号,双引号或反引号进行引用,但反引号中不会转移字符进行转义。
Prometheus函数
增量函数(counter类型)
node_cpu_seconds_total
# 在prometheus中是用来针对Counter这种持续增长的数值,截取其中的一段时间的增量。
# 一分钟内所有机器的cpu内核态增长量
increase(node_cpu_seconds_total{mode="system"}[1m])
sum函数(求和)
# cpu运行时间总和
sum(node_cpu_seconds_total{instance="10.0.0.110:9100"})
# cpu一分钟内运行时间增量总和
sum(increase(node_cpu_seconds_total{instance="10.0.0.110:9100"}[1m]))
by函数(分组)
group by
sum(increase(node_cpu_seconds_total[1m])) by(instance)
{instance="10.0.0.110:9100"}
58.133333333281726
{instance="10.0.0.111:9100"}
59.06666666666579
{instance="10.0.0.112:9100"}
59.14666666666904
rate函数(平均值)
# 获取CPU总使用时间在一分钟内的增加总量并除以60秒,计算的是每秒的增量。
rate(node_cpu_seconds_total[1m])
# 获取主机为10.0.0.111:9100的CPU总使用时间在一分钟内的增加总量并除以60秒,计算的是每秒的增量。
rate(node_cpu_seconds_total{instance="10.0.0.111:9100"}[1m])
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="idle", name="node_exporter"}
0.9482222222221833
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="iowait", name="node_exporter"}
0
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="irq", name="node_exporter"}
0
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="nice", name="node_exporter"}
0
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="softirq", name="node_exporter"}
0.00022222222222221746
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="steal", name="node_exporter"}
0
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="system", name="node_exporter"}
0.009111111111111667
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="user", name="node_exporter"}
0.02688888888888717
topk函数(排名)
# 取出CPU平均每秒增量的前三名
topk(3,rate(node_cpu_seconds_total[1m]))
count函数(统计)
把数值符合条件的,输出数目进行累加。一般用它进行一些模糊的监控判断。
比如说企业有100台服务器,那么只有10台服务器CPU使用率高于80%的时候,这个时候不需要报警,当符合条件时,才需要报警
# 统计运行中的容器数量
count(container_last_seen{job=~"$job",instance=~"$instance",image!=""})
安装grafana
[root@nfs system]# yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-10.1.4-1.x86_64.rpm
部署alertmanager
# 下载
alertmanager-0.26.0.linux-amd64.tar.gz
# 创建站点目录
[root@master-1 ~]# mkdir /app
# 解压
[root@master-1 ~]# tar xf alertmanager-0.26.0.linux-amd64.tar.gz -C /app/
# 改名
[root@master-1 ~]# mv /app/alertmanager-0.26.0.linux-amd64 /app/alertmanager-0.26.0
# 软连接
[root@master-1 ~]# ln -s /app/alertmanager-0.26.0 /app/alertmanager
# 编写alertmanager告警配置
global:
resolve_timeout: 5m
smtp_from: 'xxxxxxxx@qq.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: 'xxxxxxxx@qq.com'
smtp_auth_password: 'xxxxxxxxxxxxxxx'
smtp_require_tls: false
smtp_hello: 'qq.com'
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval: 5m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'xxxxxxxx@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
# 启动node_exporter
[root@master-1 node_exporter]# ./alertmanager --config.file=alertmanager.yml
alertmanager告警配置
global:
resolve_timeout: 5m
smtp_from: 'xxxxxxxx@qq.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: 'xxxxxxxx@qq.com'
smtp_auth_password: 'xxxxxxxxxxxxxxx'
smtp_require_tls: false
smtp_hello: 'qq.com'
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval: 5m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'xxxxxxxx@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
# 相关参数说明:
global:
## 解析超时时间
resolve_timeout: 5m
## 发件人邮箱地址
smtp_from: 'xxxxxxxx@qq.com'
## 邮箱的服务器的地址及端口,例如'smtp.qq.com:465'
smtp_smarthost: 'smtp.qq.com:465'
## 发送人的邮箱用户名
smtp_auth_username: 'xxxxxxxx@qq.com'
## 发件人的邮箱密码
smtp_auth_password: 'xxxxxxxxxxxxxxx'
## 是否基于tls加密
smtp_require_tls: false
## 邮箱服务器,例如: 'qq.com'
smtp_hello: 'qq.com'
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
## 重复报警的间隔时间,如果没有解决报警问题,则会间隔指定时间一直触发报警,比如:5m。
repeat_interval: 5m
receiver: 'email'
receivers:
## 定义接收者的名称,注意这里的name要和上面的route对应,例如:'email'
- name: 'email'
email_configs:
## 邮箱发给谁
- to: 'xxxxxxxx@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
## 匹配报警级别,例如:'critical'
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
# 启动node_exporter
[root@master-1 node_exporter]# ./alertmanager --config.file=alertmanager.yml
修改prometheus配置
[root@nfs alertmanager]# vim /app/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
- 10.0.0.91:9093
rule_files:
- "/app/prometheus/gaojing/mem_rules.yml"
- "/app/prometheus/gaojing/cpu_rules.yml"
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["10.0.0.91:9090"]
- job_name: "master_node_exporter"
static_configs:
- targets: ["10.0.0.110:9100"]
- job_name: "dong tai fa xian"
file_sd_configs:
- files:
- /app/prometheus/file_sd/all.yml
refresh_interval: 5s
## 重启prometheus
[root@nfs alertmanager]# systemctl restart prometheus
## 编写告警规则文件
groups:
- name: node-up
rules:
- alert: node-up
expr: user_count{instance='10.0.0.91:9091'} > 3
for: 15s
labels:
severity: 1
team: node
annotations:
summary: "{{ $labels.instance }}用户超过3个"
## CPU使用率
(1- (sum(node_cpu_seconds_total{cpu='0',instance='10.0.0.110:9100',mode='idle'})/sum(node_cpu_seconds_total{cpu='0',instance='10.0.0.110:9100'}))) * 100