Skip to content

服务器监控

1. 概述

服务器监控是运维工作的重要组成部分,通过监控系统资源、应用性能和服务状态,可以及时发现和解决问题,保证系统稳定运行。在梵医云系统中,使用 Spring Boot Actuator + Prometheus + Grafana 进行监控。本文档介绍如何配置和使用服务器监控。

2. 监控体系架构

2.1 监控组件

梵医云系统监控包含以下组件:

  • Spring Boot Actuator:应用监控端点
  • Prometheus:指标采集和存储
  • Grafana:数据可视化
  • AlertManager:告警管理

2.2 监控架构

┌─────────────┐      ┌─────────────┐      ┌─────────────┐      ┌─────────────┐
│  Application │ ───> │ Prometheus  │ ───> │  Grafana    │ ───> │  AlertManager│
│   Actuator  │      │             │      │             │      │             │
└─────────────┘      └─────────────┘      └─────────────┘      └─────────────┘

3. Spring Boot Actuator 配置

3.1 添加依赖

pom.xml 中添加依赖:

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

3.2 配置 Actuator

编辑 application.yaml

yaml
management:
  prometheus:
    metrics:
      export:
        enabled: true
  endpoints:
    enabled-by-default: false
    web.exposure.include: "*"
  endpoint:
    metrics:
      enabled: true
    prometheus:
      enabled: true
    health:
      show-details: ALWAYS

3.3 访问监控端点

启动应用后,可以访问以下端点:

  • 健康检查http://localhost:48080/actuator/health
  • 指标信息http://localhost:48080/actuator/metrics
  • Prometheus 指标http://localhost:48080/actuator/prometheus
  • 环境信息http://localhost:48080/actuator/env
  • 日志信息http://localhost:48080/actuator/loggers

4. Prometheus 安装和配置

4.1 安装 Prometheus

4.1.1 Docker 安装

bash
# 拉取镜像
docker pull prom/prometheus

# 创建配置目录
mkdir -p /data/prometheus

# 创建配置文件
cat > /data/prometheus/prometheus.yml << EOF
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'fanyi-gateway'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['192.168.1.10:48080']
        labels:
          service: 'gateway'
          env: 'dev'

  - job_name: 'fanyi-system'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['192.168.1.10:48081']
        labels:
          service: 'system'
          env: 'dev'

  - job_name: 'fanyi-member'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['192.168.1.10:48087']
        labels:
          service: 'member'
          env: 'dev'

  - job_name: 'fanyi-trade'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['192.168.1.10:48090']
        labels:
          service: 'trade'
          env: 'dev'
EOF

# 运行容器
docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v /data/prometheus:/etc/prometheus \
  -v /data/prometheus/data:/prometheus \
  --restart=always \
  prom/prometheus

4.1.2 源码安装

bash
# 下载 Prometheus
cd /opt
wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz

# 解压
tar -zxvf prometheus-2.47.0.linux-amd64.tar.gz
mv prometheus-2.47.0.linux-amd64 prometheus

# 创建配置文件
cat > /opt/prometheus/prometheus.yml << EOF
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'fanyi-gateway'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['192.168.1.10:48080']
        labels:
          service: 'gateway'
          env: 'dev'

  - job_name: 'fanyi-system'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['192.168.1.10:48081']
        labels:
          service: 'system'
          env: 'dev'
EOF

# 启动 Prometheus
./prometheus --config.file=prometheus.yml --storage.tsdb.path=./data

4.2 配置 Prometheus

编辑 prometheus.yml

yaml
global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    monitor: 'fanyi-monitor'
    env: 'dev'

# 告警规则文件
rule_files:
  - "rules/*.yml"

# 抓取配置
scrape_configs:
  - job_name: 'fanyi-gateway'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 15s
    static_configs:
      - targets: ['192.168.1.10:48080']
        labels:
          service: 'gateway'
          env: 'dev'
          instance: 'gateway-1'

  - job_name: 'fanyi-system'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 15s
    static_configs:
      - targets: ['192.168.1.10:48081']
        labels:
          service: 'system'
          env: 'dev'
          instance: 'system-1'

  - job_name: 'fanyi-member'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 15s
    static_configs:
      - targets: ['192.168.1.10:48087']
        labels:
          service: 'member'
          env: 'dev'
          instance: 'member-1'

  - job_name: 'fanyi-trade'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 15s
    static_configs:
      - targets: ['192.168.1.10:48090']
        labels:
          service: 'trade'
          env: 'dev'
          instance: 'trade-1'

