服务监控与告警体系搭建

一、简述

采用 Prometheus + Grafana + Alertmanager 组合方案,构建一套完整的监控、可视化与告警处理流程。

通知渠道

可视化层

告警处理层

数据存储层

数据采集层

Prometheus Server

Push Gateway

Exporters

Client Libraries

Prometheus TSDB

长期存储 - Thanos/Cortex

Alertmanager集群

告警路由

告警分组

告警抑制

Grafana

仪表盘

告警面板

邮件

钉钉/企微

Slack

PagerDuty

Webhook

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-exporterprom/node-exporter9100仅本机,或结合边车模式采集本机指标,部署在每台业务主机上
MySQLprom/mysqld-exporter9104绑定 127.0.0.1mysql -h <业务IP> -u exporter
Elasticsearchquay.io/prometheuscommunity/elasticsearch-exporter9114绑定 127.0.0.1http://<es集群IP>:9200
MongoDBpercona/mongodb_exporter9216绑定 127.0.0.1mongodb://<业务IP>:27017
RocketMQapacherocketmq/rocketmq-exporter5557绑定 127.0.0.1<namesrv-ip>:9876
Redisoliver006/redis_exporter9121绑定 127.0.0.1redis://<业务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=trueMETRIC_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 CounterFunction TimerTimeGauge等,但以上五种是最常用的。

4. 推荐监控场景
  • 使用HikariCPMetrics和druid-metric实现数据库连接池监控与告警
  • 使用Gauge实现AI能力授权使用状态监控与告警
  • 使用Gauge实现线上用户数监控
  • 使用Counter实现接口成功率监控
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬山境KL攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值