一、prometheus
系统监控和报警系统
1.创建映射文件
- /xxx/config
- /xxx/data
config下创建 prometheus.yml、rules.yml
# prometheus.yml
global:
scrape_interval: 60s #默认抓取周期,可用单位ms,smhdwy 设置每15s采集数据一次,默认一分钟
evaluation_interval: 60s #估算规则的默认周期 # 每15秒计算一次规则。默认1分钟
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets: ["ip:9093"]
rule_files:
- "/etc/prometheus/rules.yml"
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['ip:9090']
labels:
instance: prometheus
- job_name: node
static_configs:
- targets: ['ip:9100']
labels:
instance: node
- job_name: cadvisor
static_configs:
- targets: ['ip:8888']
labels:
instance: cadvisor
- job_name: mysqld
static_configs:
- targets: ['ip:9104']
labels:
instance: mysqld
- job_name: elasticsearch
static_configs:
- targets: ['ip:9114']
labels:
instance: elasticsearch
- job_name: kibana
params:
module:
- http_2xx
target:
- ip:5601
metrics_path: /probe
static_configs:
- targets: ['ip:9115']
labels:
instance: kibana
- job_name: logstash
params:
module:
- tcp_connect
target:
- ip:5044
metrics_path: /probe
static_configs:
- targets: ['ip:9115']
labels:
instance: logstash
- job_name: filebeat
params:
module:
- tcp_connect
target:
- ip:5066
metrics_path: /probe
static_configs:
- targets: ['ip:9115']
labels:
instance: filebeat
# rules.yml
# name: 指定组的名字,在这个规则文件中必须要唯一。
# alert: 指定告警的名字,在组中需要唯一。
# expr: 告警表达式, 执行结果为true时,表示需要告警。表达式遵循PromQL语法。
# for:代表超过多少时间才认为需要告警(即告警表达式成立需要持续的时间)。
# annotations:描述
groups:
- name: Node
rules:
- alert: NodeMemoryUsage
expr: 100 - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes) / node_memory_MemTotal_bytes*100 > 80
for: 1m
labels:
level: Warning
annotations:
summary: "内存使用率过高"
description: "{{ $labels.job }}内存使用率大于 80% (当前值: {{ $value }})"
- alert: NodeCpuUsage
expr: (1-((sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)) / (sum(increase(node_cpu_seconds_total[1m])) by (instance)))) * 100 > 70
for: 1m
labels:
level: Warning
annotations:
summary: "CPU使用率过高"
description: "{{ $labels.job }}CPU使用率大于 70% (当前值: {{ $value }}"
- alert: NodeDiskUsage
expr: 100 - node_filesystem_free_bytes{fstype=~"xfs|ext4"} / node_filesystem_size_bytes{fstype=~"xfs|ext4"} * 100 > 80
for: 1m
labels:
level: Warning
annotations:
summary: "分区使用率过高"
description: "{{ $labels.job }}分区使用大于 80% (当前值: {{ $value }}"
- alert: 产品node
expr: up {job="node"} == 0
for: 1m
labels:
level: Error
annotations:
summary: "服务连接失败"
description: "监控的目标已丢失,请检查{{ $labels.job }}服务或{{ $labels.job }}_exporeer服务"
- alert: TCP
expr: node_netstat_Tcp_CurrEstab > 1000
for: 1m
labels:
level: Warning
annotations:
summary: "TCP连接过高"
description: "{{ $labels.job }}连接大于 1000 (当前值: {{$value}})"
- alert: IO
expr: 100 - (avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100) < 60
for: 1m
labels:
level: Warning
annotations:
summary: "流入磁盘IO使用率过高"
description: "{{ $labels.job }}流入磁盘IO大于60% (当前值:{{$value}})"
- name: ELFK
rules:
- alert: elasticsearch
expr: elasticsearch_cluster_health_up == 0
for: 0m
labels:
level: Error
annotations:
summary: "服务连接失败"
description: "监控的目标已丢失,请检查{{ $labels.job }}服务或{{ $labels.job }}_exporeer服务"
- alert: EsCpuUsed
expr: es_os_cpu_percent > 80
for: 5m
labels:
level: Error
annotations:
summary: "CPU使用率过高"
description: "{{ $labels.job }}CPU使用高于 80%,当前 {{$value}}%"
- alert: EsJvmHeapMemUsed
expr: es_jvm_mem_heap_used_percent > 75
for: 10m
labels:
level: Warning
annotations:
summary: "Jvm堆内存使用率过高"
description: "{{ $labels.job }}使用的Jvm堆内存高于 75%,当前 {{$value}}%"
- alert: EsDiskUsed
expr: ceil((1 - es_fs_path_available_bytes / es_fs_path_total_bytes) * 100 ) > 90
for: 5m
labels:
level: Warning
annotations:
summary: "磁盘使用率过高"
description: "{{ $labels.job }}磁盘使用率高于 90%,当前 {{$value}}%"
- alert: kibana
expr: (up {job = "kibana"} == 1) and (probe_success == 0)
for: 0m
labels:
level: Error
annotations:
summary: "服务连接失败"
description: "监控的目标已丢失,请检查{{ $labels.job }}服务或blackbox-exporter服务"
- alert: logstash
expr: (up {job = "logstash"} == 1) and (probe_success == 0)
for: 0m
labels:
level: Error
annotations:
summary: "服务连接失败"
description: "监控的目标已丢失,请检查{{ $labels.job }}服务或blackbox-exporter服务"
- alert: filebeat
expr: (up {job = "filebeat"} == 1) and (probe_success == 0)
for: 0m
labels:
level: Error
annotations:
summary: "服务连接失败"
description: "监控的目标已丢失,请检查{{ $labels.job }}服务或blackbox-exporter服务"
- name: other
rules:
- alert: cadvisor
expr: up {job="cadvisor"} == 0
for: 0m
labels:
level: Error
annotations:
summary: "服务连接失败"
description: "监控的目标已丢失,请检查{{ $labels.job }}服务"
- name: mysql
rules:
- alert: mysqld
expr: up {job="mysqld"} == 0
for: 0m
labels:
level: Error
annotations:
summary: "服务连接失败"
description: "监控的目标已丢失,请检查{{ $labels.job }}服务或{{ $labels.job }}_exporter服务"
- alert: 最大连接数
expr: mysql_global_status_max_used_connections > mysql_global_variables_max_connections * 0.8
for: 1m
labels:
level: Warning
annotations:
summary: "超过80%的最大连接数"
description: "{{ $labels.job }}使用的连接数已经超过了的最大连接数的80%以上"
2.启动命令
docker run -d --name prometheus --network test--restart=always --privileged=true -e TZ=Asia/Shanghai \
-p 9090:9090 \
-v /xxx/config/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /xxx/config/rules.yml:/etc/prometheus/rules.yml \
-v /xxx/data:/prometheus \
bitnami/prometheus
3.访问地址
# 主页
http://ip:9090/
# 配置文件
http://ip:9090/config
# 监控信息
http://ip:9090/metrics
二、cadvisor
对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况
docker run -d --name cadvisor --network test--restart=always --privileged=true -e TZ=Asia/Shanghai \
-p 8888:8080 \
-v /:/rootfs:ro \
-v /var/run:/var/run:rw \
-v /sys/fs/cgroup/cpu,cpuacct:/sys/fs/cgroup/cpuacct,cpu \
-v /sys/fs/cgroup/memory:/sys/fs/cgroup/memory \
-v /var/lib/docker/:/var/lib/docker:ro \
google/cadvisor
访问地址
# 查看prometheus监控指标
http://ip:8888/metrics
# 查看容器信息
http://ip:8888/containers/
三、exporter
探针:是Prometheus的一类数据采集组件的总称。它负责从目标处搜集数据,并将其转化为Prometheus支持的格式。与传统的数据采集组件不同的是,它并不向中央服务器发送数据,而是等待中央服务器主动前来抓取。抓取什么样的数据,就需要什么类型的exporter,比如说抓取mysql状态的数据,就需要mysqld_exporter。
不同服务对应的exporter官网:
https://prometheus.io/docs/instrumenting/exporters/
3.1 mysqld-exporter:
# 连接数据库服务器
mysql -u root -p
# 降低MySQL8 密码规则策略,或者按规则设置密码
set global validate_password.policy=LOW;
# 创建exporter用户,密码为Prometheus,使用max_user_connections参数来限制exporter用户最大连接数,避免监控引起数据库过载
# “%”,表示一组主机,即对所有主机开放权限
CREATE USER 'exporter'@'%' IDENTIFIED BY 'Prometheus' WITH MAX_USER_CONNECTIONS 5;
# 修改密码
ALTER USER 'exporter'@'%' IDENTIFIED WITH mysql_native_password BY 'Prometheus';
# 授权
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
flush privileges;
docker run -d --name mysqld-exporter --network test--restart=always --privileged=true -e TZ=Asia/Shanghai \
-p 9104:9104 \
-e DATA_SOURCE_NAME="exporter:Prometheus@(ip:3306)/" prom/mysqld-exporter
3.2 node-exporter
用于采集类UNIX内核的硬件以及系统指标
docker run -d --name node-exporter --network test--restart=always --privileged=true -e TZ=Asia/Shanghai -p 9100:9100 prom/node-exporter
访问地址:
http://ip:9100/metrics
3.3 elasticsearch-exporter
用于采集ES指标
docker run -d --name elasticsearch-exporter --network test--restart=always --privileged=true -e TZ=Asia/Shanghai -p 9114:9114 bitnami/elasticsearch-exporter --es.uri=http://ip:9200
访问地址:
http://ip:9114/metrics
3.4 blackbox-exporter
监听服务器的某个端口是否存在,监听http的请求是否正确
1、创建映射文件
- /xxx/config
config下创建blackbox.yaml
# 输出就是Prometheus标准的metrics。特别注意最后一个指标probe_succcess,它的值为1或0。
# 当我们向blackbox-exporter发起上述请求时,blackbox-exporter就会去ping ip,
# 如果ping通了,则probe_success的值为1,如果没有ping通,则probe_success的值为0
modules:
http_2xx: # HTTP的GET请求探测 localhost:9115/probe?module=http_2xx\&target=www.baidu.com
prober: http
http_post_2xx:
prober: http
http:
method: POST
tcp_connect: # TCP端口连通性探测 localhost:9115/probe?module=tcp_connect\&target=www.baidu.com:80
prober: tcp
pop3s_banner:
prober: tcp
tcp:
query_response:
- expect: "^+OK"
tls: true
tls_config:
insecure_skip_verify: false
ssh_banner: # SSH连通性探测 localhost:9115/probe?module=ssh_banner\&target=localhost:22
prober: tcp
tcp:
query_response:
- expect: "^SSH-2.0-"
irc_banner:
prober: tcp
tcp:
query_response:
- send: "NICK prober"
- send: "USER prober prober prober :prober"
- expect: "PING :([^ ]+)"
send: "PONG ${1}"
- expect: "^:[^ ]+ 001"
icmp: # 主机连通性探测 curl localhost:9115/probe?module=icmp\&target=ip
prober: icmp
2、启动命令
docker run -d --name blackbox-exporter --network test--restart=always --privileged=true -e TZ=Asia/Shanghai -p 9115:9115 -v /xxx/config/:/config prom/blackbox-exporter --config.file=/config/blackbox.yaml
3、测试地址
http://ip:9115/probe?module=http_2xx&target=ip:端口
四、grafana
用于监控展示
docker run -d --name grafana --network test --restart=always --privileged=true -e TZ=Asia/Shanghai -p 3000:3000 grafana/grafana
默认账号和密码都是admin,登录后会提示是否修改默认密码
访问地址:
http://ip:3000
admin
1qaz!QAZ
五、alertmanager
接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道(钉钉…)
1.创建映射文件
- /xxx/config
config下创建alertmanager.yml
# 全局配置
global:
# 经过此时间后,如果尚未更新告警,则将告警声明为已恢复。(即prometheus没有向alertmanager发送告警了)
resolve_timeout: 5m
# 所有报警都会进入到这个根路由下,可以根据根路由下的子路由设置报警分发策略
route:
# 分组就是将多条告警信息聚合成一条发送,这样就不会收到连续的报警了。
# 将传入的告警按标签分组(标签在prometheus中的rules中定义),例如:
# 接收到的告警信息里面有许多具有cluster=A 和 alertname=LatencyHigh的标签,这些个告警将被分为一个组。
# 如果不想使用分组,可以这样写group_by: [...]
group_by: ['alertname']
group_wait: 30s # 第一组告警发送通知需要等待的时间,这种方式可以确保有足够的时间为同一分组获取多个告警,然后一起触发这个告警信息。
group_interval: 1m # 发送第一个告警后,等待"group_interval"发送一组新告警。
# 分组内发送相同告警的时间间隔
# 收到告警后,一个分组被创建,等待1分钟发送组内告警,如果后续组内的告警信息相同,这些告警会在30分钟后发送
# 但是30分钟内这些告警不会被发送。
repeat_interval: 30m
receiver: 'web.hook' # 接收组名
# 告警接收
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://ip:8060/dingtalk/webhook1/send'
send_resolved: true # 表示服务恢复后会收到恢复告警
# 抑制告警(减少相同原因产生的大量告警)
inhibit_rules:
- source_match: # 第一条抑制规则
level: 'Error'
target_match: # 匹配标签
level: 'Warning'
equal: ['alertname','instance'] # 在源和目标中具有相同值的标签
2.启动命令
docker run -d --name alertmanager --network test--restart=always --privileged=true -e TZ=Asia/Shanghai -p 9093:9093 \
-v /xxx/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager
六、dingtalk
钉钉告警插件
1.钉钉创建群组机器人
1、钉钉创建一个群聊
2.创建映射文件
- /xxx/prometheus-webhook-dingtalk
prometheus-webhook-dingtalk下创建config.yml
templates:
- /etc/prometheus-webhook-dingtalk/templates/templates.tmpl
targets:
webhook1:
# 根据实际创建的钉钉机器人添加
url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx
# secret: xxxxxxxx # 加签
message:
text: '{{ template "产品" . }}'
prometheus-webhook-dingtalk下创建 /templates/templates.tmpl
{{ define "产品" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
========= **监控告警** =========
**告警名称:** {{ .Labels.alertname }}
**告警类型:** {{ .Annotations.summary }}
**告警级别:** {{ .Labels.level }}
**告警应用:** {{ .Labels.job }}
**告警详情:** {{ .Annotations.description }}
**故障时间:** {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ end }}
{{ end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
========= **告警恢复** =========
**告警名称:** {{ .Labels.alertname }}
**告警类型:** {{ .Annotations.summary }}
**告警级别:** {{ .Labels.level }}
**告警应用:** {{ .Labels.job }}
**告警详情:** {{ .Annotations.description }}
**故障时间:** {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
**恢复时间:** {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ end }}
{{ end }}
{{- end }}
3.启动命令
docker run -d --name dingtalk --network test--restart=always --privileged=true -e TZ=Asia/Shanghai -p 8060:8060 \
-v /xxx/prometheus-webhook-dingtalk:/etc/prometheus-webhook-dingtalk \
timonwong/prometheus-webhook-dingtalk