# 告警管理器配置
alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - '192.168.1.10:9093'

4.3 访问 Prometheus

打开浏览器访问:

http://your-server-ip:9090

5. Grafana 安装和配置

5.1 安装 Grafana

5.1.1 Docker 安装

bash
# 拉取镜像
docker pull grafana/grafana

# 创建数据目录
mkdir -p /data/grafana

# 运行容器
docker run -d \
  --name grafana \
  -p 3000:3000 \
  -v /data/grafana:/var/lib/grafana \
  --restart=always \
  grafana/grafana

5.1.2 源码安装

bash
# 下载 Grafana
cd /opt
wget https://dl.grafana.com/oss/release/grafana-10.0.3.linux-amd64.tar.gz

# 解压
tar -zxvf grafana-10.0.3.linux-amd64.tar.gz
mv grafana-10.0.3 grafana

# 启动 Grafana
./bin/grafana-server web

5.2 配置数据源

  1. 登录 Grafana(默认账号密码:admin/admin)
  2. 进入"Configuration" -> "Data Sources"
  3. 点击"Add data source"
  4. 选择"Prometheus"
  5. 配置数据源:
    • Name: Prometheus
    • URL: http://192.168.1.10:9090
    • Access: Server (default)
  6. 点击"Save & Test"

5.3 导入仪表板

5.3.1 JVM 仪表板

  1. 进入"Dashboards" -> "Import"
  2. 输入仪表板 ID:4701
  3. 点击"Load"
  4. 选择 Prometheus 数据源
  5. 点击"Import"

5.3.2 Spring Boot 仪表板

  1. 进入"Dashboards" -> "Import"
  2. 输入仪表板 ID:12900
  3. 点击"Load"
  4. 选择 Prometheus 数据源
  5. 点击"Import"

5.3.3 自定义仪表板

创建自定义仪表板,监控以下指标:

  • JVM 内存jvm_memory_used_bytes
  • JVM 线程jvm_threads_live_threads
  • HTTP 请求http_server_requests_seconds_count
  • HTTP 响应时间http_server_requests_seconds_sum
  • 数据库连接hikaricp_connections_active
  • Redis 连接lettuce_pool_active_connections

6. 告警配置

6.1 配置告警规则

创建 /data/prometheus/rules/alerts.yml

yaml
groups:
  - name: fanyi_alerts
    interval: 30s
    rules:
      # 服务宕机告警
      - alert: ServiceDown
        expr: up == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "服务 {{ $labels.instance }} 宕机"
          description: "服务 {{ $labels.instance }} 已经宕机超过 1 分钟"

      # 高内存使用告警
      - alert: HighMemoryUsage
        expr: (jvm_memory_used_bytes{job=~"fanyi.*"} / jvm_memory_max_bytes{job=~"fanyi.*"}) * 100 > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "服务 {{ $labels.instance }} 内存使用率过高"
          description: "服务 {{ $labels.instance }} 内存使用率超过 80%,当前值为 {{ $value }}%"

      # 高 CPU 使用告警
      - alert: HighCpuUsage
        expr: rate(process_cpu_seconds_total{job=~"fanyi.*"}[5m]) * 100 > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "服务 {{ $labels.instance }} CPU 使用率过高"
          description: "服务 {{ $labels.instance }} CPU 使用率超过 80%,当前值为 {{ $value }}%"

      # 高响应时间告警
      - alert: HighResponseTime
        expr: histogram_quantile(0.95, rate(http_server_requests_seconds_bucket{job=~"fanyi.*"}[5m])) > 1
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "服务 {{ $labels.instance }} 响应时间过长"
          description: "服务 {{ $labels.instance }} 95% 请求响应时间超过 1 秒,当前值为 {{ $value }}s"

      # 错误率告警
      - alert: HighErrorRate
        expr: rate(http_server_requests_seconds_count{job=~"fanyi.*",status=~"5.."}[5m]) / rate(http_server_requests_seconds_count{job=~"fanyi.*"}[5m]) * 100 > 5
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "服务 {{ $labels.instance }} 错误率过高"
          description: "服务 {{ $labels.instance }} 错误率超过 5%,当前值为 {{ $value }}%"

      # 数据库连接告警
      - alert: HighDbConnectionUsage
        expr: (hikaricp_connections_active{job=~"fanyi.*"} / hikaricp_connections_max{job=~"fanyi.*"}) * 100 > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "服务 {{ $labels.instance }} 数据库连接使用率过高"
          description: "服务 {{ $labels.instance }} 数据库连接使用率超过 80%,当前值为 {{ $value }}%"

