APM(Application Performance Monitoring)在 docker 使用 springboot的详细步骤
------------------------------------------------------------------------------------------------------------
一、APM 的核心目标
- 实时监控:跟踪应用的响应时间、吞吐量、错误率、资源占用(CPU、内存、磁盘、网络)等核心指标。
- 问题诊断:当系统出现卡顿、报错、超时等问题时,快速定位根因(如代码瓶颈、数据库慢查询、第三方接口故障)。
- 性能优化:通过分析监控数据,找到系统性能短板,指导架构或代码优化。
- 容量规划:基于历史性能数据,预测系统未来的资源需求,提前扩容或调整配置。
二、APM 的核心监控维度
| 维度 | 监控内容 |
|---|---|
| 应用层 | 接口响应时间、调用链路、异常堆栈、业务埋点数据 |
| 基础设施层 | 服务器 CPU / 内存 / 磁盘使用率、容器(Docker/K8s)状态、网络延迟 |
| 数据层 | 数据库慢查询、缓存命中率、消息队列堆积情况 |
| 用户体验层 | 页面加载时间、前端报错率、接口成功率 |
三、主流 APM 工具
- 开源工具
- SkyWalking:国产开源分布式追踪系统,支持多语言、多框架,适合微服务架构。
- Pinpoint:韩国开源项目,轻量级,支持字节码增强,无侵入式监控。
- Zipkin:Twitter 开源的分布式追踪工具,与 Spring Cloud 生态无缝集成。
- 商业工具
- New Relic:全球知名的全栈 APM 平台,支持云原生和混合架构。
- Dynatrace:基于 AI 的智能监控平台,可自动发现应用拓扑和定位问题。
- 阿里云 ARMS / 腾讯云 APM:国内云厂商提供的一站式性能监控服务。
四、APM 在微服务架构中的作用
- 每个服务的处理耗时
- 服务间的依赖关系
- 哪个环节出现了超时或错误
其他领域的 APM 含义
- Advanced Power Management:高级电源管理,用于硬件(如 CPU、电池)的功耗控制。
- Asset Performance Management:资产性能管理,用于工业领域的设备运维监控。
一、整体架构说明
- OAP Server:核心服务端,负责接收、分析、存储监控数据。
- UI:可视化控制台,展示监控指标、调用链路、拓扑图等。
- Agent:客户端探针,嵌入 Spring Boot 应用,无侵入式采集性能数据并上报给 OAP Server。
二、前置条件
- 已安装 JDK 8+(SkyWalking 8.x 及以上版本推荐 JDK 8/11)。
- 已安装 Maven/Gradle(用于构建 Spring Boot 项目)。
- 服务器 / 本地有足够的端口(默认:OAP Server 11800/12800,UI 8080)。
三、步骤 1:下载并启动 SkyWalking 服务端
1. 下载 SkyWalking
~/skywalking)。2. 启动 OAP Server 和 UI
- Windows 系统:
bash运行
# 进入解压后的 bin 目录 cd ~/skywalking/bin # 启动 OAP Server startup.bat # 启动 UI(若 startup.bat 未自动启动,执行) webappService.bat - Linux/Mac 系统:
bash运行
# 进入解压后的 bin 目录 cd ~/skywalking/bin # 启动 OAP Server 和 UI(一键启动) ./startup.sh
3. 验证服务端启动成功
- 访问 UI 控制台:
http://localhost:8080(默认账号 / 密码:admin/admin),能看到 SkyWalking 首页即表示启动成功。 - OAP Server 默认监听 11800(gRPC 端口,Agent 上报数据用)、12800(HTTP 端口),可通过
netstat -tlnp | grep 11800验证端口占用。
四、步骤 2:Spring Boot 项目集成 SkyWalking Agent
1. 准备 Spring Boot 项目
pom.xml 核心依赖:<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 可选:健康检查依赖,方便监控应用状态 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
2. 配置 SkyWalking Agent
方式 1:本地运行(IDEA/Eclipse)
Run/Debug Configurations → VM options):# 指定 Agent 路径(替换为你的 SkyWalking 解压目录)
-javaagent:D:/skywalking/agent/skywalking-agent.jar
# 指定应用名称(在 SkyWalking UI 中显示的名称)
-Dskywalking.agent.service_name=my-springboot-app
# 指定 OAP Server 地址(默认本地 11800,若服务端在远程,替换为服务器IP)
-Dskywalking.collector.backend_service=127.0.0.1:11800
方式 2:打包后运行(生产环境)
mvn clean package),然后通过命令启动:java -javaagent:/usr/local/skywalking/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=my-springboot-app \
-Dskywalking.collector.backend_service=192.168.1.100:11800 \
-jar my-springboot-app-1.0.0.jar
3. 关键 Agent 配置说明(可选)
skywalking/agent/config/agent.config 文件:agent.service_name:应用名称(必填,区分不同服务)。collector.backend_service:OAP Server 地址(默认 127.0.0.1:11800)。agent.sample_n_per_3_secs:采样率(默认 -1,即全量采集;生产环境可设为 10,每 3 秒采样 10 个请求)。
五、步骤 3:验证监控效果
1. 触发应用请求
http://localhost:8081/hello),多次调用以产生监控数据。2. 查看 SkyWalking UI 数据
http://localhost:8080,可看到核心监控维度:- 仪表盘:应用的响应时间、QPS、错误率、JVM 内存 / CPU 使用率。
- 拓扑图:应用与其他服务(如数据库、第三方接口)的调用关系。
- 追踪:单个请求的完整调用链路,可查看每个方法的耗时、是否有异常。
- 日志:若集成日志采集,可查看链路关联的日志(需额外配置)。
六、进阶配置(可选,生产环境必备)
1. 持久化监控数据(默认内存存储,重启丢失)
- 安装 Elasticsearch(推荐 7.x 版本)。
- 修改
skywalking/config/application.yml:yamlstorage: selector: ${SW_STORAGE:elasticsearch} elasticsearch: clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:127.0.0.1:9200} indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} - 重启 OAP Server。
2. 监控数据库调用(如 MySQL)
# VM 参数中添加,指定数据库驱动增强
-Dskywalking.plugin.jdbc.trace_sql_parameters=true # 开启 SQL 参数追踪(生产环境谨慎开启)
总结
- 核心流程:启动 SkyWalking 服务端(OAP+UI)→ Spring Boot 启动时挂载 Agent → 上报数据到服务端 → 可视化查看监控。
- 关键配置:Agent 的
service_name(应用标识)和backend_service(OAP 地址)是必配项,生产环境需替换内存存储为 Elasticsearch。 - 无侵入性:全程无需修改 Spring Boot 业务代码,仅通过 JVM 参数集成,对应用无性能侵入(Agent 性能损耗 < 1%)。
------------------------------------------------------------------------------------------------------------
一、整体架构说明
- Elasticsearch:存储 APM 采集的性能数据
- Kibana:可视化展示 APM 数据
- APM Server:接收 Agent 上报的数据并转发给 Elasticsearch
- SpringBoot 应用:集成 APM Java Agent 运行在 Docker 中
二、详细实施步骤
步骤 1:准备环境
- Docker
- Docker Compose
- 基础的 Java 环境(用于本地打包 SpringBoot 应用)
步骤 2:编写 Docker Compose 文件(部署 APM 基础设施)
docker-compose.yml文件,一键部署 ES、Kibana、APM Server:version: '3.8'
services:
# Elasticsearch 服务
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.14.0
container_name: elasticsearch
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
- xpack.security.enabled=false # 关闭安全认证(测试环境)
- xpack.monitoring.enabled=true
ports:
- "9200:9200"
- "9300:9300"
volumes:
- es-data:/usr/share/elasticsearch/data
networks:
- apm-network
# Kibana 服务
kibana:
image: docker.elastic.co/kibana/kibana:8.14.0
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- apm-network
# APM Server 服务
apm-server:
image: docker.elastic.co/apm/apm-server:8.14.0
container_name: apm-server
ports:
- "8200:8200"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
- KIBANA_HOST=http://kibana:5601
- apm-server.host=0.0.0.0
- apm-server.kibana.enabled=true
depends_on:
- elasticsearch
- kibana
networks:
- apm-network
volumes:
es-data:
networks:
apm-network:
driver: bridge
步骤 3:启动 APM 基础设施
# 启动服务(后台运行)
docker-compose up -d
# 查看服务状态
docker-compose ps
- Elasticsearch:访问
http://localhost:9200,能看到 ES 版本信息即正常 - Kibana:访问
http://localhost:5601,能进入 Kibana 界面即正常 - APM Server:访问
http://localhost:8200/healthcheck,返回{"ok":true}即正常
步骤 4:改造 SpringBoot 应用(集成 APM Agent)
方式 1:构建镜像时集成(推荐)
- 准备 SpringBoot 应用的
Dockerfile:
# 基础镜像
FROM openjdk:17-jdk-slim
# 设置工作目录
WORKDIR /app
# 复制APM Agent(先下载:https://search.maven.org/artifact/co.elastic.apm/elastic-apm-agent)
COPY elastic-apm-agent-1.48.0.jar /app/agent/
# 复制打包后的SpringBoot jar包
COPY your-app.jar /app/app.jar
# 设置JVM参数,集成APM Agent
ENV JAVA_OPTS="-javaagent:/app/agent/elastic-apm-agent-1.48.0.jar \
-Delastic.apm.service_name=my-springboot-app \
-Delastic.apm.application_packages=com.yourpackage \
-Delastic.apm.server_url=http://apm-server:8200 \
-Delastic.apm.environment=dev \
-Delastic.apm.log_level=INFO"
# 暴露应用端口
EXPOSE 8080
# 启动应用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]
elastic.apm.service_name:你的应用名称(在 APM 中标识应用)elastic.apm.application_packages:你的应用主包名(用于精准采集业务代码)elastic.apm.server_url:APM Server 地址(Docker 网络内直接用容器名)elastic.apm.environment:环境标识(dev/test/prod)
- 构建并启动 SpringBoot 应用镜像:
# 构建镜像
docker build -t my-springboot-app:1.0 .
# 启动应用(加入apm-network网络,确保能访问apm-server)
docker run -d \
--name my-springboot-app \
--network apm-network \
-p 8080:8080 \
my-springboot-app:1.0
方式 2:启动容器时动态指定(快速测试)
# 下载APM Agent到本地
wget https://repo1.maven.org/maven2/co/elastic/apm/elastic-apm-agent/1.48.0/elastic-apm-agent-1.48.0.jar
# 启动SpringBoot容器(挂载Agent并指定参数)
docker run -d \
--name my-springboot-app \
--network apm-network \
-p 8080:8080 \
-v $(pwd)/elastic-apm-agent-1.48.0.jar:/agent/elastic-apm-agent-1.48.0.jar \
-e JAVA_OPTS="-javaagent:/agent/elastic-apm-agent-1.48.0.jar \
-Delastic.apm.service_name=my-springboot-app \
-Delastic.apm.application_packages=com.yourpackage \
-Delastic.apm.server_url=http://apm-server:8200" \
openjdk:17-jdk-slim java $JAVA_OPTS -jar /app/app.jar
步骤 5:验证 APM 监控效果
- 访问 Kibana:
http://localhost:5601 - 在左侧导航栏找到 APM(或在搜索框输入 APM)
- 进入 APM 界面后,能看到你配置的
my-springboot-app应用 - 访问 SpringBoot 应用的接口(如
http://localhost:8080/api/test),等待 10 秒左右,就能在 APM 中看到:- 接口响应时间、吞吐量、错误率
- JVM 内存、CPU 使用情况
- 数据库调用、外部 API 调用的性能详情
- 慢查询、异常堆栈信息
步骤 6:进阶配置(可选)
- 自定义采集范围:在
application.yml中添加 APM 配置
elastic:
apm:
capture_headers: true # 采集请求头
capture_body: errors # 仅在出错时采集请求体
stack_trace_limit: 50 # 堆栈跟踪深度
transaction_sample_rate: 1.0 # 100%采样(生产环境可设0.1)
- 生产环境优化:
- 开启 ES 的安全认证(修改 docker-compose.yml 中的 ES 配置)
- 调整 APM Agent 的采样率,避免性能开销
- 配置 APM 数据的过期策略(在 ES 中设置索引生命周期)
三、常见问题排查
-
应用无法连接 APM Server:
- 检查 Docker 网络是否互通:
docker exec -it my-springboot-app ping apm-server - 检查 APM Server 地址是否正确(容器内用容器名,外部用宿主机 IP)
- 检查 Docker 网络是否互通:
-
Kibana 中看不到应用数据:
- 查看应用日志:
docker logs my-springboot-app - 查看 APM Server 日志:
docker logs apm-server
- 查看应用日志:
-
性能开销过大:
- 降低采样率(
transaction_sample_rate设为 0.1-0.5) - 关闭不必要的采集项(如请求体、请求头)
- 降低采样率(
总结
- 核心流程:部署 ES/Kibana/APM Server → SpringBoot 集成 APM Agent → 启动应用 → 可视化监控,核心是通过 Java Agent 无侵入式采集应用性能数据。
- 关键配置:
service_name(应用标识)、server_url(APM Server 地址)、application_packages(业务包名)是必须配置的核心参数。 - 环境适配:Docker 环境下需确保 SpringBoot 容器与 APM Server 在同一网络,才能通过容器名通信,生产环境需注意安全配置和性能优化。
一、整体架构(SkyWalking)
- SkyWalking OAP Server:核心服务,接收、分析、存储监控数据
- SkyWalking UI:可视化控制台,展示监控数据
- SpringBoot 应用:集成 SkyWalking Agent,上报性能数据
二、详细实施步骤
步骤 1:环境准备
- Docker(版本 20.10+)
- Docker Compose(版本 2.0+)
- Maven/Gradle(用于打包 SpringBoot 应用,可选)
步骤 2:编写 Docker Compose 部署 SkyWalking 服务端
docker-compose-skywalking.yml文件,一键部署 OAP Server 和 UI:version: '3.8'
services:
# SkyWalking OAP Server(核心服务)
skywalking-oap:
image: apache/skywalking-oap-server:9.7.0
container_name: skywalking-oap
ports:
- "11800:11800" # Agent上报数据的gRPC端口
- "12800:12800" # UI访问OAP的REST端口
environment:
- SW_STORAGE=h2 # 测试环境用H2内存数据库,生产可用Elasticsearch
- SW_HEALTH_CHECKER=default
- SW_TELEMETRY=prometheus
- JAVA_OPTS=-Xms512m -Xmx512m
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:12800/health"]
interval: 30s
timeout: 10s
retries: 3
networks:
- skywalking-network
# SkyWalking UI(可视化控制台)
skywalking-ui:
image: apache/skywalking-ui:9.7.0
container_name: skywalking-ui
ports:
- "8080:8080" # UI访问端口
environment:
- SW_OAP_ADDRESS=http://skywalking-oap:12800 # 连接OAP的地址
depends_on:
skywalking-oap:
condition: service_healthy # 等待OAP健康后启动
networks:
- skywalking-network
networks:
skywalking-network:
driver: bridge
步骤 3:启动 SkyWalking 服务端
# 启动服务(后台运行)
docker-compose -f docker-compose-skywalking.yml up -d
# 查看服务状态(确保两个容器都是Up状态)
docker-compose -f docker-compose-skywalking.yml ps
- SkyWalking UI:访问
http://localhost:8080,能看到 SkyWalking 控制台(默认无数据)即正常 - OAP 健康检查:访问
http://localhost:12800/health,返回{"status":"READY"}即正常
步骤 4:SpringBoot 应用集成 SkyWalking Agent(Docker 化)
方式 1:构建自定义镜像(推荐,生产用)
4.1 准备 SpringBoot 应用的 Dockerfile
# 基础镜像(根据你的SpringBoot版本选择JDK版本)
FROM openjdk:17-jdk-slim
# 设置工作目录
WORKDIR /app
# 1. 下载SkyWalking Agent(也可本地下载后COPY,避免每次构建都下载)
RUN mkdir -p /app/agent \
&& cd /app/agent \
&& curl -O https://archive.apache.org/dist/skywalking/9.7.0/apache-skywalking-java-agent-9.7.0.tgz \
&& tar -zxvf apache-skywalking-java-agent-9.7.0.tgz \
&& rm -f apache-skywalking-java-agent-9.7.0.tgz
# 2. 复制打包好的SpringBoot jar包(替换为你的jar包名称)
COPY your-springboot-app.jar /app/app.jar
# 3. 设置SkyWalking Agent参数(核心配置)
ENV JAVA_OPTS="-javaagent:/app/agent/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=my-springboot-app \ # 应用名称(必填)
-Dskywalking.collector.backend_service=skywalking-oap:11800" # OAP地址(Docker网络内用容器名)
# 暴露应用端口(替换为你的应用端口)
EXPOSE 8081
# 启动应用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]
4.2 构建并启动 SpringBoot 应用镜像
# 构建镜像(替换为你的镜像名称)
docker build -t my-springboot-app:1.0 .
# 启动容器(加入SkyWalking网络,确保能访问OAP)
docker run -d \
--name my-springboot-app \
--network skywalking-network \
-p 8081:8081 \ # 宿主机端口:容器端口
my-springboot-app:1.0
方式 2:快速测试(无需构建镜像,挂载 Agent)
# 1. 本地下载并解压Agent
mkdir -p skywalking-agent && cd skywalking-agent
curl -O https://archive.apache.org/dist/skywalking/9.7.0/apache-skywalking-java-agent-9.7.0.tgz
tar -zxvf apache-skywalking-java-agent-9.7.0.tgz
cd ..
# 2. 启动SpringBoot容器(挂载Agent+指定参数)
docker run -d \
--name my-springboot-app \
--network skywalking-network \
-p 8081:8081 \
-v $(pwd)/skywalking-agent:/app/agent \ # 挂载本地Agent到容器
-e JAVA_OPTS="-javaagent:/app/agent/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=my-springboot-app \
-Dskywalking.collector.backend_service=skywalking-oap:11800" \
openjdk:17-jdk-slim java $JAVA_OPTS -jar /app/app.jar # 替换为你的jar包路径
步骤 5:验证 APM 监控效果
- 访问 SkyWalking UI:
http://localhost:8080(默认用户名 / 密码:admin/admin) - 左侧导航栏选择「仪表盘」→ 选择你的应用
my-springboot-app - 访问 SpringBoot 应用的接口(如
http://localhost:8081/api/test),等待 10 秒左右,就能看到:- 接口响应时间、QPS、错误率
- JVM 内存 / CPU/GC 监控
- 数据库 / Redis 等中间件调用链路
- 慢查询、异常堆栈信息
- 服务拓扑图(如果有多个服务调用)
步骤 6:进阶配置(可选,生产环境)
6.1 自定义 Agent 配置
agent/config/agent.config文件,挂载到容器中覆盖默认配置:# 应用名称
agent.service_name=my-springboot-app-prod
# OAP地址(生产环境可配置多个,用逗号分隔)
collector.backend_service=192.168.1.100:11800,192.168.1.101:11800
# 采样率(生产环境建议0.1,即10%)
agent.sample_n_per_3_secs=-1 # -1表示全采样,生产改10
# 日志级别
logging.level=INFO
# 开启JVM监控
plugin.jvm.active=true
# 开启数据库监控(支持MySQL/PostgreSQL等)
plugin.jdbc.active=true
docker run -d \
--name my-springboot-app \
--network skywalking-network \
-p 8081:8081 \
-v $(pwd)/agent/config/agent.config:/app/agent/skywalking-agent/config/agent.config \
-v $(pwd)/skywalking-agent:/app/agent \
-e JAVA_OPTS="-javaagent:/app/agent/skywalking-agent/skywalking-agent.jar" \
my-springboot-app:1.0
6.2 切换存储为 Elasticsearch(生产环境)
docker-compose-skywalking.yml中 OAP 的配置:skywalking-oap:
image: apache/skywalking-oap-server:9.7.0
container_name: skywalking-oap
ports:
- "11800:11800"
- "12800:12800"
environment:
- SW_STORAGE=elasticsearch
- SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 # 指向你的ES地址
- JAVA_OPTS=-Xms1g -Xmx1g
depends_on:
- elasticsearch # 需要先部署ES
总结
- 核心步骤:部署 SkyWalking OAP+UI → SpringBoot 集成 SkyWalking Agent(通过 Java Agent 无侵入式采集)→ 启动应用 → 可视化监控,全程基于 Docker,无需修改业务代码。
- 关键配置:
agent.service_name(应用唯一标识)和collector.backend_service(OAP 地址)是必须配置的核心参数,Docker 环境下需确保应用容器与 OAP 在同一网络。 - 环境适配:测试环境用 H2 存储足够,生产环境建议切换到 Elasticsearch,并调整采样率以降低性能开销。
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------

浙公网安备 33010602011771号