神级开源,一站式、轻量级、低门槛、零侵入的 Java 应用全方位监控平台,开箱即用!!!
本文介绍了一款名为zero-observer的Java应用一站式监控平台,提供日志采集、接口性能监控、调用链追踪和JVM监控等功能。该平台由客户端zero-log和服务端zero-observer组成,具有低门槛、轻量级、零侵入的特点,支持开箱即用。主要功能包括日志可视化查询、接口性能分析、慢请求追踪以及JVM各项指标监控,并通过仪表盘展示统计数据。部署需要MySQL和Elasticsearch支

一、前言
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
@EnableZeroLog
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4. 启动服务
启动 Java 服务,等待日志自动上报至 zero-observer ,前往 zero-observer 查看对应数据。
更多内容请参考官网:https://kuafucv.com
更多推荐
所有评论(0)