目录

    phoenix云监控平台使用文档


    phoenix云监控平台使用文档

    源码仓库地址

    GitCode仓库 Gitee仓库 GitHub仓库

    JavaDoc

    JavaDoc

    演示地址

    演示地址

    账号:guest
    密码:guest123
    注意:1.演示项目只提供非管理员账号,只有查看权限!
       2.演示项目访问比较慢是因为服务器网络带宽太小!

    GitHub Star 历史

    GitHub Star 历史

    王者荣耀

    GitCode G-Star 毕业项目认证

    1 介绍

    “phoenix” 是一个灵活可配置的开源监控平台,主要用于监控应用程序、服务器、网络设备、docker、数据库、网络、tcp 端口和 http 接口,通过实时收集、汇聚和分析监控信息,实现在发现异常时立刻推送告警信息,并且提供了可视化系统进行配置、管理、查看。

    1.1 应用程序

    默认支持 Java 应用程序,监控内容包括:在线状态、JVM(内存、线程池、线程、类、GC 等)、埋点监控(业务告警、异常日志)。其它应用程序需要自己开发客户端,来调用接口与服务端或者代理端通信(心跳接口、服务器信息接口、网络设备信息接口、下线接口、告警接口);

    1.2 服务器

    支持主流服务器,如 Linux、Windows、macOS、Unix 等;
    监控内容包括:在线状态、操作系统、CPU、平均负载、进程、磁盘、内存、网卡、电池、传感器;

    1.3 网络设备

    支持带有 SNMP 协议的网络设备,如交换机、路由器等;
    监控内容包括:在线状态、系统信息、接口信息;

    1.4 Docker

    监控内容包括:服务、容器、镜像、事件、资源;

    1.5 数据库

    支持 MySQL、Oracle、Redis、Mongo;
    监控内容:
      MySQL:会话;
      Oracle:会话、表空间;
      Redis:Redis信息全集;
      Mongo:Mongo信息全集;

    1.6 网络

    支持监控网络状态;

    1.7 TCP

    支持监控 TCP 服务状态;

    1.8 HTTP

    支持监控 HTTP 服务状态;

    1.9 告警

    默认支持电子邮件,收费版支持钉钉、企业微信、飞书。

    2 特点

    1)分布式;
    2)跨平台;
    3)支持 docker 部署;
    4)实时监测告警;
    5)数据加密传输;
    6)灵活可配置;
    7)用户界面支持 PC 端、移动端;
    8)基于 http 接口,支持拓展监控其它编程语言编写的程序。

    3 设计

    3.1 功能架构

    红旗标注部分为收费功能,需向作者购买(给源码,不开发票)。

    功能导图

    3.2 系统架构

    系统架构图

    3.3 运行环境

    1)Maven3+
    2)Jdk >=1.8,若使用 Sigar 监控服务器,则 Jdk 版本要用 1.8(1.8.0_131到1.8.0_241)
    3)Lombok
    4)Mysql5.7+

    3.4 技术选型

    1)核心框架:SpringBoot
    2)安全框架:SpringSecurity、SpringSession
    3)任务调度:JUC、SpringTask、Quartz
    4)持久层框架:MyBatis-Plus
    5)数据库连接池:Alibaba druid
    6)日志管理:SLF4J、Logback
    7)前端框架:Layui、ECharts 、jtopo、xterm
    8)监控框架:Sigar、oshi、Alibaba arthas、docker-java、snmp4j

    3.5 模块结构

    平台使用 Java + Layui + ECharts 开发,数据库采用 MySQL。

    phoenix(监控平台父工程)
    ├── phoenix-common(监控公共模块父工程)
    │ ├── phoenix-common-core(监控核心公共模块)
    │ ├── phoenix-common-netty(监控Netty公共模块)
    │ └── phoenix-common-web(监控WEB公共模块)
    ├── phoenix-client(监控客户端父工程)
    │ ├── phoenix-client-core(监控客户端)
    │ ├── phoenix-client-spring-boot-starter(监控客户端与springboot集成的starter)
    │ └── phoenix-client-spring-mvc-integrator(监控客户端与springmvc集成的integrator)
    ├── phoenix-agent(监控代理端)
    ├── phoenix-server(监控服务端)
    ├── phoenix-ui(监控UI端)
    ├── doc(文档)
    └── mvn(Maven打包脚本)

    phoenix:监控平台父工程,管理平台的依赖、构建、插件等;
    phoenix-common:监控公共模块,提供平台所有的公共代码,包含一个监控核心公共模块(phoenix-common-core)和一个监控Netty公共模块(phoenix-common-netty)、一个监控WEB公共模块(phoenix-common-web);
    phoenix-client:监控客户端,用于集成到Java应用程序中实现业务埋点和Java应用程序监控信息收集,包含一个通用模块(phoenix-client-core)和与springboot集成的starter(phoenix-client-spring-boot-starter)、与springmvc集成的integrator(phoenix-client-spring-mvc-integrator)两个拓展模块;
    phoenix-agent:监控代理端,用于收集服务器信息、Docker信息,汇聚、转发来自监控客户端的信息,若部署在跳板机上可打通网络壁垒;
    phoenix-server:监控服务端,是监控平台的核心模块,用于汇聚、分析监控信息,在发现异常时实时推送告警信息;
    phoenix-ui:监控可视化系统,用于平台配置、用户管理、监控信息查看、图表展示等;
    doc:包含平台的设计文档、服务启停脚本、数据库脚本等;
    mvn:包含平台的Maven打包脚本。

    4 配置

    4.1 初始化“监控数据库”

    下载项目源码并解压,进入目录:/phoenix/doc/数据库设计/sql/mysql/,找到 SQL 脚本,用 Navicat 或者其它 MySQL 数据库管理工具连上数据库并执行此文件即可。

    phoenix.sql
    

    4.2 编译源码

    解压源码,按照 maven 项目格式将源码导入 IDE,使用 maven 进行编译即可。

    4.3 监控配置

    ● 监控配置文件为: monitoring.properties 或者 monitoring-{profile}.properties ,UI 端、服务端、代理端、客户端都需要监控配置。
    ● 监控配置文件放置位置及优先级:指定的filepath > 当前工作目录/config/ > 当前工作目录/ > 指定的classpath > classpath:/config/ > classpath:/ 。例如下图方式放置配置文件,会被自动加载:

    配置文件夹位置

    监控配置文件位置

    监控配置项

    配置项 含义 必须项 默认值 收费版本
    monitoring.secure.encryption-algorithm-type 加密算法类型 不加解密
    monitoring.secure.aes.key AES加密算法秘钥
    monitoring.secure.des.key DES加密算法秘钥
    monitoring.secure.sm4.key SM4加密算法秘钥
    monitoring.comm.http.url 监控服务端(或者代理端)http通信url
    monitoring.comm.http.connect-timeout 连接超时时间(毫秒) 15000
    monitoring.comm.http.socket-timeout 等待数据超时时间(毫秒) 15000
    monitoring.comm.http.connection-request-timeout 从连接池获取连接的等待超时时间(毫秒) 15000
    monitoring.comm.websocket.url 监控服务端(或者代理端)websocket通信url 如果上游服务是监控服务端,默认为空,否则与http通信共用IP和端口
    monitoring.own.instance.order 实例次序(整数),用于在集群中区分应用实例,配置“1”就代表集群中的第一个应用实例 1
    monitoring.own.instance.endpoint 实例端点类型(server、agent、client、ui) client
    monitoring.own.instance.name 实例名称,一般为项目名
    monitoring.own.instance.desc 实例描述
    monitoring.own.instance.language 程序语言 Java
    monitoring.heartbeat.rate 与服务端(或者代理端)发心跳包的频率(秒),最小不能小于30秒 30
    monitoring.server-info.enable 是否采集服务器信息 false
    monitoring.server-info.rate 与服务端(或者代理端)发服务器信息包的频率(秒),最小不能小于30秒 60
    monitoring.server-info.ip 被监控服务器本机ip地址 否(自动获取)
    monitoring.server-info.user-sigar-enable 是否使用Sigar采集服务器信息,Sigar要求Jdk1.8(1.8.0_131到1.8.0_241) false
    monitoring.network-device-info.enable 是否采集网络设备信息 false
    monitoring.network-device-info.rate 与服务端(或者代理端)发送网络设备信息的频率(秒),最小不能小于300秒 300
    monitoring.network-device-info.snmp-connection-communities 采集网络设备信息snmp协议连接社区字符串 public
    monitoring.jvm-info.enable 是否采集Java虚拟机信息 false
    monitoring.jvm-info.rate 与服务端(或者代理端)发送Java虚拟机信息的频率(秒),最小不能小于30秒 60
    monitoring.docker-info.enable 是否采集docker信息 false
    monitoring.docker-info.rate 与服务端(或者代理端)发送docker信息的频率(秒),最小不能小于30秒 60
    monitoring.docker-info.host 被监控的docker主机 tcp://localhost:2375
    monitoring.docker-info.tls-verify 启用/禁用TLS验证 false
    monitoring.docker-info.cert-path 验证所需证书的路径
    monitoring.docker-info.config 其他docker配置文件的路径
    monitoring.docker-info.api-version API版本
    monitoring.docker-info.registry-url 注册地址
    monitoring.docker-info.registry-username 注册用户名
    monitoring.docker-info.registry-password 注册密码
    monitoring.docker-info.registry-email 注册电子邮箱
    monitoring.arthas.enable 是否开启arthas false

    1)监控 UI 端
    monitoring-{profile}.properties 文件配置监控属性。
    2)监控服务端
    monitoring-{profile}.properties 文件配置监控属性。
    3)监控代理端
    monitoring-{profile}.properties 文件配置监控属性。
    4)监控客户端
    添加监控配置文件 monitoring.properties 或者 monitoring-{profile}.properties ,并且正确配置它。

    注意:
    1){profile} 代表环境,源码中有 dev(开发环境)和 prod(生产环境)。
    2)springboot 客户端可以把监控配置写在 application.yml(或者 application-{profile}.yml)文件中,不再需要单独的监控配置文件,如果仍然使用单独的监控配置文件,需要注解 @EnableMonitoring(usingMonitoringConfigFile = true) 。

    application.yml 示例

    ##############################phoenix监控配置##############################
    phoenix:
      monitoring:
        comm:
          http:
            url: http://127.0.0.1:16000/phoenix-server
            connect-timeout: 15000
            socket-timeout: 60000
            connection-request-timeout: 15000
        instance:
          name: demo
          desc: demo
        jvm-info:
          enable: true
        arthas:
          enable: true
    

    4.4 许可证配置

    UI 端、服务端、代理端都需要许可证文件(license.txt),此文件放在源码根目录下。UI 端、服务端、代理端打包部署后,此许可证文件要放在 Jar 包同级目录。

    4.5 UI端自定义配置

    监控UI端自定义了一些配置项,只需在 application.yml(或者application-{profile}.yml) 配置文件中配置即可。

    #监控UI端自定义配置
    phoenix:
      #认证
      auth:
        #认证类型(self、thrid,默认值:self)
        type: self
        #本平台认证
        self-auth:
          #登录验证码
          login-captcha:
            #是否启用验证码
            enable: false
        #第三方认证
        third-auth:
          #第三方认证类型(cas)
          type: cas
          #CAS
          cas:
            #秘钥(默认值:phoenix)
            key: phoenix
            #cas服务端地址
            server-url-prefix: https://cas.example.org:8443/cas
            #cas登录地址
            server-login-url: ${phoenix.auth.third-auth.cas.server-url-prefix}/login
            #cas登出地址
            server-logout-url: ${phoenix.auth.third-auth.cas.server-url-prefix}/logout?service=${phoenix.auth.third-auth.cas.client-host-url}/index
            #cas客户端地址
            client-host-url: http://127.0.0.1:${server.port}${server.servlet.context-path}
            #CAS协议验证类型(cas、cas3,默认值:cas3)
            validation-type: cas3
    

    4.6 邮箱配置

    使用邮箱告警时,监控服务端需要进行邮箱配置,以 QQ 邮箱为例。

    4.6.1 QQ邮箱生成授权码

    1)在浏览器打开并登录 QQ 邮箱

    打开并登录QQ邮箱

    2)点击“设置”,打开邮箱设置

    打开邮箱设置

    3)点击“账户”,进入“账户”选项界面

    进入“账户”选项界面

    4)找到“POP3/SMTP服务”旁边的“开启”按钮,开启POP3/SMTP服务

    开启POP3/SMTP服务

    5)用邮箱绑定的手机号码发送短信到指定号码,发送后点击“我已发送”

    发送验证短信

    6)获取授权码

    获取授权码

    4.6.2 监控服务端配置邮箱

    在监控服务端的 application-{profile}.yml 文件中,配置邮箱,如下图所示:

    监控服务端配置邮箱

    4.7 数据源配置

    ###############################################数据源配置##################################################
    spring:
      datasource:
        druid:
          #数据源配置
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/phoenix?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&failOverReadOnly=false&rewriteBatchedStatements=true&socketTimeout=30000&connectTimeout=5000
          username: xxx
          password: xxx
    

    1)监控UI端
    application-{profile}.yml 文件配置数据源。
    2)监控服务端
    application-{profile}.yml 文件配置数据源。

    4.8 客户端启用监控

    客户端启用监控分为三步,首先加入监控 jar 包,然后加入监控配置文件,最后开启监控。

    4.8.1 普通Java程序

    在程序中加入监控 jar 包,例如 Maven 项目,则在 pom.xml 文件中增加如下依赖:

    <!-- https://mvnrepository.com/artifact/com.gitee.pifeng/phoenix-client-core -->
    <dependency>
      <groupId>com.gitee.pifeng</groupId>
      <artifactId>phoenix-client-core</artifactId>
      <version>${匹配源代码版本}</version>
    </dependency>
    

    在 main 方法中,调用方法 Monitor.start() 来开启监控功能,或者调用重载的方法 Monitor.start(configPath, configName) 指定监控配置文件的路径和名字来开启监控功能,如果未指定配置文件路径和名字,则配置文件需要放在 classpath:/ 下,名字必须为 monitoring.properties 。示例配置代码如下:

    public class Main {
        public static void main(String[] args) {
            // 开启监控
            Monitor.start();
            // 其它业务代码
        }
    }
    

    4.8.2 Spring boot程序

    在程序中加入监控 jar 包,例如 Maven 项目,则在 pom.xml 文件中增加如下依赖:

    <!-- https://mvnrepository.com/artifact/com.gitee.pifeng/phoenix-client-spring-boot-starter -->
    <dependency>
      <groupId>com.gitee.pifeng</groupId>
      <artifactId>phoenix-client-spring-boot-starter</artifactId>
      <version>${匹配源代码版本}</version>
    </dependency>
    

    在启动类上加上注解 @EnableMonitoring 来开启监控功能,或者通过注解的两个参数(configFilePath、configFileName)来指定配置文件的路径和名字,如果未指定配置文件路径和名字,则配置文件需要放在 classpath:/ 下,名字必须为 monitoring.properties

    1)不分环境配置,示例配置代码如下:

    @EnableMonitoring
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    

    2)分环境配置,示例配置代码如下:

    /**
    * 开发环境监控配置
    */
    @Configuration
    @Profile("dev")
    @EnableMonitoring(usingMonitoringConfigFile = true, configFileName = "monitoring-dev.properties")
    public class MonitoringUiDevConfig {
    }
    
    /**
    * 生产环境监控配置
    */
    @Configuration
    @Profile("prod")
    @EnableMonitoring(usingMonitoringConfigFile = true, configFileName = "monitoring-prod.properties")
    public class MonitoringUiProdConfig {
    }
    

    4.8.3 Spring mvc程序

    在程序中加入监控 jar 包,例如 Maven 项目,则在 pom.xml 文件中增加如下依赖:

    <!-- https://mvnrepository.com/artifact/com.gitee.pifeng/phoenix-client-spring-mvc-integrator -->
    <dependency>
      <groupId>com.gitee.pifeng</groupId>
      <artifactId>phoenix-client-spring-mvc-integrator</artifactId>
      <version>${匹配源代码版本}</version>
    </dependency>
    

    在 web.xml 文件中配置一个监听器,来开启监控功能:

    <!-- 开启监控功能 -->
    <web-app>
    <context-param>
        <param-name>configLocation</param-name>
        <param-value>classpath:monitoring.properties</param-value>
    </context-param>
    <listener>
        <listener-class>
           com.gitee.pifeng.monitoring.integrator.listener.MonitoringPlugInitializeListener
        </listener-class>
    </listener>
    </web-app>
    

    4.9 时钟同步

    部署监控程序(监控UI端、监控服务端、监控代理端、监控客户端)的服务器集群需要进行时钟同步(NTP),保证时间的一致性!

    5 部署

    5.1 Jar包部署

    1)打包
    监控服务端、监控 UI 端、监控代理端 直接打成可执行 jar。

    mvn -Dmaven.test.skip=true clean package
    

    2)上传 jar、脚本、license.txt

    注意:jar、脚本、license.txt 要放在同一目录下。

    i.jar在源码中的路径:
      phoenix/target/phoenix-server.jar
      phoenix/target/phoenix-ui.jar
      phoenix/target/phoenix-agent.jar
    ii.脚本在源码中的路径:
    ① Linux 系统
      phoenix/doc/LinuxServices/phoenix-server/phoenix_server.sh
      phoenix/doc/LinuxServices/phoenix-ui/phoenix_ui.sh
      phoenix/doc/LinuxServices/phoenix-agent/phoenix_agent.sh
    ② Windows 系统
      phoenix/doc/WindowsServices/phoenix-server/startup_server.bat
      phoenix/doc/WindowsServices/phoenix-ui/startup_ui.bat
      phoenix/doc/WindowsServices/phoenix-agent/startup_agent.bat
    iii.license.txt在源代码中的路径:
      phoenix/license.txt
    3)运行
    i.Linux 系统

    程序 脚本 命令 含义
    监控服务端 phoenix_server.sh ./phoenix_server.sh start 启动
    监控服务端 phoenix_server.sh ./phoenix_server.sh stop 停止
    监控服务端 phoenix_server.sh ./phoenix_server.sh restart 重启
    监控服务端 phoenix_server.sh ./phoenix_server.sh status 检查状态
    监控UI端 phoenix_ui.sh ./phoenix_ui.sh start 启动
    监控UI端 phoenix_ui.sh ./phoenix_ui.sh stop 停止
    监控UI端 phoenix_ui.sh ./phoenix_ui.sh restart 重启
    监控UI端 phoenix_ui.sh ./phoenix_ui.sh status 检查状态
    监控代理端 phoenix_agent.sh ./phoenix_agent.sh start 启动
    监控代理端 phoenix_agent.sh ./phoenix_agent.sh stop 停止
    监控代理端 phoenix_agent.sh ./phoenix_agent.sh restart 重启
    监控代理端 phoenix_agent.sh ./phoenix_agent.sh status 检查状态

    ii.Windows 系统

    程序 脚本 含义
    监控UI端 startup_ui.bat 启动
    监控服务端 startup_server.bat 启动
    监控代理端 startup_agent.bat 启动

    5.2 安装成Windows服务

    1)打包
    监控服务端、监控 UI 端、监控代理端 直接打成 zip 包。

    mvn -Dmaven.test.skip=true clean package
    

    2)上传 zip 包
    zip包在源码中的路径:
      phoenix/target/phoenix-server-windows.zip
      phoenix/target/phoenix-ui-windows.zip
      phoenix/target/phoenix-agent-windows.zip
    3)解压 zip 包
    4)运行

    脚本 含义
    service_install.cmd 安装
    service_restart.cmd 重启
    service_start.cmd 启动
    service_status.cmd 查看状态
    service_stop.cmd 停止
    service_uninstall.cmd 卸载

    5.3 安装成Linux服务

    参考文章《phoenix UI端程序在 Linux 服务器上设置开机自启动》《phoenix代理端程序在 Linux 服务器上设置开机自启动》《phoenix服务端程序在 Linux 服务器上设置开机自启动》

    5.4 Docker部署

    最低资源需求:1 核 CPU / 2 GB 内存 / 5 GB 磁盘。

    注意:“监控代理端” 不建议在 Docker 环境中运行,应该直接裸机运行,因为要获取宿主机信息。

    5.4.1 方式一:在线部署

    一键安装:10 分钟即可完成自动安装。

    5.4.1.1 安装数据库、phoenix-server、phoenix-ui

    5.4.1.1.1 Docker部署

    软件依赖:Docker 20.10.14 版本以上。

    bash -c "$(curl -fsSL https://gitee.com/monitoring-platform/phoenix/raw/master/doc/Docker/install.sh)"
    
    5.4.1.1.2 Docker Compose部署

    软件依赖:Docker Compose 2.0.0 版本以上。

    bash -c "$(curl -fsSL https://gitee.com/monitoring-platform/phoenix/raw/master/doc/DockerCompose/install.sh)"
    

    5.4.1.2 安装phoenix-agent

    如果需要监控服务器,则需要单独安装 phoenix-agent

    5.4.1.2.1 Docker部署

    软件依赖:Docker 20.10.14 版本以上。

    bash -c "$(curl -fsSL https://gitee.com/monitoring-platform/phoenix/raw/master/doc/Docker/phoenix-agent/install_agent.sh)"
    

    5.4.1.3 配置服务

    5.4.1.3.1 配置phoenix-server

    安装完成后,请执行以下操作:
    1.从源码目录 phoenix/phoenix-server/src/main/resources/ 中复制 application-prod.yml 文件;
    2.将其放置于服务器路径 /data/phoenix/phoenix-server/config/
    3.编辑该文件,只保留电子邮件配置,其它配置全部删掉,并把电子邮件配置正确配置好;
    4.重启 phoenix-server 容器。

    5.4.1.3.2 配置phoenix-agent

    安装完成后,请执行以下操作:
    1.从源码目录 phoenix/phoenix-agent/src/main/resources/ 中复制 monitoring-prod.properties 文件;
    2.将其放置于服务器路径 /data/phoenix/phoenix-agent/config/
    3.编辑该文件,将 monitoring.comm.http.url 的值配置为 http://phoenix-server主机IP:16000/phoenix-server
    4.重启 phoenix-agent 容器。

    5.4.2 方式二:服务器本地构建docker镜像

    1)打包
    监控服务端、监控 UI 端 直接打成可执行 jar。

    mvn -Dmaven.test.skip=true clean package
    

    2)上传 jar、Dockerfile、license.txt

    注意:jar、Dockerfile、license.txt 要放在同一目录下。

    i.jar在源码中的路径:
      phoenix/target/phoenix-server.jar、
      phoenix/target/phoenix-ui.jar、
    ii.Dockerfile在源代码中的路径:
      phoenix/phoenix-server/src/main/docker/Dockerfile、
      phoenix/phoenix-ui/src/main/docker/Dockerfile,
    iii.license.txt在源代码中的路径:
      phoenix/license.txt
    3)构建 docker 镜像
    ● 监控服务端:

    docker build -t phoenix/phoenix-server .
    

    ● 监控 UI 端:

    docker build -t phoenix/phoenix-ui .
    

    4)运行
    ● 监控服务端:

    docker run -itd \
      -v /etc/localtime:/etc/localtime:ro \
      -v /data/phoenix/phoenix-server/liblog4phoenix:/app/liblog4phoenix \
      -v /data/phoenix/phoenix-server/config:/app/config \
      --net host \
      --restart unless-stopped \
      --name phoenix-server \
      phoenix/phoenix-server /bin/bash
    

    ● 监控 UI 端:

    docker run -itd \
      -v /etc/localtime:/etc/localtime:ro \
      -v /data/phoenix/phoenix-ui/liblog4phoenix:/app/liblog4phoenix \
      -v /data/phoenix/phoenix-ui/config:/app/config \
      --net host \
      --restart unless-stopped \
      --cap-add=NET_BIND_SERVICE \
      --name phoenix-ui \
      phoenix/phoenix-ui /bin/bash
    

    5.4.3 方式三:Maven打包远程部署(已废弃)

    1)有一台已经安装好 Docker 环境的服务器,并且允许远程连接(以 Centos7 下的 yum 方式安装的 Docker,且使用 service 方式运行为例,开启远程连接):

    vi /usr/lib/systemd/system/docker.service
    #确保:ExecStart 的后面有: -H tcp://0.0.0.0:2375
    #修改完成后保存退出,刷新并重启docker服务
    systemctl daemon-reload
    systemctl restart docker
    

    2)在系统环境变量中添 DOCKER_HOST,如下图所示:

    系统环境变量中添DOCKER_HOST

    3)编译项目打包项目并构建镜像

    mvn -Dmaven.test.skip=true clean package docker:build
    

    4)运行
    ● 监控服务端:

    docker run -itd \
      -v /etc/localtime:/etc/localtime:ro \
      -v /data/phoenix/phoenix-server/liblog4phoenix:/app/liblog4phoenix \
      -v /data/phoenix/phoenix-server/config:/app/config \
      --net host \
      --restart unless-stopped \
      --name phoenix-server \
      phoenix/phoenix-server /bin/bash
    

    ● 监控UI端:

    docker run -itd \
      -v /etc/localtime:/etc/localtime:ro \
      -v /data/phoenix/phoenix-ui/liblog4phoenix:/app/liblog4phoenix \
      -v /data/phoenix/phoenix-ui/config:/app/config \
      --net host \
      --restart unless-stopped \
      --cap-add=NET_BIND_SERVICE \
      --name phoenix-ui \
      phoenix/phoenix-ui /bin/bash
    

    5.5 集群部署

    监控服务端、监控 UI 端 支持集群部署,提升系统的容灾和可用性。
    集群部署时的几点要求和建议:
    1)DB 配置保持一致;
    2)集群机器时钟保持一致(单机集群忽视);
    3)建议:推荐通过 nginx 为集群做负载均衡。监控服务端、监控 UI 端均通过 nginx 进行访问。

    集群部署架构图

    5.6 开放端口

    在防火墙中打开指定端口,让网络通信能正常进行。

    程序 端口 作用 收费版本 是否必须开放
    监控服务端 16000 http端口
    监控服务端 16001 websocket端口 是(收费版特有端口) 是(收费版必须开放)
    监控UI端 80 http端口
    监控代理端 12000 http端口 否(用作中继转发时需要开放)

    6 访问

    监控 UI 端 访问 URL:http(s)://localhost/phoenix-ui/index ,开发环境(dev)使用 http,生产环境(prod)使用 https,初始账号/密码:admin/admin123guest/guest123

    7 使用

    7.1 配置管理

    7.1.1 环境管理

    环境管理是为了给监控平台中监控的服务项(服务器、应用程序、数据库、网络、TCP 服务、HTTP 服务、Docker 服务)添加环境,从而方便根据这些服务的实际使用环境进行管理,如:筛选、导出。

    环境管理

    设置被监控的服务器环境

    根据环境查询服务器列表

    7.1.2 分组管理

    分组管理与环境管理类似,但它是从另一个维度去管理监控平台中监控的服务项。

    7.1.3 监控配置

    7.1.3.1 阈值

    阈值一共分为 10 个等级,从 1 到 10,值越小监控越灵敏。
    1)“服务器、应用程序、网络设备(自动发现)”的在线状态检测,依赖阈值的设置。例如 monitoring.properties 配置文件中配置的 monitoring.heartbeat.rate=30(心跳频率是 30 秒),而监控配置界面中配置的阈值是 2,则 30×2=60秒 内没收到心跳包,判别应用程序离线,反之应用程序在线;若监控配置界面中配置的阈值是3,则 30×3=90秒 内没收到心跳包,判别应用程序离线,反之应用程序在线。
    2)“数据库、网络(PING)、端口(TCP)、接口(HTTP)、网络设备(手动添加)”的在线状态检测,判断离线会重试阈值设置的次数。若监控配置界面中配置的阈值是 2,则重试 2 次还是离线,才判别为离线。

    告警阈值

    7.1.3.2 告警

    7.1.3.2.1 是否告警

    “是否告警”配置项是告警总开关,若此处关闭,则整个监控平台不发送任何告警信息。

    告警开关

    7.1.3.2.2 告警静默

    “告警静默”配置项若打开,则在静默时间段产生的告警,只会产生告警记录,而不会通过配置的告警方式进行通知。

    告警静默

    7.1.3.2.3 级别

    告警分为 4 个级别:INFO、WARN、ERROR、FATAL。
    FATAL > ERROR > WARN > INFO,只有具体告警项配置的告警级别大于等于此处配置的级别时,才会在异常时发送告警,反之不发送告警。例如:服务器 CPU 的告警级别是 INFO,而此处配置的告警级别是 WARN,则服务器 CPU 过载也不会发送告警。

    告警级别

    7.1.3.2.4 方式

    告警方式有邮箱、短信、钉钉、企业微信、飞书。是一个多选开关,可以同时配置多种告警方式发送告警。其中短信告警需要自己二次开发去对接自己公司的短信服务接口。

    告警方式

    7.1.3.2.4.1 邮箱

    可以配置多个收件人邮箱号。

    邮箱告警

    7.1.3.2.4.2 短信

    ① 可以配置多个收信人手机号;
    ② 接口地址填自己公司的短信服务地址,并且在监控平台的 phoenix-server 模块做二次开发以支持短信告警。

    短信告警

    7.1.3.2.4.3 钉钉(收费版)

    (1) 创建群机器人
    ① 在 PC 端钉钉选择需要添加机器人的群聊,然后依次单击【群设置 -> 智能群助手 -> 机器人管理】

    创建群机器人

    创建群机器人

    创建群机器人

    创建群机器人

    ② 在机器人管理页面选择自定义机器人,输入机器人名字并选择要发送消息的群,同时可以为机器人设置机器人头像

    创建群机器人

    ③ 完成必要的安全设置,勾选我已阅读并同意《自定义机器人服务及免责条款》,然后单击完成

    创建群机器人

    (2) 配置钉钉告警

    配置钉钉告警

    7.1.3.2.4.4 企业微信(收费版)

    (1) 创建群机器人
    ① 群机器人添加入口
    【PC内部群聊 -> 右上方三个点 -> 添加群机器人】,可以新建机器人或选择已发布到公司的机器人

    PC端添加群机器人

    【手机端内部群聊 -> 右上角三个点 -> 添加群机器人】:

    手机端添加群机器人

    ② 获取群机器人Webhook地址

    群机器人的创建人,可在查看机器人信息时,获取对应机器人的 Webhook URL。
    电脑端【进入群聊 -> 群成员列表 -> 右键对应机器人 -> 查看资料-> Webhook地址】

    PC端获取群机器人Webhook地址

    手机端【进入群聊 -> 右上角三个点 -> 群机器人 -> 点击对应机器人 -> Webhook地址】

    手机端获取群机器人Webhook地址

    (2) 配置企业微信告警

    配置企业微信告警

    7.1.3.2.4.5 飞书(收费版)

    (1) 创建群机器人
    ① 在 PC 端飞书选择需要添加机器人的群组,然后依次单击【设置 -> 群机器人 -> 添加机器人 -> 自定义机器人】

    创建群机器人

    创建群机器人

    创建群机器人

    创建群机器人

    ② 设置机器人头像、机器人名称 和 描述

    创建群机器人

    ③ 获取Webhook地址和秘钥

    创建群机器人

    (2) 配置飞书告警

    配置飞书告警

    7.1.3.3 网络

    网络有一个是否监控的总开关,打开则监控网络,关闭则不监控网络。网络状态是否监控、是否告警也可以单独设置。

    网络监控配置

    7.1.3.4 TCP服务

    TCP 服务有一个是否监控的开关,打开则监控 TCP 服务,关闭则不监控 TCP 服务。TCP 服务状态是否监控、是否告警也可以单独设置。

    TCP服务监控配置

    7.1.3.5 HTTP服务

    HTTP 服务有一个是否监控的开关,打开则监控 HTTP 服务,关闭则不监控 HTTP 服务。HTTP 服务状态是否监控、是否告警也可以单独设置。

    HTTP服务监控配置

    7.1.3.6 数据库

    数据库有一个是否监控的开关,打开则监控数据库,关闭则不监控数据库。数据库状态是否监控、是否告警也可以单独设置。

    数据库监控配置

    7.1.3.6.1 表空间(Oracle)

    Oracle 数据库支持表空间监控,可以设置表空间是否监控、是否告警,以及告警阈值和告警级别,满足条件则进行告警。

    Oracle表空间监控配置

    7.1.3.7 应用程序

    应用程序有一个是否监控的总开关,打开则监控应用程序,关闭则不监控应用程序。应用程序状态是否监控、是否告警也可以单独设置。

    应用程序监控配置

    7.1.3.8 服务器

    服务器有一个是否监控的开关,打开则监控服务器,关闭则不监控服务器。服务器状态是否监控、是否告警也可以单独设置。

    服务器监控配置

    7.1.3.8.1 CPU

    可以设置 CPU 监控的告警阈值和告警级别,满足条件则进行告警。

    CPU监控

    7.1.3.8.2 15分钟负载

    平均负载,是衡量一个系统整体负载情况的关键指标,指是处于可运行状态和不可中断状态的进程的平均数量。即单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。它和 CPU 使用率并没有直接关系。平均负载值越低越好,负载过高会导致机器无法处理其他请求及操作,甚至导致死机。系统的负载高,主要是由于 CPU 使用、内存使用、IO 消耗三部分构成。任意一项使用过多,都将导致负载的急剧攀升。
    在平均负载的指标中,有三个值:1分钟平均负载、5分钟平均负载,15分钟平均负载。我们在排查问题的时候也是可以参考这三个值。一般情况下,1分钟平均负载表示的是最近的暂时现象,15分钟平均负载表示的是持续现象,并非暂时问题。如果15分钟平均负载较高,而1分钟平均负载较低,可以认为情况有所好转。反之,情况可能在恶化。
    监控平台可以设置15分钟平均负载监控的告警阈值和告警级别,满足条件则进行告警。

    15分钟负载监控

    7.1.3.8.3 内存

    可以设置内存监控的告警阈值和告警级别,满足条件则进行告警。

    内存监控

    7.1.3.8.4 磁盘

    可以设置磁盘监控的告警阈值和告警级别,满足条件则进行告警。

    磁盘监控

    7.1.3.9 Docker

    Docker 有一个是否监控的开关,打开则监控 Docker,关闭则不监控 Docker。Docker 状态是否监控、是否告警也可以单独设置。

    docker监控监控

    7.1.4 告警定义

    告警定义用于自定义业务埋点监控,在此处添加自定义告警,然后就可以在埋点监控的时候使用。

    添加告警定义

    在埋点监控的时候,使用“添加告警定义”中生成的告警编码,则在满足告警条件的时候就会以告警定义中定义的内容发送告警。

    // 业务埋点监控
    ScheduledExecutorService service = Monitor.buryingPoint(() -> {
      // 假如发现了业务异常,用下面的代码发送告警
      Alarm alarm = new Alarm();
      alarm.setCode("bb5dd07988ecac50");
      alarm.setMonitorType(MonitorTypeEnums.CUSTOM);
      Result result = Monitor.sendAlarm(alarm);
      System.out.println("发送业务告警结果:" + result.toJsonString());
    }, 0, 1, TimeUnit.HOURS, ThreadTypeEnums.IO_INTENSIVE_THREAD);
    

    7.2 业务埋点监控

    Java应用程序只要集成了监控客户端,就具有业务埋点监控的能力。

    7.2.1 业务告警

    在需要业务监控的业务代码位置,通过 Monitor.buryingPoint(Runnable command, long initialDelay, long period, TimeUnit unit, ThreadTypeEnums threadTypeEnum) 方法定时监控业务运行情况,通过 Monitor.sendAlarm(Alarm alarm) 发送告警。可以参考以下示例代码(不局限于此,可以自己灵活使用):

    // 业务埋点监控
    ScheduledExecutorService service = Monitor.buryingPoint(() -> {
      // 假如发现了业务异常,用下面的代码发送告警
      Alarm alarm = new Alarm();
      alarm.setAlarmLevel(AlarmLevelEnums.ERROR);
      alarm.setTitle("业务埋点监控");
      alarm.setTest(false);
      alarm.setCharset(Charsets.UTF_8);
      alarm.setMsg("测试普通maven程序业务埋点监控!");
      // alarm.setCode("001");
      alarm.setMonitorType(MonitorTypeEnums.CUSTOM);
      Result result = Monitor.sendAlarm(alarm);
      System.out.println("发送业务告警结果:" + result.toJsonString());
    }, 0, 1, TimeUnit.HOURS, ThreadTypeEnums.IO_INTENSIVE_THREAD);
    

    7.2.2 异常日志(收费版)

    在需要收集异常日志的业务代码位置,通过 Monitor.collectException(ExceptionInfo exceptionInfo, boolean alarmEnable) 收集异常日志,此方法有两个入参,第一个入参为 异常日志信息,第二个入参为 是否开启异常日志信息告警。可以参考以下示例代码(不局限于此,可以自己灵活使用):

    @ExceptionHandler(Exception.class)
    public ModelAndView exceptionHandler(HttpServletRequest request, Exception e) throws Exception {
        log.error("Requst URL : {},Exception : {}", request.getRequestURL(), e.getMessage());
        String method = request.getMethod();
        String requestUri = request.getRequestURI();
        // 异常名称
        String excName = e.getClass().getSimpleName();
        // 转换请求参数
        Map<String, Object> reqParamMap = MapUtils.convertParamMap(request.getParameterMap());
        // 封装异常信息
        ExceptionInfo exceptionInfo = ExceptionInfo.builder()
                .excName(excName)
                .excMessage(ExceptionUtils.stackTraceToString(excName, e.getMessage(), e.getStackTrace()))
                .reqParam(reqParamMap.isEmpty() ? "" : JSON.toJSONString(reqParamMap))
                .reqUri(method + " " + requestUri)
                .reqIp(AccessObjectUtils.getClientAddress(request))
                .userId(SpringSecurityUtil.getCurrentUserRealm() == null ? null : SpringSecurityUtil.getCurrentUserRealm().getUserId())
                .username(SpringSecurityUtil.getCurrentUserRealm() == null ? null : SpringSecurityUtil.getCurrentUserRealm().getUsername())
                .build();
        // 收集异常信息
        Monitor.collectException(exceptionInfo, true);
        // 标识了状态码的时候就不拦截
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
            throw e;
        }
        ModelAndView mv = new ModelAndView();
        mv.addObject("url", request.getRequestURL());
        mv.addObject("exception", e);
        mv.setViewName("error/error");
        return mv;
    }
    

    7.3 Java线程池监控(收费版)

    7.3.1 代码使用

    ThreadPoolExecutor 或者 ScheduledThreadPoolExecutor 创建的线程池可以被监控。只需在配置线程池的方法上加上 @MonitoringThreadPool 注解即可被自动监控,可以通过 @MonitoringThreadPoolvalue() 参数设置线程池名称。

    import com.gitee.pifeng.monitoring.common.util.server.ProcessorsUtils;
    import com.gitee.pifeng.monitoring.starter.annotation.MonitoringThreadPool;
    import org.apache.commons.lang3.concurrent.BasicThreadFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Lazy;
    
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    /**
     * <p>
     * 线程池配置
     * </p>
     *
     * @author 皮锋
     * @custom.date 2024年12月05日 下午18:25:50
     */
    @Configuration
    public class ThreadPoolConfig {
    
        /**
         * 数据库服务监控线程池
         *
         * @return {@link ThreadPoolExecutor}
         * @author 皮锋
         * @custom.date 2024/12/05 19:48
         */
        @Lazy
        @MonitoringThreadPool("phoenix-server-db-monitor-pool")
        @Bean(name = "dbMonitorThreadPoolExecutor", destroyMethod = "shutdown")
        public ThreadPoolExecutor dbMonitorThreadPoolExecutor() {
            return new ThreadPoolExecutor(
                    // 线程数 = Ncpu /(1 - 阻塞系数),IO密集型阻塞系数相对较大
                    (int) (ProcessorsUtils.getAvailableProcessors() / (1 - 0.8)),
                    (int) (ProcessorsUtils.getAvailableProcessors() / (1 - 0.8)),
                    1L,
                    TimeUnit.HOURS,
                    new LinkedBlockingQueue<>(Integer.MAX_VALUE),
                    new BasicThreadFactory.Builder()
                            // 设置线程名
                            .namingPattern("phoenix-server-db-monitor-pool-thread-%d")
                            // 设置为守护线程
                            .daemon(true)
                            .build(),
                    new ThreadPoolExecutor.AbortPolicy());
        }
    
    }
    

    7.3.2 数据展示

    Java线程池监控图表

    end
  1. 作者: 锋哥 (联系作者)
  2. 发表时间: 2026-02-11 09:31
  3. 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  4. 转载声明:如果是转载博主转载的文章,请附上原文链接
  5. 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  6. 评论

    站长头像 知录

    你一句春不晚,我就到了真江南!

    文章0
    浏览0

    文章分类

    标签云