1. 项目概述
最近在部署TongWeb8应用服务器时,遇到了监控系统搭建的需求。作为一个长期使用Prometheus和Grafana的技术人员,我决定将这套成熟的监控方案应用到TongWeb8上。TongWeb8作为国产Java应用服务器,其监控数据的采集和展示需要特定的配置方法,这也是本文要详细介绍的内容。
在实际操作中,我发现TongWeb8已经内置了对Prometheus的支持,只需要通过控制台进行简单配置即可实现监控数据的暴露。而Grafana作为数据可视化工具,能够将这些监控数据以直观的图表形式展现出来,帮助我们更好地了解系统运行状态。
提示:本文基于TongWeb8.0.9.9版本,Prometheus 2.30+和Grafana 8.0+环境进行配置。不同版本可能存在细微差异。
2. 环境准备与前置条件
2.1 基础环境要求
在开始配置前,我们需要确保以下组件已经正确安装并运行:
- TongWeb8应用服务器:版本8.0.9.9,已正常安装并运行
- Prometheus监控系统:版本2.30或更高
- Grafana可视化平台:版本8.0或更高
- prometheus-client.war:这是TongWeb8提供的Prometheus客户端包,通常随产品文档一起提供
2.2 组件功能说明
- Prometheus:负责定时抓取和存储监控指标数据
- Grafana:提供数据可视化和告警功能
- prometheus-client.war:TongWeb8内置的监控数据暴露接口
在实际部署中,我发现prometheus-client.war这个文件经常被忽视。它实际上是一个标准的Java Web应用,部署在TongWeb8上后会暴露/metrics端点,Prometheus就是从这个端点抓取数据的。
3. TongWeb8控制台配置
3.1 部署prometheus-client.war
首先需要将prometheus-client.war部署到TongWeb8上。这个步骤与部署普通Web应用相同:
- 登录TongWeb8管理控制台
- 进入"应用管理"→"Web应用部署"
- 选择prometheus-client.war文件进行部署
- 确保应用状态为"已启动"
部署完成后,可以通过http://服务器IP:端口/prometheus-client/metrics访问监控数据端点。如果能看到一系列以# HELP开头的指标说明,说明部署成功。
3.2 配置组合监控
TongWeb8提供了灵活的监控项组合功能,可以根据实际需求选择要监控的指标:
- 进入控制台的"监视管理"→"组合监视"
- 点击"添加"按钮创建新的监控组合
- 填写组合名称(如"基础监控")
- 在可用监控项中选择需要的指标:
- JVM相关:堆内存、非堆内存、线程数等
- 系统资源:CPU、内存、磁盘等
- 网络连接:活跃会话数、请求处理时间等
- 点击"添加"按钮完成配置
在实际操作中,我发现选择过多监控项会影响性能。建议根据实际需求选择关键指标,一般包括:
- JVM堆内存使用情况
- 活跃线程数
- CPU使用率
- 系统内存使用情况
3.3 启用Prometheus服务
配置好监控组合后,需要启用Prometheus服务:
- 进入"监视管理"→"Prometheus服务"
- 打开"启用"开关
- 选择之前创建的监控组合
- 设置上报方式为"拉取"
- 填写服务器IP和端口(默认为30188)
- 配置认证信息(用户名和密码)
- 点击"更新"按钮保存配置
注意:如果启用了认证,后续在Prometheus配置中也需要提供相同的凭证,否则会导致数据抓取失败。
4. Prometheus配置
4.1 修改prometheus.yml
要让Prometheus能够抓取TongWeb8的监控数据,需要修改Prometheus的配置文件:
yaml复制scrape_configs:
- job_name: 'tongweb8'
metrics_path: '/prometheus-client/metrics'
static_configs:
- targets: ['192.168.10.12:30188']
basic_auth:
username: 'yeyehuo'
password: 'Yeyehuo163.com'
配置说明:
job_name:监控任务名称,可自定义metrics_path:监控数据端点路径targets:TongWeb8服务器的IP和端口basic_auth:如果TongWeb8配置了认证,需要在此提供凭证
4.2 验证配置
修改配置后,需要重新加载或重启Prometheus服务:
bash复制# 检查配置文件语法
promtool check config prometheus.yml
# 重新加载配置(如果Prometheus支持热加载)
kill -HUP $(pgrep prometheus)
# 或者直接重启服务
systemctl restart prometheus
验证配置是否生效:
- 访问Prometheus的Web界面(默认9090端口)
- 进入"Status"→"Targets"
- 查看tongweb8任务的状态是否为"UP"
- 在Graph页面输入任意TongWeb8指标(如jvm_memory_used_bytes)查看是否有数据
5. Grafana配置与仪表盘
5.1 添加Prometheus数据源
- 登录Grafana管理界面
- 进入"Configuration"→"Data Sources"
- 点击"Add data source"
- 选择"Prometheus"
- 配置参数:
- URL:http://prometheus:9090(根据实际部署情况调整)
- Access:Server(默认)
- 点击"Save & Test"验证连接
5.2 导入TongWeb8仪表盘
Grafana支持通过JSON文件导入预定义的仪表盘。以下是创建TongWeb8监控仪表盘的关键步骤:
- 下载或创建仪表盘JSON文件(参考本文提供的示例)
- 在Grafana中,点击"+"→"Import"
- 上传JSON文件或粘贴JSON内容
- 选择之前添加的Prometheus数据源
- 点击"Import"完成导入
仪表盘通常包含以下几个关键面板:
- JVM内存使用情况(堆/非堆)
- 线程状态(总数/死锁数)
- GC次数和时间
- CPU使用率
- 系统内存使用量
- 磁盘空间使用情况
5.3 自定义仪表盘
如果预定义的仪表盘不能满足需求,可以手动创建或修改:
- 点击仪表盘右上角的"Add panel"→"Add new panel"
- 在Metrics选项卡中输入PromQL查询语句
- 配置可视化选项(图表类型、颜色、单位等)
- 设置合适的面板标题
- 点击"Apply"保存面板
常用的PromQL查询示例:
- JVM堆内存使用:
jvm_memory_used_bytes{area="heap"} - CPU使用率:
system_cpu_usage - 活跃线程数:
jvm_threads_live
6. 常见问题与解决方案
6.1 监控数据不显示
问题现象:Prometheus或Grafana中看不到TongWeb8的监控数据
排查步骤:
- 检查TongWeb8的Prometheus服务是否启用
- 直接访问
http://TongWeb8IP:端口/prometheus-client/metrics看是否有数据 - 检查Prometheus的target状态是否为UP
- 查看Prometheus日志是否有抓取错误
解决方案:
- 确保网络连通性
- 检查认证信息是否正确
- 确认监控组合已正确配置
6.2 指标显示为"no data"
问题原因:
- 对应的监控项未在组合监控中启用
- 数据抓取间隔过长
- Prometheus配置错误
解决方法:
- 在TongWeb8控制台检查监控组合配置
- 确保相关监控项已添加
- 调整Prometheus的scrape_interval(默认15s)
- 检查Prometheus的抓取日志
6.3 性能影响
问题现象:启用监控后TongWeb8性能下降
优化建议:
- 减少不必要的监控项
- 调整数据抓取频率(scrape_interval)
- 避免在高频监控中使用复杂计算
- 考虑使用Prometheus的recording rules预计算常用指标
7. 监控指标详解
7.1 JVM相关指标
-
内存使用:
jvm_memory_used_bytes:各内存区域使用量jvm_memory_committed_bytes:JVM承诺的内存大小jvm_memory_max_bytes:内存区域最大可用量
-
线程信息:
jvm_threads_live:当前活动线程数jvm_threads_daemon:守护线程数jvm_threads_peak:峰值线程数
-
GC统计:
jvm_gc_collection_seconds_count:GC次数jvm_gc_collection_seconds_sum:GC总耗时
7.2 系统资源指标
-
CPU使用:
system_cpu_usage:系统CPU使用率system_load_average_1m:系统负载
-
内存使用:
system_memory_usage:系统内存使用率system_free_memory:空闲内存量
-
磁盘信息:
system_disk_usage:磁盘使用率system_disk_free:磁盘剩余空间
8. 高级配置与优化
8.1 监控项分组策略
对于大型系统,建议将监控项按功能分组:
- 基础资源组:CPU、内存、磁盘等
- JVM组:堆内存、线程、GC等
- 应用组:会话数、请求处理时间等
- 业务组:自定义业务指标
这样可以在Grafana中创建多个仪表盘,每个仪表盘专注于特定方面的监控。
8.2 告警规则配置
Prometheus支持配置告警规则,当指标超过阈值时触发告警:
yaml复制groups:
- name: tongweb-alerts
rules:
- alert: HighHeapUsage
expr: jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "High heap memory usage on {{ $labels.instance }}"
description: "Heap usage is {{ $value }}%"
8.3 长期存储方案
Prometheus默认只保留15天数据。对于长期监控需求,可以考虑:
- 远程存储适配器:将数据写入InfluxDB、TimescaleDB等
- Thanos或Cortex:提供全局视图和长期存储
- 定期备份:使用Prometheus的TSDB快照功能
9. 安全注意事项
-
认证保护:
- 始终为Prometheus端点启用认证
- 使用强密码并定期更换
- 考虑添加IP白名单限制
-
数据安全:
- 监控数据可能包含敏感信息
- 确保只有授权人员可以访问Grafana
- 考虑启用HTTPS加密通信
-
资源隔离:
- 生产环境和测试环境的监控系统应该隔离
- 为不同团队分配不同的Grafana组织或文件夹权限
10. 实际应用中的经验分享
经过多个项目的实践,我总结出以下几点经验:
-
监控项选择:不是越多越好,关键是要监控对业务有实际影响的指标。通常我会重点关注:
- JVM堆内存使用率(超过80%需要告警)
- 活跃线程数(突然增长可能预示问题)
- 请求处理时间(直接影响用户体验)
-
仪表盘设计:
- 将关键指标放在最显眼位置
- 使用颜色区分正常/警告/危险状态
- 添加必要的说明文字,方便其他团队成员理解
-
性能考量:
- 数据抓取间隔不宜过短(通常15-30秒足够)
- 复杂的PromQL查询会影响Grafana性能
- 历史数据查询范围越大,响应越慢
-
维护建议:
- 定期检查监控系统是否正常运行
- 随着业务发展调整监控策略
- 保留配置变更记录,便于问题排查
这套监控方案已经在我们的生产环境稳定运行超过一年,成功帮助我们发现了多次潜在的性能问题和内存泄漏。特别是在大促期间,通过实时监控JVM状态,我们能够及时调整参数,避免了服务中断。