APM框架系列:
相关概念:
- 数据模型:参考SkyWalking Cross Process Propagation Headers Protocol、Trace Data Protocol v2:
TraceId
:标记一个调用链,全局唯一,对应Google Dapper的TraceId
;Span
:标记一次方法调用。对每个监控方法调用生成一个Span
,用父子关系记录方法调用层次关系:EntrySpan
:服务提供者(如Dubbo provider、MQ consumer等)的入口方法(endpoint)生成EntrySpan
;ExitSpan
:服务消费者(如Dubbo consumer、MQ producer等)对服务的调用生成ExitSpan
;LocalSpan
:除了EntrySpan
、ExitSpan
情况,对其它方法的调用,生成LocalSpan
;
Segment
:标记一次RPC调用。Span中包含了LocalSpan
,与Google Dapper的Span有差异,而Segment
在概念上对应Google Dapper Span;
- 统计视图:
Service
层面:在应用或服务层面提供性能汇总统计分析,通过agent的service_name
参数来标记;Endpoint
层面:在方法层面提供性能汇总统计分析;Instance
层面:对应用或服务的单个实例层面提供性能汇总统计分析,通过进程ID(或IP+端口号)来标记;Database
层面:针对数据库的性能汇总统计(基于JDBC数据库操作采集的数据,比数据库层面的统计粒度更细);
Apache SkyWalking版本6.5.0,Windows环境单机部署,使用my-demo作为演示项目。
存储:
- 演示环境简单起见存储到MySQL,生产环境可以用ElasticSearch、TiDB,存储方案上比PinPoint多;
- 用到了300多个表,主要信息存储在
service_inventory
、service_instance_inventory
、endpoint_inventory
、segment
等表中;
- 下载SkyWalking 6.5.0 Windows包,解压;
- 下载MySQL Connector/J放入
oap-libs
,本文使用8.0.18
版本; - 配置:
config/application.yml
:Backend启动时检查并自动创建MySQL表,无需手工创建;storage
注释掉h2
改用mysql
,设置JDBC连接、用户密码,添加dataSource.useSSL: false
;receiver-trace
、service-mesh
下面的bufferPath
指定一个绝对路径;
使用默认配置时Mac和Windows环境都发现实际路径有点乱,Mac下两个路径都在skywalking父目录,Windows下一个在父目录一个在skywalking目录;
webapp/webapp.yml
:Web UI配置,全部采用默认值;
- 启动:
oapService.bat
启动Backend,webappService.bat
启动Web UI,startup.bat
启动所有;SkyWalking使用
start
批处理命令新开cmd窗口启动Backend和Web UI,使用cmd的默认代码页(Win10下为936),导致Console异常和日志信息的中文显示为乱码,本文通过注册表修改cmd默认代码页,可能需要重启才能生效,临时解决办法修改oapService.bat
:@REM start "%OAP_PROCESS_TITLE%" %_EXECJAVA% "%OAP_OPTS%" -cp "%CLASSPATH%" org.apache.skywalking.oap.server.starter.OAPServerStartUp %_EXECJAVA% "%OAP_OPTS%" -cp "%CLASSPATH%" org.apache.skywalking.oap.server.starter.OAPServerStartUp
Mac环境下载apache-skywalking-apm-6.5.0.tar.gz即可,部署上没有其它特别之处。
PinPoint
:采用javaagent
方式,对应用完全无侵入,项目无需添加任何额外依赖项,无需修改代码,这点做得最好;SkyWalking
:采用javaagent
方式,普通功能对应用无侵入,以下两项功能需要应用稍作修改:- 中添加自定义Tag项:应用代码在
SkyWalking Span
中添加自定义Tag,可以按需输出方法参数值等关键信息,辅助应用排错和性能分析,PinPoint
和ZipKin
都不支持(可自行实现); - 日志中输出全局跟踪ID,需要添加
SkyWalking
依赖项;
- 中添加自定义Tag项:应用代码在
ZipKin
:没有采用javaagent
方式,应用强依赖ZipKin
,必须打包到应用中与应用一起运行,每个项目需要添加依赖项、配置,不同探针有不同的bean配置需求;
支持情况参考Supported middleware, framework and library,对支持框架的关键方法进行跟踪,例如Dubbo服务的consumer调用入口和provider服务方法入口,JDBC的PrepareStatement
数据库操作等。
配置agent\config\agent.config
:
agent.service_name=${SW_AGENT_NAME:unknown}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.31.108:11800}
# 其它保留默认配置
启动应用时通过-javaagent
指定SkyWalking代理,-Dskywalking.agent.service_name
指定应用名称:
在my-demo运行SkyWalking演示:
- 使用
skywalking
参数编译打包:sh $PROJECT_HOME/package.sh -skywalking
- 按下面脚本顺序启动服务和应用:
java -javaagent:F:\workspace\skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=item-service -jar item-service\target\item-service-0.0.1-SNAPSHOT.jar java -javaagent:F:\workspace\skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=stock-service -jar stock-service\target\stock-service-0.0.1-SNAPSHOT.jar java -javaagent:F:\workspace\skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=user-service -jar user-service\target\user-service-0.0.1-SNAPSHOT.jar java -javaagent:F:\workspace\skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=order-service -jar order-service\target\order-service-0.0.1-SNAPSHOT.jar java -javaagent:F:\workspace\skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=shop-web -jar shop-web\target\shop-web-0.0.1-SNAPSHOT.jar
- 访问http://localhost:8090/shop执行一些操作,即可在PinPoint界面查看结果;
业务代码中未被跟踪的方法,如果需要跟踪,则:
- pom添加依赖项:
<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>6.5.0</version> </dependency>
- 在方法上添加
@Trace
注解;SkyWalking通过AOP实现跟踪,静态方法添加
@Trace
无效,只能用于实例方法;
链路跟踪只记录方法名,不记录参数值,可通过代码添加,在当前span上添加tag(必须是被SkyWalking跟踪的方法):
ActiveSpan.tag("account", account);
ActiveSpan.tag("userId", String.valueOf(userId));
记录SQL语句参数值,可以在agent\config\agent.config
文件中将plugin.mysql.trace_sql_parameters
设为true。
- pom添加依赖项:
<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-logback-1.x</artifactId> <version>6.5.0</version> </dependency>
- logback日志layout使用
org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout
,通过%tid
输出trace-id
(%tid
必须小写):<appender name="APP" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <charset>UTF-8</charset> <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"> <pattern>${CONSOLE_LOG_PATTERN:-%clr([%d{${LOG_DATEFORMAT_PATTERN:-yyMMdd HH:mm:ss.SSS}}]){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(%tid){yellow}%clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</pattern> </layout> </encoder> </appender>
SkyWalking和PinPoint界面功能相差不大:
- PinPoint界面稍微细腻些,Agent Inspector、Application Inspector界面信息集中度更高,适合大屏监控;
- SkyWalking提供数据库访问统计界面,基于服务/应用、实例层级的汇总统计,比基于数据库的整体统计粒度更新更精准,PinPoint没有;
[Service Dashboard] -> [Service]:针对服务的性能汇总统计:平均响应时间、吞吐率、服务实例清单及吞吐率
[Service Dashboard] -> [Endpoint]:针对服务方法的性能汇总统计:平均响应时间、吞吐率、依赖关系图、慢方法排行(平均响应时间)、慢方法排行(单次调用)
[Service Dashboard] -> [Instance]:针对服务实例的性能汇总统计,服务实例所在JVM、CLR的性能监控情况:平均响应时间、吞吐率、JVM堆内存、JVM非堆内存、JVM GC、CPU
[Database Dashboard] -> [Database]:针对数据库的性能汇总统计(基于JDBC数据库操作采集的数据,比数据库层面的统计粒度更细):响应时间、吞吐率、慢查询排行
全链路跟踪、性能分析: