目录结构规划
├── alertmanager # 告警
│ └── alertmanager.yml
├── blackbox # 黑盒探测
│ └── config.yml
├── docker-compose.yml # docker部署文件
├── grafana # 可视化grafana
└── prometheus
├── alert.yml # 配置告警规则
└── prometheus.yml # 配置监控指标
mkdir -p /apps/monitor/{prometheus,alertmanager,grafana,blackbox}
cd /apps/monitor
Prometheus配置
vim prometheus/prometheus.yml
global:
scrape_interval: 30s # 全局抓取间隔,每30秒采集一次数据
rule_files:
- "alert.yml" # 引用同目录下的告警规则文件,作用:定义告警规则(如CPU使用率过高、服务不可用等)
alerting: # 作用:配置Prometheus将告警发送到哪个Alertmanager
alertmanagers:
- static_configs:
- targets: ["10.0.0.18:9093"] # Alertmanager服务地址
scrape_configs:
- job_name: "prometheus" # 作用:监控Prometheus的运行状态和性能
static_configs:
- targets: ["10.0.0.18:9090"]
- job_name: "node" # 作用:收集主机的系统指标(CPU、内存、磁盘等)
static_configs:
- targets: ["10.0.0.18:9100"]
- job_name: "docker" # 作用:收集容器的性能指标
static_configs:
- targets: ["10.0.0.18:8088"] # cAdvisor指标
metric_relabel_configs:
- source_labels: [container] # 从container标签中提取
target_label: name # 映射到name标签
# 常规HTTP探测
- job_name: "blackbox-http" # 黑盒监控
metrics_path: /probe # 使用probe接口
params:
module: [http_2xx] # 使用http探测模块
static_configs:
- targets:
- https://www.baidu.com # 监控百度
- http://10.0.0.18:8088 # 监控cAdvisor服务
- http://10.0.0.18:9090 # 监控Prometheus自身
- http://10.0.0.18:3000 # 监控Grafana
relabel_configs:
- source_labels: [__address__] # 原始地址
target_label: __param_target # 作为target参数传给blackbox
- target_label: __address__ # 重写目标地址
replacement: 10.0.0.18:9115 # 改为blackbox exporter的地址
- source_labels: [__param_target] # 将原始目标地址
target_label: instance # 保存为instance标签
- target_label: module
replacement: http_2xx
# 慢响应服务探测(使用更长的超时)
- job_name: "blackbox-slow"
metrics_path: /probe
params:
module: [http_2xx_slow] # 使用慢速探测模块
scrape_interval: 60s # 降低探测频率
static_configs:
- targets:
- http://10.0.0.18:8080 # 假设有个慢服务
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- target_label: __address__
replacement: 10.0.0.18:9115
- source_labels: [__param_target]
target_label: instance
# HTTPS服务探测(验证SSL证书)
- job_name: "blackbox-https"
metrics_path: /probe
params:
module: [https_2xx] # 使用HTTPS探测模块
static_configs:
- targets:
- https://your-secure-site.com
- https://api.example.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- target_label: __address__
replacement: 10.0.0.18:9115
- source_labels: [__param_target]
target_label: instance
告警规则配置
vim prometheus/alert.yml
groups:
- name: system
interval: 30s
rules:
- alert: CPU使用率过高
expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
service: system
annotations:
summary: "{{ $labels.instance }} CPU使用率过高"
description: "CPU使用率已达{{ $value | printf \"%.2f\" }}%,持续超过5分钟"
- alert: CPU可用率不足
expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
for: 2m
labels:
severity: critical
service: system
annotations:
summary: "{{ $labels.instance }} CPU使用率严重过高"
description: "CPU使用率已达{{ $value | printf \"%.2f\" }}%,可能影响服务响应"
- alert: 内存即将不足
expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 20
for: 5m
labels:
severity: warning
service: system
annotations:
summary: "{{ $labels.instance }} 内存不足"
description: "可用内存仅剩{{ $value | printf \"%.2f\" }}%,请检查内存使用情况"
- alert: 内存不足
expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 10
for: 2m
labels:
severity: critical
service: system
annotations:
summary: "{{ $labels.instance }} 内存严重不足"
description: "可用内存仅剩{{ $value | printf \"%.2f\" }}%,系统可能OOM"
- alert: 主机宕机
expr: up == 0
for: 1m
labels:
severity: critical
service: system
annotations:
summary: "{{ $labels.instance }} 主机宕机"
description: "实例 {{ $labels.instance }} ({{ $labels.job }}) 已离线超过1分钟"
- name: blackbox_alerts
rules:
# HTTP服务不可用告警
- alert: HTTPServiceDown
expr: probe_success == 0
for: 1m
labels:
severity: critical
service: external
annotations:
summary: "{{ $labels.instance }} 服务不可用"
description: "服务 {{ $labels.instance }} 已无法访问超过1分钟"
# HTTP响应慢告警
- alert: HTTPSlowResponse
expr: probe_duration_seconds > 2
for: 5m
labels:
severity: warning
service: external
annotations:
summary: "{{ $labels.instance }} 响应缓慢"
description: "服务响应时间已达 {{ $value }}s,超过2s阈值"
# SSL证书即将过期告警
- alert: SSLCertExpiringSoon
expr: probe_ssl_earliest_cert_expiry - time() < 604800 # 7天
for: 10m
labels:
severity: warning
service: ssl
annotations:
summary: "{{ $labels.instance }} SSL证书即将过期"
description: "证书将在 {{ $value | humanizeDuration }} 后过期"
# SSL证书已过期告警
- alert: SSLCertExpired
expr: probe_ssl_earliest_cert_expiry - time() < 0
for: 1m
labels:
severity: critical
service: ssl
annotations:
summary: "{{ $labels.instance }} SSL证书已过期"
description: "证书已过期,请立即更新"
# HTTP状态码异常告警
- alert: HTTPStatusCodeError
expr: probe_http_status_code <= 199 or probe_http_status_code >= 400
for: 1m
labels:
severity: warning
service: external
annotations:
summary: "{{ $labels.instance }} 返回异常状态码"
description: "服务返回HTTP状态码: {{ $labels.probe_http_status_code }}"
Alertmanager配置
vim alertmanager/alertmanager.yml
# route:
# receiver: "default" # 所有告警都发送给名为"default"的接收器
#
# receivers:
# - name: "default" # 定义了一个名为"default"的接收器
#
global:
resolve_timeout: 1m
smtp_from: "1659271013@qq.com"
smtp_smarthost: "smtp.qq.com:465"
smtp_auth_username: "1659271013@qq.com"
smtp_auth_password: "Zhou251418@0517"
smtp_require_tls: false
smtp_hello: "qq.com"
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 2m
repeat_interval: 1h
receiver: 'wechat' #默认接收者修改为wechat
receivers:
- name: email-receiver
email_configs:
- send_resolved: true
to: 1659271013@qq.com
- name: 'dingtalk-webhook'
webhook_configs:
- url: 'http://192.168.122.22:8060/dingtalk/webhook1/send'
#添加微信接受者
- name: "wechat"
wechat_configs:
- send_resolved: true
api_secret: JKVtu6ZQ6FlA-xxpeD65AJ6_qdnbJyTEPF9HPjXQevg #上面在企业微信创建应用之后获取的Secret
corp_id: ww3a85cb45631b015f #企业微信公司id,可以在企业微信管理后台获得
agent_id: 1000003 #上面在企业微信创建应用之后获取的AgentId
# to_user: '@all' #如果需要发送给指定用户可以使用to_user,@all表示所有人
to_party: 1 #发送给指定的部门,2代表部门ID,部门ID可以在企业微信管理后台获得
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
Blackbox配置
vim blackbox/config.yml
modules:
http_2xx: # 基础HTTP探测模块。用途:监控常规Web服务,接受常见的成功/重定向状态码
prober: http # 使用http探测器
timeout: 3s # 测超时时间3秒
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2"] # 支持的HTTP版本
valid_status_codes: [200, 301, 302] # 接受的状态码
method: GET # HTTP方法
follow_redirects: true # 允许重定向
preferred_ip_protocol: "ip4" # 优先使用IPv4
http_2xx_slow: # 慢速HTTP探测模块。用途:监控响应较慢的服务(如复杂API、数据库查询界面等)
prober: http
timeout: 10s
http:
valid_status_codes: [200]
https_2xx: # HTTPS探测模块。用途:监控HTTPS服务,同时验证SSL证书有效性
prober: http
timeout: 5s
http:
valid_status_codes: [200]
tls_config:
insecure_skip_verify: false # 验证SSL证书
编写docker-compose.yml文件
vim docker-compose.yml
version: "3.8"
services:
prometheus: # 作用:从各个exporter收集指标数据,存储时序数据
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus:/etc/prometheus # 挂载本地配置目录
- /var/run/docker.sock:/var/run/docker.sock # 用于发现Docker容器
ports:
- 9090:9090
restart: always
node-exporter: # 作用:收集Linux主机的系统指标(CPU、内存、磁盘、网络等)
image: prom/node-exporter
container_name: node-exporter
restart: always
ports:
- 9100:9100
cadvisor: # 作用:收集容器的资源使用情况和性能指标
image: gcr.m.daocloud.io/cadvisor/cadvisor # DaoCloud镜像加速
container_name: cadvisor
privileged: true # 需要特权模式访问系统信息
ports:
- 8088:8080 # 映射到主机的8088端口
devices: # 内核日志设备
- /dev/kmsg
volumes:
- /:/rootfs:ro # 根文件系统
- /var/run:/var/run:ro # 运行时数据
- /sys:/sys:ro # 系统信息
- /var/lib/docker:/var/lib/docker:ro # Docker数据
restart: always
alertmanager: # 作用:处理Prometheus发出的告警,进行去重、分组、路由
image: prom/alertmanager
container_name: alertmanager
volumes:
- ./alertmanager:/etc/alertmanager
ports:
- 9093:9093
restart: always
grafana: # 作用:提供美观的监控数据可视化仪表板
image: grafana/grafana
container_name: grafana
ports:
- 3000:3000
restart: always
blackbox: # 作用:通过HTTP/HTTPS/DNS/ICMP等方式探测服务可用性
image: prom/blackbox-exporter
container_name: blackbox
volumes:
- ./blackbox:/etc/blackbox_exporter
ports:
- 9115:9115
restart: always
【温馨提示】上述配置根据生产实际需求进行调整
构建容器,启动服务
docker-compose up -d
# 查看容器
docker ps
# 进入检查容器
docker exec -it [容器名] bash
访问地址
| 组件 | 地址 |
|---|---|
| Prometheus | http://服务器IP:9090 |
| Grafana | http://服务器IP:3000 |
| Alertmanager | http://服务器IP:9093 |
| cadvisor | http://服务器IP:8088 |
# Grafana默认用户及密码
用户:admin
密码:admin
【温馨提示】首次登入使用其可直接修改密码,若不想修改密码点击skip即可
# Grafana 必装仪表盘
导入 ID:
1860 Linux主机
193 Docker
8919 Node Exporter
179 Prometheus
数据源选 Prometheus:http://prometheus:9090