当前位置: 首页 > news >正文

SpringBoot 接口性能如何快速定位?轻量级应用监控工具开源啦,一键接入,轻松定位!

一、前言

Java 应用开发的同学都知道,项目上线后,日志可视化查询、接口性能监控、慢请求分析、调用链监控、JVM 可视化监控是一件非常重要的事。
市面上对于上对于日志的可视化查询、接口的性能监控、调用链监控、JVM 的可视化监控都有常用的方案。

  • 日志可视化查询:ELK/EFK。
  • JVM 可视化监控与接口性能:Actuator + Prometheus + Grafana。
  • 调用链监控:PingPoint、Skywalking、Zipkin 等。

不过对于很多开发者来说,这中间存在大量繁琐的配置过程,且具备一定的使用学习门槛,部署成本与运维成本也比较高。

而对于大多数中小型企业或者个人开发者来说,并不想要这么大的投入,但又想要对应用做全方位的监控管理该怎么办?

小编今天要介绍的就是这样一款可免费使用的 Java 应用全方位监控平台。一站式、轻量级、低门槛、零侵入,开箱即用。

旨在于以极简、高效的方式,在一个平台上实现 Java 应用的日志采集与可视化查询、接口性能监控、慢请求分析、调用链监控、JVM 可视化监控。

二、软件介绍

zero-observer + zero-log = Java 应用一站式监控

官网地址:https://kuafucv.com

1. 系统架构

主要分为客户端和服务端两个部分。

2. 采集客户端【zero-log】

旨在提供低门槛、少配置、轻量级、无侵入的方式实现应用日志、接口性能、调用链、JVM 指标的自动采集与上报。

  • 基于 logback 实现自动采集代码中通过 log.error、log.warn、log.info、log.trace 方式输出的日志。
  • 采集各个接口的性能数据。
  • 采集方法调用链数据。
  • 采集 JVM 运行时各项指标。

3. 服务端【zero-observer】

收集客户端采集插件采集的客户端数据,并提供开箱即用的可视化与管理功能。

4. 功能介绍

功能实现情况
登录认证
仪表盘统计
应用日志采集
应用控制台日志
应用日志列表检索
接口性能监控
接口慢请求分析
CPU 监控
物理内存监控
堆内存监控
非堆内存监控
Eden区监控
Survivor区监控
OldGen区监控
Metaspace区监控
线程监控
GC监控
调用链监控

仪表盘

应用日志

控制台日志

应用日志查询

应用日志详情

接口性能监控

慢请求分析

调用链监控

JVM 监控



三、服务端部署

zero-observer 数据存储使用的是 mysql 与 elasticsearch,mysql 存储的是系统数据,elasticsearch 存储的是日志数据。
所以需要自行安装 mysql 与 elasticsearch。

1. Mysql 初始化脚本

创建数据库:zero_observer,执行脚本。

