温馨提示×

CentOS Java监控与报警设置

小樊
41
2025-12-29 03:12:27
栏目: 编程语言

CentOS Java监控与报警设置

一 监控体系与总体架构

  • 指标监控:以 JMX Exporter → Prometheus → Grafana 为主线,暴露 JVM 堆内存、GC 次数/时间、线程数 等关键指标,在 Grafana 配置阈值告警,并由 Alertmanager 推送通知。适用于生产级长期观测与容量规划。
  • 日志监控:以 Filebeat/Logstash → Elasticsearch → KibanaPromtail → Loki → Grafana 为主线,结构化解析日志,在 Kibana 或 Grafana 中配置基于关键词/错误级别/频次的告警。
  • 进程存活与自愈:使用 systemd 托管(如 Restart=on-failure)保证故障自启,配合 cron 健康检查脚本与 企业微信/钉钉 Webhook 实现即时告警与自动拉起。
  • 应急诊断:现场使用 jps/jstat/jstack/jmap/jinfo 快速定位 GC、线程、内存、类加载 等问题,必要时采集 Heap DumpJFR 深入分析。

二 指标监控落地步骤 Prometheus JMX Exporter Grafana

  • 安装与配置 JMX Exporter
    1. 下载 jmx_exporter jar,放置于如 /opt/monitor/jmx_exporter/jmx_prometheus_javaagent.jar
    2. 准备配置 /opt/monitor/jmx_exporter/config.yaml(可按需精简指标);
    3. 在 Java 启动参数中挂载 agent,例如:
      -javaagent:/opt/monitor/jmx_exporter/jmx_prometheus_javaagent.jar=8080:/opt/monitor/jmx_exporter/config.yaml
  • 配置 systemd 托管示例(/etc/systemd/system/demo.service)
    [Unit] Description=Demo Java App
    After=network.target
    [Service] Type=simple
    User=app
    WorkingDirectory=/opt/apps/demo
    ExecStart=/usr/bin/java -Xms256m -Xmx512m -javaagent:/opt/monitor/jmx_exporter/jmx_prometheus_javaagent.jar=8080:/opt/monitor/jmx_exporter/config.yaml -jar /opt/apps/demo/app.jar
    Restart=on-failure
    StandardOutput=journal
    StandardError=journal
    [Install] WantedBy=multi-user.target
    执行:systemctl daemon-reload && systemctl enable --now demo
  • Prometheus 抓取目标(/etc/prometheus/prometheus.yml)
    scrape_configs:
    • job_name: ‘java_app’
      static_configs:
      • targets: [‘localhost:8080’]
  • Grafana 与告警
    1. 添加 Prometheus 数据源;
    2. 导入 JVM Micrometer 或社区 JMX Exporter 仪表盘;
    3. 在 Grafana 或 Alertmanager 配置规则,如:
      • JVM Full GC 次数 5 分钟内 > 0 触发严重告警;
      • Old Gen 使用率 > 80% 持续 5m 触发告警;
      • 线程数 > 200 触发告警。

三 日志监控落地步骤 ELK 或 Loki Grafana

  • 方案A ELK(Elasticsearch Logstash Kibana)
    1. 部署 Elasticsearch、Logstash、Kibana
    2. Logstash 配置读取应用日志(如 /var/log/java-app.log),解析 timestamp、level、logger、message 等字段并输出到 Elasticsearch
    3. Kibana 创建 Index Pattern(如 java-logs-*),构建面板并在 Stack Management → Rules 中配置阈值/频次告警(如 ERROR5m 内 > 10 次)。
  • 方案B Grafana Loki(轻量替代)
    1. 部署 Loki、Promtail、Grafana
    2. Promtail 配置 tail 应用日志并打标签(如 job=java-app),发送至 Loki
    3. Grafana 添加 Loki 数据源,构建日志面板并配置 LogQL 告警规则(如:rate({job=“java-app”} |= “ERROR” [5m]) > 10)。
  • 日志框架与级别
    使用 Logback/Log4j2 输出结构化日志(JSON 便于检索),生产建议 INFO/WARN 级别,按需开启 DEBUG

四 进程存活与自愈 日志轮转与通知

  • 进程存活与自愈
    • systemd 自愈:在 service 中设置 Restart=on-failure,异常退出自动拉起;
    • 健康检查脚本(示例):
      #!/usr/bin/env bash
      APP_DIR=/opt/apps/demo
      JAR_NAME=app.jar
      HEALTH_LOG=$APP_DIR/logs/health.log
      pgrep -f “$JAR_NAME” >/dev/null || {
      echo “$(date) $JAR_NAME 已宕机,尝试拉起” >> “$HEALTH_LOG”
      cd “$APP_DIR” && nohup /usr/bin/java -Xms256m -Xmx512m -jar “$JAR_NAME” >> logs/stdout.log 2>&1 &
      }
    • 定时任务:*/1 * * * * /opt/apps/demo/health.sh
    • 通知建议:脚本中集成 企业微信/钉钉 Webhook,在拉起失败或连续失败 N 次时推送告警。
  • 日志轮转(/etc/logrotate.d/java-app)
    /var/log/java-app.log {
    daily
    rotate 7
    maxsize 10M
    missingok
    notifempty
    compress
    create 0644 root root
    }
  • 通知方式补充
    简单场景可用 Logwatch 生成日报/告警邮件;复杂场景建议统一走 Alertmanager/企业微信/钉钉

五 阈值与演练建议

  • 阈值设计思路
    • 明确目标:区分 SLO/错误预算 与瞬时波动;
    • 静态阈值:如 Full GC > 0/5m、Old Gen > 80%、线程数 > 200、HTTP 5xx > 1%/1m
    • 动态阈值:基于历史数据计算 均值 + 2σ 或分位数(如 P95/P99)并设置上下界;
    • 分组与抑制:按 服务/实例/环境 分组,配置 group_wait/group_interval 抑制抖动与重复告警。
  • 验证与演练
    • 在测试环境制造事件(如短时 ERROR 爆发、触发 Full GC),验证 告警触发→通知→恢复 全链路;
    • 定期评审阈值与通知策略,避免告警疲劳。

0