6.2 配置 AlertManager

6.2.1 安装 AlertManager

bash
# 拉取镜像
docker pull prom/alertmanager

# 创建配置目录
mkdir -p /data/alertmanager

# 创建配置文件
cat > /data/alertmanager/alertmanager.yml << EOF
global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alertmanager@example.com'
  smtp_auth_username: 'alertmanager@example.com'
  smtp_auth_password: 'your_password'

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: 'default'

receivers:
  - name: 'default'
    email_configs:
      - to: 'admin@example.com'
        headers:
          Subject: '[Prometheus] {{ .GroupLabels.alertname }}'
        html: '{{ template "email.default.html" . }}'

  - name: 'wechat'
    wechat_configs:
      - corp_id: 'your_corp_id'
        api_secret: 'your_api_secret'
        to_party: '1'
        agent_id: 'your_agent_id'
        message: '{{ template "wechat.default.message" . }}'

templates:
  - '/etc/alertmanager/templates/*.tmpl'
EOF

# 运行容器
docker run -d \
  --name alertmanager \
  -p 9093:9093 \
  -v /data/alertmanager:/etc/alertmanager \
  --restart=always \
  prom/alertmanager

6.2.2 配置企业微信告警

创建企业微信告警模板 /data/alertmanager/templates/wechat.tmpl

{{ define "wechat.default.message" }}
{{ range .Alerts }}
告警:{{ .Labels.alertname }}
级别:{{ .Labels.severity }}
实例:{{ .Labels.instance }}
描述:{{ .Annotations.description }}
时间:{{ .StartsAt.Format "2006-01-02 15:04:05" }}
{{ end }}
{{ end }}

7. 系统资源监控

7.1 安装 Node Exporter

Node Exporter 用于采集服务器系统指标。

bash
# 拉取镜像
docker pull prom/node-exporter

# 运行容器
docker run -d \
  --name node-exporter \
  -p 9100:9100 \
  --restart=always \
  prom/node-exporter

7.2 配置 Prometheus 采集系统指标

编辑 prometheus.yml

yaml
scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['192.168.1.10:9100']
        labels:
          instance: 'server-1'
          env: 'dev'

