服务器监控
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: ALWAYS3.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/prometheus4.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=./data4.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:90905. 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/grafana5.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 web5.2 配置数据源
- 登录 Grafana(默认账号密码:admin/admin)
- 进入"Configuration" -> "Data Sources"
- 点击"Add data source"
- 选择"Prometheus"
- 配置数据源:
- Name:
Prometheus - URL:
http://192.168.1.10:9090 - Access:
Server (default)
- Name:
- 点击"Save & Test"
5.3 导入仪表板
5.3.1 JVM 仪表板
- 进入"Dashboards" -> "Import"
- 输入仪表板 ID:
4701 - 点击"Load"
- 选择 Prometheus 数据源
- 点击"Import"
5.3.2 Spring Boot 仪表板
- 进入"Dashboards" -> "Import"
- 输入仪表板 ID:
12900 - 点击"Load"
- 选择 Prometheus 数据源
- 点击"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/alertmanager6.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-exporter7.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/O:
rate(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.yaml8.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 查询日志
- 进入 Grafana
- 添加 Loki 数据源
- 创建日志查询面板
- 使用 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:latest9.2 配置应用追踪
在 application.yaml 中添加配置:
yaml
spring:
sleuth:
zipkin:
base-url: http://192.168.1.10:9411
sender:
type: web
application:
name: gateway-server9.3 访问 Jaeger
打开浏览器访问:
http://your-server-ip:1668610. 常见问题
10.1 Prometheus 无法采集指标
问题:Prometheus 无法采集应用指标
解决方案:
- 检查应用是否启动
- 检查 Actuator 端点是否可访问
- 检查防火墙是否开放端口
- 检查 Prometheus 配置是否正确
10.2 Grafana 无法连接 Prometheus
问题:Grafana 无法连接 Prometheus
解决方案:
- 检查 Prometheus 是否运行
- 检查数据源配置是否正确
- 检查网络连接是否正常
- 检查防火墙设置
10.3 告警不生效
问题:告警规则不生效
解决方案:
- 检查告警规则语法是否正确
- 检查告警规则是否加载
- 检查 AlertManager 是否运行
- 检查告警配置是否正确
10.4 日志采集失败
问题:Loki 无法采集日志
解决方案:
- 检查 Loki 是否运行
- 检查日志配置是否正确
- 检查网络连接是否正常
- 查看应用日志
11. 性能优化
11.1 Prometheus 优化
编辑 prometheus.yml:
yaml
global:
scrape_interval: 30s
evaluation_interval: 30s
external_labels:
monitor: 'fanyi-monitor'
storage:
tsdb:
retention.time: 30d11.2 Grafana 优化
- 减少仪表板刷新频率
- 使用变量减少查询数量
- 优化查询语句
- 使用缓存
11.3 日志优化
- 配置日志级别
- 使用异步日志
- 配置日志滚动
- 定期清理旧日志
12. 注意事项
- 资源监控:定期检查系统资源使用情况
- 告警配置:配置合理的告警规则
- 日志管理:定期清理日志文件
- 性能优化:根据实际情况优化配置
- 安全配置:限制监控端点访问
- 备份策略:定期备份监控数据
- 监控覆盖:确保所有服务都被监控
- 告警测试:定期测试告警是否正常
