Prometheus + Grafana 监控方案,专为**单台物理机部署多个 Java 游戏进程 + 自建 MySQL**的场景设计。Java 进程通过 jstat/jcmd 无侵入采集 JVM 运行时指标(堆内存、新生代、老年代、GC、线程、类内存),MySQL 通过 pymysql 采集(Buffer Po...
基于 Prometheus + Grafana,专为 单台物理机多 Java 进程 + 自建 MySQL 场景设计。监控重点围绕 内存使用率,适配游戏服大内存、高 GC 压力的特点。
text
┌─────────────────────────────────────────────────────────┐
│ 单台物理游戏服务器 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────┐ │
│ │ Java进程1 │ │ Java进程2 │ │ Java进程3 │ │ MySQL │ │
│ │ (JVM) │ │ (JVM) │ │ (JVM) │ │ │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └───┬────┘ │
│ │ jstat/jcmd │ jstat/jcmd │ jstat/jcmd │ pymysql
│ └─────────────┴──────┬──────┴──────────────┘
│ │
│ game_agent.py
│ │
│ push │ Pushgateway ◄── Prometheus ──► Alertmanager
│ │ │
│ │ Feishu/Lark Webhook
│ │
│ query │ Grafana
└─────────────────────────────────────────────────────────┘
所有配置均通过环境变量注入,无硬编码。
变量必填默认值说明PUSHGATEWAY✅—Pushgateway 地址,如 http://pushgateway:9091``PUSH_INTERVAL``60采集推送间隔(秒)MYSQL_USER空MySQL 用户名(无 MySQL 时可留空)MYSQL_PASSWORD空MySQL 密码MYSQL_HOST``127.0.0.1MySQL 地址MYSQL_PORT``3306MySQL 端口GAME_ROOT_DIR``/data/game游戏服目录根路径GAME_PROCESS_NAME``javaJava 进程标识(cmdline 匹配关键字)AGENT_LOG_FILE``/var/log/game_monitor/agent.log日志路径HISTO_INTERVAL``600类直方图采集间隔(秒,0 表示关闭)
变量必填默认值说明FEISHU_WEBHOOK_URL✅—飞书机器人 Webhook URLWEBHOOK_PORT``5000监听端口PUSH_INTERVAL``60与 agent 保持一致(用于格式化)
bash
# 一键部署(需先设置飞书 Webhook)
FEISHU_WEBHOOK_URL="https://open.larksuite.com/..." bash monitor_install.sh
bash
ansible-playbook main.yml -l <hosts> \
-e "PUSHGATEWAY=http://<pushgateway>:9091" \
-e "MYSQL_USER=<user>" \
-e "MYSQL_PASSWORD=<your_mysql_password>" \
-e "GAME_ROOT_DIR=/data/game" \
-e "GAME_PROCESS_NAME=java"
文件说明monitor_install.sh监控服务器一键部署(Prometheus/Grafana/Alertmanager/Pushgateway)game_agent.py游戏服务器指标采集脚本(jstat + jcmd,无侵入)main.ymlAnsible Playbook,批量部署 agentwebhook.py告警 Webhook 服务,转发至飞书/ Larkrules.ymlPrometheus 告警规则(JVM + MySQL)game_monitor.servicesystemd 服务配置game_monitorlogrotate 日志轮转配置
指标说明标签heap_used_bytes堆内存已使用量hostname, game_dirheap_committed_bytes堆内存提交量hostname, game_diryoung_used_bytes新生代(Eden+S0+S1)已使用hostname, game_dirold_used_bytes老年代已使用hostname, game_dirgc_time_seconds本周期 GC 耗时(delta)hostname, game_dirgc_count本周期 GC 次数(delta)hostname, game_dirthreads_live活跃线程数hostname, game_dirjvm_upJVM 上线状态hostname, game_dirjvm_class_bytesTop 50 类内存占用hostname, game_dir, classjvm_class_instance_countTop 50 类实例数量hostname, game_dir, class
指标说明标签mysql_upMySQL 连接状态hostnamemysql_process_resident_memory_bytesMySQL 进程 RSShostnameinnodb_buffer_pool_bytes_dataInnoDB Buffer Pool 已使用hostnameinnodb_buffer_pool_bytes_totalInnoDB Buffer Pool 总大小hostname
预置 3 个 Dashboard JSON,开箱即用: references/files/
文件面板内容jvm_dashboard.json堆内存使用量/率、新生代、老年代、GC 耗时、线程数jvm_class_dashboard.jsonTop10 类内存/实例数排行、选中类趋势、Top20 快照表mysql_dashboard.jsonMySQL 存活、RSS 内存、Buffer Pool 概览及使用率
导入方式:Grafana → Dashboards → Import → 上传 JSON → 选择 Prometheus 数据源。
告警条件级别JVMHeapUsageHigh堆内存使用率 > 85%,持续 5 分钟(JVM 预热 1 小时后)warningJVMGcPressureWarningGC 时间占采集周期 > 30%,持续 3 分钟warningJVMGcPressureCriticalGC 时间占采集周期 > 60%,持续 2 分钟criticalMySQLDownMySQL 连接失败,持续 2 分钟criticalMySQLBufferPoolHighInnoDB Buffer Pool > 85%,持续 5 分钟warningMySQLMemoryHighMySQL RSS > 8GB,持续 5 分钟warning
bash
systemctl status game_monitor
tail -f /var/log/game_monitor/agent.log
# 检查环境变量
cat /opt/game_monitor/env.conf
bash
curl -s http://<pushgateway>:9091/-/healthy
curl -s "http://<prometheus>:9090/api/v1/targets" | jq '.data.activeTargets'
bash
curl -X POST "http://<webhook>:5000/webhook?level=warning" \
-H "Content-Type: application/json" -d '{"alerts":[]}'
journalctl -u feishu -f
references/deploy.mdreferences/rules.mdreferences/grafana.mdreferences/planning.mdreferences/faq.md