Back to Arthas

Arthas JFR Backend - Java Flight Recorder 分析后端

labs/arthas-jfr-backend/README.md

3.1.07.1 KB
Original Source

Arthas JFR Backend - Java Flight Recorder 分析后端

基于 Spring Boot 3.5.3 的现代化 JFR (Java Flight Recorder) 文件分析后端服务,提供 RESTful API 支持多维度性能分析和火焰图数据生成。

功能特性

核心功能

  • JFR 文件解析: 基于 JMC 8.3.1 的标准 JFR 文件解析引擎
  • 多维度分析: 支持 17+ 种性能维度的深度分析
  • 文件管理: 完整的文件上传、存储、删除和查询功能
  • 火焰图数据: 生成前端火焰图组件所需的数据结构
  • RESTful API: 提供标准化的 REST API 接口

分析维度

  • CPU 性能: CPU 时间、CPU 采样、原生执行采样
  • 内存分析: 内存分配次数、分配大小统计
  • I/O 操作: 文件读写时间、网络读写时间
  • 线程分析: 线程同步、线程等待、线程睡眠时间
  • 类加载: 类加载次数、类加载时间统计
  • 时钟分析: 墙钟时间、CPU 时间对比分析

技术特性

  • 高性能: 支持大文件处理,优化的内存使用
  • 可扩展: 模块化的提取器架构,易于添加新的分析维度
  • 容错性: 完善的异常处理和错误码体系
  • 数据持久化: 支持 H2 内存数据库和 MySQL 生产数据库

技术栈

后端技术

  • Spring Boot 3.5.3: 主框架,支持 Java 17+
  • Java 17: 开发语言,使用现代 Java 特性
  • Spring Data JPA: 数据持久化层
  • H2/MySQL: 数据库支持(开发/生产环境)
  • JMC 8.3.1: Java Mission Control,JFR 文件解析核心
  • Lombok: 减少样板代码
  • Maven: 依赖管理和构建工具

核心依赖

  • org.openjdk.jmc:flightrecorder - JFR 文件解析
  • org.openjdk.jmc:common - JMC 通用组件
  • org.openjdk.jmc:flightrecorder.rules - JFR 规则引擎
  • org.springframework.boot:spring-boot-starter-web - Web 服务
  • org.springframework.boot:spring-boot-starter-data-jpa - 数据访问

项目结构

arthas-jfr-backend/
├── src/main/java/org/example/jfranalyzerbackend/
│   ├── config/              # 配置类
│   │   ├── ArthasConfig.java    # Arthas 集成配置
│   │   ├── CorsConfig.java      # 跨域配置
│   │   └── Result.java          # 统一响应结果
│   ├── controller/          # REST 控制器
│   │   ├── FileController.java      # 文件管理 API
│   │   └── JFRAnalysisController.java # JFR 分析 API
│   ├── service/             # 业务服务层
│   │   ├── FileService.java         # 文件服务接口
│   │   ├── JFRAnalysisService.java  # JFR 分析服务接口
│   │   ├── JFRAnalyzer.java        # JFR 分析器接口
│   │   └── impl/                   # 服务实现
│   ├── extractor/           # JFR 数据提取器
│   │   ├── Extractor.java          # 提取器基类
│   │   ├── EventVisitor.java       # 事件访问器
│   │   ├── JFRAnalysisContext.java # 分析上下文
│   │   ├── *Extractor.java         # 各种性能维度提取器
│   │   └── PerfDimensionFactory.java # 性能维度工厂
│   ├── entity/              # 实体类
│   │   ├── shared/              # 共享实体
│   │   ├── FileEntity.java       # 文件实体
│   │   └── ProfileDimension.java # 性能维度实体
│   ├── model/               # 数据模型
│   │   ├── AnalysisResult.java    # 分析结果模型
│   │   ├── FlameGraph.java        # 火焰图数据模型
│   │   ├── jfr/                  # JFR 相关模型
│   │   └── symbol/               # 符号表模型
│   ├── repository/          # 数据访问层
│   ├── enums/              # 枚举类
│   ├── exception/          # 异常处理
│   ├── request/            # 请求对象
│   ├── vo/                 # 视图对象
│   ├── util/               # 工具类
│   └── JfrAnalyzerBackendApplication.java # 启动类
└── src/main/resources/
    └── application.yml      # 应用配置文件

快速开始

环境要求

  • Java 17+: 必需,项目使用 Java 17 特性
  • Maven 3.6+: 构建工具
  • 内存: 建议 4GB+,用于处理大型 JFR 文件

配置数据库(可选)

默认使用 H2 内存数据库,生产环境可配置 MySQL:

yaml
# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/arthas_jfr
    username: your_username
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    properties:
      hibernate.dialect: org.hibernate.dialect.MySQLDialect

启动服务

bash
# 开发模式
mvn spring-boot:run

# 或者打包后运行
mvn clean package
java -jar target/arthas-jfr-backend-4.0.5.jar

验证服务

  • 后端服务: http://localhost:8200
  • H2 控制台: http://localhost:8200/h2-console
  • API 文档: http://localhost:8200/api/files (文件列表)

配置说明

yaml
# 关键配置项
arthas:
  jfr-storage-path: ${user.home}/arthas-jfr-storage  # JFR 文件存储路径

spring:
  servlet:
    multipart:
      max-file-size: 1GB        # 最大文件大小
      max-request-size: 1GB     # 最大请求大小
  server:
    port: 8200                  # 服务端口

开发指南

添加新的分析维度

  1. 创建新的提取器类:
java
@Component
public class CustomExtractor extends Extractor {
    @Override
    public String getDimensionName() {
        return "CUSTOM_DIMENSION";
    }
    
    @Override
    public void extract(RecordedEvent event, JFRAnalysisContext context) {
        // 实现提取逻辑
    }
}
  1. PerfDimensionFactory 中注册:
java
public static PerfDimension createCustomDimension() {
    return new PerfDimension("CUSTOM_DIMENSION", "自定义维度", "ms");
}

数据库配置

默认使用 H2 内存数据库,生产环境可配置 MySQL:

yaml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/arthas_jfr
    username: your_username
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver

参考项目

本项目参考了以下优秀的开源项目:

相关技术文档

后端技术

性能分析