CREATE TABLE `app_log_growth_trend` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `app` varchar(255) NOT NULL, `env` varchar(50) NOT NULL, `level` varchar(10) NOT NULL, `statistic_time` datetime NOT NULL, `log_count` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `app_log_total_growth_trend` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `statistic_time` datetime NOT NULL, `log_count` bigint(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `app_log_level_statistic` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `app` varchar(255) NOT NULL, `env` varchar(50) NOT NULL, `level` varchar(10) NOT NULL, `statistic_time` datetime NOT NULL, `log_count` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `app_env_instance` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `app` varchar(255) NOT NULL, `env` varchar(50) NOT NULL, `ip` varchar(50) NOT NULL, `port` varchar(5) NOT NULL, `hostname` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `app_log_statistic` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `app_log_statistic_counter_id` bigint(20) NOT NULL, `app` varchar(255) NOT NULL, `env` varchar(50) NOT NULL, `statistic_time` datetime NOT NULL, `log_count` bigint(20) NOT NULL DEFAULT '0', `slow_request_count` bigint(20) NOT NULL DEFAULT '0', `error_count` bigint(20) NOT NULL DEFAULT '0', `warn_count` bigint(20) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `app_log_statistic_counter` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `statistic_time` datetime NOT NULL, `statistic_status` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `system_config` ( `id` bigint(20) NOT NULL COMMENT '主键', `create_time` datetime NOT NULL COMMENT '创建时间', `key_code` varchar(50) NOT NULL COMMENT 'key编码', `key_name` varchar(50) DEFAULT NULL COMMENT 'key 名称', `key_value` varchar(255) NOT NULL COMMENT 'key值', `enabled` int(11) NOT NULL DEFAULT '1' COMMENT '是否启用', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `system_config` (`id`, `create_time`, `key_code`, `key_name`, `key_value`, `enabled`) VALUES (1, '2025-07-19 23:56:06', 'app_log_storage_days', '应用日志存储天数', '3', 1); CREATE TABLE `users` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `account` varchar(100) NOT NULL, `pwd` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `token_info` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `subject` varchar(100) NOT NULL, `token` varchar(255) NOT NULL, `expire_time` datetime NOT NULL, `expire_timestamp` bigint(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `license` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `content` text NOT NULL, `remark` text DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `request_monitor_statistic` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `statistic_date` int(11) NOT NULL, `app` varchar(255) NOT NULL, `env` varchar(50) NOT NULL, `uri` varchar(255) NOT NULL, `executeCount` int(11) DEFAULT NULL, `rtAvg` float DEFAULT NULL, `rtMax` int(11) DEFAULT NULL, `rtMin` int(11) DEFAULT NULL, `slow_count` int(11) DEFAULT 0, `slow_avg` float DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `request_mapping` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `app` varchar(255) NOT NULL, `env` varchar(50) NOT NULL, `ip` varchar(50) NOT NULL, `port` varchar(5) NOT NULL, `hostname` varchar(255) NOT NULL, `uri` varchar(255) DEFAULT NULL, `method` varchar(10) DEFAULT NULL, `handler_method` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ALTER TABLE app_env_instance ADD online INT NULL; ALTER TABLE app_env_instance ADD last_heartbeat DATETIME NULL; ALTER TABLE request_monitor_statistic ADD req_method varchar(10) NULL; CREATE TABLE `app_env` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `app` varchar(255) NOT NULL, `env` varchar(50) NOT NULL, `gene` varchar(20) NOT NULL, `signature` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `sys_lock` ( `id` bigint(20) NOT NULL, `create_time` datetime NOT NULL, `lock_name` varchar(100) NOT NULL, `status` INT NOT NULL, `last_heartbeat` datetime DEFAULT NULL, `holder` varchar(255) DEFAULT NULL, `holder_id` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. Docker 部署

拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/kuafucv/zero-observer:2.1.0

启动容器

docker run -itd -p 8080:8080 --name zero-observer \ -e TZ=Asia/Shanghai \ -e ES_IP=127.0.0.1 \ -e ES_PORT=9200 \ -e ES_USERNAME=es \ -e ES_PASSWORD=es \ -e MYSQL_IP=127.0.0.1 \ -e MYSQL_PORT=3306 \ -e MYSQL_USERNAME=root \ -e MYSQL_PASSWORD=123456 \ registry.cn-hangzhou.aliyuncs.com/kuafucv/zero-observer:2.1.0

参数解析:

  • TZ:时区,默认 Asia/Shanghai
  • ES_IP:elasticsearch 的 ip
  • ES_PORT:elasticsearch restapi 的端口
  • ES_USERNAME:elasticsearch 用户名,无则不填即可
  • ES_PASSWORD:elasticsearch 密码,无则不填即可
  • MYSQL_IP:mysql 的ip
  • MYSQL_PORT:mysql 端口
  • MYSQL_USERNAME 用户名
  • MYSQL_PASSWORD 密码

启动成功后,浏览器访问:http://127.0.0.1:8080/zero-observer/

默认用户密码:admin/123456

四、SpringBoot 应用接入

1. 引入 maven 依赖

<dependency><groupId>io.github.kuafucv</groupId><artifactId>zero-log-spring-boot-starter</artifactId><version>2.1.0</version></dependency>

2. 配置 application.yml

zero: log: server-url: http://127.0.0.1:8080/zero-observer

注意:

  • serverUrl 为 zero-observer 服务访问地址,该属性值为 http://ip:port/zero-observer

3. 启动类添加注解

启动类添加@EnableZeroLog注解

@SpringBootApplication@EnableZeroLogpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}

4. 启动服务

启动 Java 服务,等待日志自动上报至 zero-observer ,前往 zero-observer 查看对应数据。

更多内容请参考官网:https://kuafucv.com

🎁 福利时间如果你正在备战面试或者想要学习其他知识,给大家推荐一个宝藏知识库,作者整理了一些列 Java 程序员需要掌握的核心知识,有需要的自取不谢。

知识库地址:https://farerboy.com/

http://www.jsqmd.com/news/730095/

相关文章:

  • DIO32321 低功耗 USB2.0 高速开关技术文档
  • 从非结构化数据到结构化:Anything-Extract项目实战与架构解析
  • 传承与奉献:资深技术人如何做好“传帮带”?
  • 桌面美化与效率结合,这款免费桌面工具能管理倒计时、宠物和加密
  • 海棠山铁哥戳破《灵魂摆渡・浮生梦》伪 AI 骗局,《第一大道》纯 AI 写实告别躺平
  • DeepSeek V1 到 V4 完整技术路线:每一代到底解决了什么问题?
  • taotoken 多模型聚合能力如何赋能智能客服场景开发
  • 从播客剪辑到游戏音效:用GoldWave 6.78搞定你的所有音频需求(附基础操作指南)
  • 协同自动驾驶中的V2V-GoT框架:技术原理与工程实践
  • CS3106 双节电池均衡芯片技术文档(完整版)
  • AArch64 SIMDFP寄存器存储指令详解与优化实践
  • 基于可逆残差网络与互信息最大化的化工泵故障诊断【附代码】
  • 2026合肥生殖中心擅长多囊医生推荐:安医不孕不育推荐医生,安医专治不孕不育医生,安医多囊专家,实力盘点! - 优质品牌商家
  • 网络运维效率翻倍:手把手教你用Docker Compose一键部署PHPIPAM 1.6
  • Visual Studio调试时遇到ntdll.dll的PDB文件缺失?别慌,这3个方法帮你搞定(附详细步骤)
  • 告别手动点开始!用SUMO的gui_only配置实现配置文件一打开就自动仿真
  • 第 3 章:Gradle 进阶工程能力
  • 为什么92%的PHP团队在LLM长连接上踩坑?Swoole协程池、FD复用、上下文隔离三大致命盲区全解析,
  • 零基础快速启用 OpenClaw,保姆级零代码部署教程
  • 为编程助手 Claude Code 配置 Taotoken 作为后端模型服务提供方
  • VoXtream2流式TTS架构与动态语速控制技术解析
  • ARM SVE2指令集SQSHL:饱和移位原理与应用
  • 【农业AI预测实战指南】:R语言构建高精度作物病害预警模型的7步黄金流程
  • 量子虚拟机资源分配:DynQ解决方案与质量加权社区检测
  • 2026四川水上游乐设备厂家技术评测:TOP5合规能力解析 - 优质品牌商家
  • AcuRange工业现场高精度FMCW毫米波雷达感知平台-毫米级到亚毫米级距离测量解决方案(工业精准定位、精准测距与精细检测)
  • 在Node.js后端服务中集成Taotoken实现稳定AI功能
  • 别再只会apt了!在统信UOS/麒麟KOS上,用dpkg命令搞定微信、WPS等.deb包的安装与管理
  • Linux 文件系统底层探秘:磁盘物理结构→inode→Ext 架构全链路
  • ARM SVE2浮点运算指令优化与AI加速实践