服务监控与告警体系搭建
一、简述
采用 Prometheus + Grafana + Alertmanager 组合方案,构建一套完整的监控、可视化与告警处理流程。
1. prometheus
- 作为时序数据库,存储所有监控指标。
- 作为数据抓取器,支持主动拉取(Pull Model)与被动接收(Push Model)两种数据采集模式。
- 负责告警规则的定义,并通过
prometheus.yaml配置文件与 Alertmanager 进行对接。
2. grafana
- 提供强大的数据可视化能力,通过仪表盘直观展示监控指标与趋势。
3. Alertmanager
- 专用于告警路由与管理,接收 Prometheus 产生的告警,并进行以下处理:
分组(Grouping):将多个相关告警合并为一个通知,避免通知轰炸。
抑制(Inhibition):当某些告警已经触发时,抑制其他相关的告警,减少噪声。
静默(Silence):在一段时间内静默某些告警,例如计划维护期间。
路由(Routing):根据告警的标签,将告警路由到不同的接收者(例如,不同的团队负责不同的服务)。
去重(Deduplication):对相同的告警进行去重,避免重复通知。
重试和超时:如果通知发送失败,会尝试重试,并设置超时。
- 支持企微信、钉钉、自定义webhook
4. Exporters
- Exporters是需要监测的目标端点,可直接使用现成的Exporters也可以自定义的Exporters,下面会讲到如何自定义Exporters
二、快速部署
下面只是一个示例,你可以Vide Coding一波~~
- docker-compose.yml
# Prometheus + Grafana 监控栈:系统状态、JVM、请求成功次数、告警
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
- ./config/alerts/:/etc/prometheus/alerts/:ro
- ./config/rules/:/etc/prometheus/rules/:ro
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle'
- '--web.enable-admin-api'
restart: unless-stopped
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
ports:
- "9093:9093"
volumes:
- ./config/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
restart: unless-stopped
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_INSTALL_PLUGINS=grafana-piechart-panel,grafana-clock-panel
- GF_USERS_ALLOW_SIGN_UP=false
- GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/
- GF_PATHS_PROVISIONING=/etc/grafana/provisioning
volumes:
- grafana_data:/var/lib/grafana
- ./provisioning/dashboards/:/etc/grafana/provisioning/dashboards/:ro
- ./provisioning/datasources/:/etc/grafana/provisioning/datasources/:ro
depends_on:
- prometheus
restart: unless-stopped
# 定义命名卷
volumes:
prometheus_data:
grafana_data:
driver: local
labels:
- "app=grafana"
- "env=production"
- prometheus.yaml
# Prometheus 主配置:系统 + JVM + 请求指标 + 告警
global:
scrape_interval: 15s
evaluation_interval: 15s
# 告警:由 Alertmanager 接收并路由
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
# 告警规则与记录规则
rule_files:
- "/etc/prometheus/alerts/*.yml"
- "/etc/prometheus/rules/*.yml"
scrape_configs:
# Prometheus 自身
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
# 系统状态:Node Exporter(CPU、内存、磁盘、网络等)
- job_name: "node"
static_configs:
- targets: ["node-exporter:9100"]
relabel_configs:
- source_labels: [__address__]
target_label: instance
regex: "([^:]+)(:[0-9]+)?"
replacement: "${1}"
# JVM + 请求指标:Spring Boot Actuator /actuator/prometheus
# 若应用在宿主机运行,使用 host.docker.internal:8080;若在同一 compose 中,改为 app:8080
- job_name: "talent-touch-mini"
metrics_path: /actuator/prometheus
scrape_interval: 10s
static_configs:
- targets: ["host.docker.internal:8081"]
labels:
app: "talent-touch"
# 若应用在 Docker 网络内,可改为:
# - targets: ["app:8080"]
- alertmanager.yaml
# Alertmanager 配置:告警路由与通知
global:
resolve_timeout: 5m
# 路由树:按标签匹配后发送到对应 receiver
route:
receiver: "default"
group_by: ["alertname", "instance", "job"]
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
routes:
# 系统类告警
- match:
severity: system
receiver: default
# JVM 类告警
- match:
severity: jvm
receiver: default
# 请求/业务类告警
- match:
severity: request
receiver: default
receivers:
- name: "default"
# 默认仅控制台;可改为 webhook / 邮件 / 钉钉 / 企业微信等
# webhook_configs:
# - url: "http://your-webhook:5001/alerts"
# send_resolved: true
# email_configs:
# - to: "ops@example.com"
# from: "alertmanager@example.com"
# smarthost: "smtp.example.com:587"
inhibit_rules:
- source_match:
severity: "critical"
target_match:
severity: "warning"
equal: ["alertname", "instance"]
三、常用Exporters
- 核心理念
将所有 Exporters 部署在 Prometheus 所在的主机(或专属监控主机)上。Exporter 容器只需暴露给本机 Prometheus(如绑定到 127.0.0.1或 Docker 内部网络),绝不对公网甚至内网暴露端口,实现最小化攻击面。
- 架构优势
安全:所有监控端点(9100, 9104等)仅在监控主机本地可访问,外部无法扫描或攻击。
集中管理:所有采集器的配置、升级、维护在一台主机完成,运维复杂度低。
网络简化:只需确保监控主机能访问所有待监控的业务中间件的端口(如 MySQL 的 3306,Redis 的 6379),无需在业务主机上部署任何代理。
权限清晰:监控主机持有访问各中间件的只读凭证,业务主机无需任何额外配置。
- 部署总览
| 中间件 | 镜像 | 默认端口 | 访问控制建议 | 目标中间件连接方式 |
|---|---|---|---|---|
| node-exporter | prom/node-exporter | 9100 | 仅本机,或结合边车模式 | 采集本机指标,部署在每台业务主机上 |
| MySQL | prom/mysqld-exporter | 9104 | 绑定 127.0.0.1 | mysql -h <业务IP> -u exporter |
| Elasticsearch | quay.io/prometheuscommunity/elasticsearch-exporter | 9114 | 绑定 127.0.0.1 | http://<es集群IP>:9200 |
| MongoDB | percona/mongodb_exporter | 9216 | 绑定 127.0.0.1 | mongodb://<业务IP>:27017 |
| RocketMQ | apacherocketmq/rocketmq-exporter | 5557 | 绑定 127.0.0.1 | <namesrv-ip>:9876 |
| Redis | oliver006/redis_exporter | 9121 | 绑定 127.0.0.1 | redis://<业务IP>:6379 |
| MinIO | 内置 | / | - | - |
| Milvus | 内置 | / | - | - |
1. node-exporter
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys\|proc\|dev\|host\|etc)($$\|/)'
restart: unless-stopped
2. MySQL Exporter
mysql-exporter:
image: prom/mysqld-exporter:latest
container_name: mysql-exporter
ports:
- "9104:9104”
environment:
- DATA_SOURCE_NAME=exporter:password@(mysql-host:3306)/
command:
- '--collect.auto_increment.columns'
- '--collect.binlog_size'
restart: unless-stopped
3. Elasticsearch Exporter
elasticsearch-exporter:
image: quay.io/prometheuscommunity/elasticsearch-exporter:latest
container_name: elasticsearch-exporter
ports:
- "9114:9114”
environment:
- ES_URI=http://elasticsearch:9200
# - ES_USERNAME=elastic
# - ES_PASSWORD=password
command:
- '--es.uri=http://elasticsearch:9200'
- '--es.all'
- '--es.indices'
restart: unless-stopped
4. MongoDB Exporter
mongodb-exporter:
image: percona/mongodb_exporter:latest
container_name: mongodb-exporter
ports:
- "9216:9216”
environment:
- MONGODB_URI=mongodb://username:password@mongodb:27017
command:
- '--mongodb.uri=mongodb://username:password@mongodb:27017'
- '--collect.collection'
- '--collect.database'
restart: unless-stopped
5. RocketMQ Exporter
rocketmq-exporter:
image: apacherocketmq/rocketmq-exporter:latest
container_name: rocketmq-exporter
ports:
- "5557:5557”
environment:
- ROCKETMQ_NAMESRV_ADDR=rocketmq-namesrv:9876
command:
- '--rocketmq.config.namesrvAddr=rocketmq-namesrv:9876'
- '--server.port=5557'
restart: unless-stopped
6. Redis Exporter
redis-exporter:
image: oliver006/redis_exporter:latest
container_name: redis-exporter
ports:
- "9121:9121”
environment:
- REDIS_ADDR=redis://redis:6379
# - REDIS_PASSWORD=yourpassword
command:
- '--redis.addr=redis://redis:6379'
restart: unless-stopped
7. MinIO
MinIO 内置 Prometheus 端点,无需单独部署 exporter。
-
启用方法:设置环境变量
MINIO_PROMETHEUS_AUTH_TYPE=public。 -
Prometheus 可直接抓取路径:
/minio/v2/metrics/cluster。
8. Milvus
Milvus 内置指标端点,但需配置启用。
-
启用方法:设置环境变量
METRIC_ENABLE=true和METRIC_PORT=9091。 -
Prometheus 可直接抓取路径:
:9091/metrics。
四、自定义Exporters
1. 安全如何保障?
- 额外端口禁止代理至公网
- 结合linux防火墙对指定IP开放
2. 集成示例
- pom.xml
<micrometer.version>1.5.5</micrometer.version>
<!-- Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Prometheus 支持 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>${micrometer.version}</version>
</dependency>
- application.yaml
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus,env,beans,loggers
base-path: /actuator
jmx:
exposure:
exclude: '*'
endpoint:
health:
show-details: always
probes:
enabled: true
metrics:
enabled: true
prometheus:
enabled: true
metrics:
export:
prometheus:
enabled: true
enable:
jvm: true
system: true
logback: true
tomcat: true
tags:
application: ${spring.application.name}
environment: ${spring.profiles.active:dev}
info:
env:
enabled: true
server:
port: 23126 # 可设置不同的管理端口
health:
defaults:
enabled: true
redis:
enabled: true
db:
enabled: true
3. 自定义指标
Micrometer Prometheus registry 支持多种监控指标类型,以下是主要的指标类型及其代码示例:
Counter(计数器):用于累计值,通常用于计数(如请求次数、错误次数等)。它只能增加,不会减少(除非重置)。
Gauge(计量器):用于测量瞬时值,可以上下波动(如当前内存使用量、队列大小等)。
Timer(计时器):用于测量短时任务的持续时间和频率(如方法执行时间)。它同时记录时间分布和调用次数。
DistributionSummary(分布摘要):用于记录事件的分布情况(如请求大小、响应大小)。它类似于Timer,但记录的不是时间,而是任意值。
LongTaskTimer(长任务计时器):用于测量长时间运行的任务的持续时间(如后台任务)。与Timer不同,它会在任务进行中持续记录时间。
另外,Micrometer还支持Function Counter、Function Timer和TimeGauge等,但以上五种是最常用的。
4. 推荐监控场景
- 使用HikariCPMetrics和druid-metric实现数据库连接池监控与告警
- 使用Gauge实现AI能力授权使用状态监控与告警
- 使用Gauge实现线上用户数监控
- 使用Counter实现接口成功率监控


5814

被折叠的 条评论
为什么被折叠?