7.3 系统监控指标

  • CPU 使用率rate(node_cpu_seconds_total[5m]) * 100
  • 内存使用率(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
  • 磁盘使用率(1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100
  • 网络流量rate(node_network_receive_bytes_total[5m])
  • 磁盘 I/Orate(node_disk_io_time_seconds_total[5m])

8. 日志监控

8.1 安装 Loki

Loki 是一个水平可扩展、高可用的多租户日志聚合系统。

bash
# 拉取镜像
docker pull grafana/loki

# 创建配置文件
cat > /data/loki/loki-config.yml << EOF
auth_enabled: false

server:
  http_listen_port: 3100

ingester:
  lifecycler:
    address: 127.0.0.1
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    max_transfer_retries: 0
    chunk_idle_period: 1h
    max_chunk_age: 1h
    chunk_target_size: 1048576
    chunk_retain_period: 30s

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb:
    directory: /data/loki/index

  filesystem:
    directory: /data/loki/chunks

limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h

chunk_store_config:
  max_look_back_period: 0s

table_manager:
  retention_deletes_enabled: false
  retention_period: 0s
EOF

# 运行容器
docker run -d \
  --name loki \
  -p 3100:3100 \
  -v /data/loki:/data/loki \
  -v /data/loki/loki-config.yml:/etc/loki/local-config.yaml \
  --restart=always \
  grafana/loki \
  -config.file=/etc/loki/local-config.yaml

8.2 配置应用日志采集

编辑 logback-spring.xml

xml
<configuration>
    <appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
        <http>
            <url>http://192.168.1.10:3100/loki/api/v1/push</url>
        </http>
        <format>
            <label>
                <pattern>application</pattern>
                <value>fanyi-gateway</value>
            </label>
            <label>
                <pattern>host</pattern>
                <value>${HOSTNAME}</value>
            </label>
            <label>
                <pattern>level</pattern>
                <value>%level</value>
            </label>
            <message>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </message>
        </format>
    </appender>

    <root level="INFO">
        <appender-ref ref="LOKI"/>
    </root>
</configuration>

8.3 配置 Grafana 查询日志

  1. 进入 Grafana
  2. 添加 Loki 数据源
  3. 创建日志查询面板
  4. 使用 LokiQL 查询日志

9. 链路追踪

9.1 安装 Jaeger

Jaeger 是一个分布式追踪系统。

bash
# 拉取镜像
docker pull jaegertracing/all-in-one

# 运行容器
docker run -d \
  --name jaeger \
  -p 5775:5775/udp \
  -p 6831:6831/tcp \
  -p 6832:6832/tcp \
  -p 5778:5778/tcp \
  -p 16686:16686/tcp \
  -p 14268:14268/tcp \
  -p 14250:14250/tcp \
  -p 9411:9411/tcp \
  --restart=always \
  jaegertracing/all-in-one:latest

9.2 配置应用追踪

application.yaml 中添加配置:

yaml
spring:
  sleuth:
    zipkin:
      base-url: http://192.168.1.10:9411
      sender:
        type: web
  application:
    name: gateway-server

9.3 访问 Jaeger

打开浏览器访问:

http://your-server-ip:16686

10. 常见问题

10.1 Prometheus 无法采集指标

问题:Prometheus 无法采集应用指标

解决方案

  1. 检查应用是否启动
  2. 检查 Actuator 端点是否可访问
  3. 检查防火墙是否开放端口
  4. 检查 Prometheus 配置是否正确

10.2 Grafana 无法连接 Prometheus

问题:Grafana 无法连接 Prometheus

解决方案

  1. 检查 Prometheus 是否运行
  2. 检查数据源配置是否正确
  3. 检查网络连接是否正常
  4. 检查防火墙设置

10.3 告警不生效

问题:告警规则不生效

解决方案

  1. 检查告警规则语法是否正确
  2. 检查告警规则是否加载
  3. 检查 AlertManager 是否运行
  4. 检查告警配置是否正确

10.4 日志采集失败

问题:Loki 无法采集日志

解决方案

  1. 检查 Loki 是否运行
  2. 检查日志配置是否正确
  3. 检查网络连接是否正常
  4. 查看应用日志

11. 性能优化

11.1 Prometheus 优化

编辑 prometheus.yml

yaml
global:
  scrape_interval: 30s
  evaluation_interval: 30s
  external_labels:
    monitor: 'fanyi-monitor'

storage:
  tsdb:
    retention.time: 30d

11.2 Grafana 优化

  1. 减少仪表板刷新频率
  2. 使用变量减少查询数量
  3. 优化查询语句
  4. 使用缓存

11.3 日志优化

  1. 配置日志级别
  2. 使用异步日志
  3. 配置日志滚动
  4. 定期清理旧日志

12. 注意事项

  1. 资源监控:定期检查系统资源使用情况
  2. 告警配置:配置合理的告警规则
  3. 日志管理:定期清理日志文件
  4. 性能优化:根据实际情况优化配置
  5. 安全配置:限制监控端点访问
  6. 备份策略:定期备份监控数据
  7. 监控覆盖:确保所有服务都被监控
  8. 告警测试:定期测试告警是否正常

13. 相关文档