一、关于
SkyWalking: 一个开源的可观测平台, 用于从服务和云原生基础设施收集, 分析, 聚合及可视化数据。SkyWalking 提供了一种简便的方式来清晰地观测分布式系统, 甚至横跨多个云平台。SkyWalking 更是一个现代化的应用程序性能监控(Application Performance Monitoring)系统, 尤其专为云原生、基于容器的分布式系统设计。
SkyWalking 逻辑上分为四部分: 探针, 平台后端, 存储和用户界面:
- 探针 基于不同的来源可能是不一样的, 但作用都是收集数据, 将数据格式化为 SkyWalking 适用的格式
- 平台后端, 支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等。 你甚至可以使用 Observability Analysis Language 对原生度量指标 和 用于扩展度量的计量系统 自定义聚合分析
- 存储 通过开放的插件化的接口存放 SkyWalking 数据. 你可以选择一个既有的存储系统, 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统. 当然, 我们非常欢迎你贡献新的存储系统实现
- UI 一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 SkyWalking 数据
本文代码仓库地址:https://github.com/lazyrabb1t/rabb-springcloud-demo
二、启动
2.1 下载
下载地址:https://skywalking.apache.org/downloads/
需要下载SkyWalking APM以及Java Agent的包,这两个包我使用的分别是v8.9.1和v8.9.0版本。
2.2 启动
双击执行APM包bin目录下startup.bat。
2.3 访问APM页面
浏览器访问:http://localhost:8080/
端口可以通过webapp/webapp.yml以及config/application.yml进行修改。
三、SpringCloud微服务接入SkyWalking
3.1 配置
在idea启动配置中添加VM参数,订单模块:
-javaagent:D:\develop\skywalking\skywalking-agent\skywalking-agent.jar -Dskywalking.agent.service_name=rabb-seata-order-service -Dskywalking.collector.backend_service=127.0.0.1:11800
库存模块
-javaagent:D:\develop\skywalking\skywalking-agent\skywalking-agent.jar -Dskywalking.agent.service_name=rabb-seata-storage-service -Dskywalking.collector.backend_service=127.0.0.1:11800
启动两个服务,然后调用其接口,就可以在SkyWalking管理页面上看到对应的调用信息。
通过命令行jar包方式启动时,参数需要在-jar前。
3.2 自定义链路
3.2.1 侵入式注解方式
添加依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>${skywalking.version}</version>
</dependency>
然后在要监控的方法上添加@Trace注解,同时也可以使用@Tags注解来额外获取想要收集的数据,以下是一个样例:
/**
* The codes below will generate a span,
* and two types of tags,
one type tag: keys are `tag1` and `tag2`, values are the passed-in parameters, respectively,
the other type tag: keys are `username` and `age`, values are the return value in User, respectively
*/
@Trace
@Tag(key = "tag1", value = "arg[0]")
@Tag(key = "tag2", value = "arg[1]")
@Tag(key = "username", value = "returnedObj.username")
@Tag(key = "age", value = "returnedObj.age")
public User methodYouWantToTrace(String param1, String param2) {
// ActiveSpan.setOperationName("Customize your own operation name, if this is an entry span, this would be an endpoint name");
// ...
}
3.2.2 非侵入式
将\optional-plugins\apm-customize-enhance-plugin.jar复制到plugins目录下,然后定义一个XML配置文件,配置要追踪的方法,最后将这个配置文件路径配置到\config\agent.config文件中即可,参考:https://blog.csdn.net/zxh1991811/article/details/115379470
3.3 日志配置
我使用的是logback,可参考:https://skywalking.apache.org/docs/skywalking-java/v8.9.0/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/
3.3.1 添加依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
</dependency>
3.3.2 配置logback
添加logback-spring.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>
<![CDATA[%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} [%X{tid}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}]]>
</Pattern>
</layout>
</encoder>
</appender>
<appender name="SKYWALKING-GRPC-LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender" >
<!-- 对日志进行格式化 -->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>%msg%n</pattern>
</layout>
</encoder>
</appender>
<root level="info">
<appender-ref ref="SKYWALKING-GRPC-LOG"/>
<appender-ref ref="STDOUT"/>
</root>
</configuration>
3.3.3 测试
启动服务,可以在控制台日志中看到多了TID的输出,同时在SkyWallking中日志界面可以看到日志信息。
3.3.4 agent配置
agent和oap在不同服务器上时,需配置agent/config/agent.config配置文件,在文件末尾添加如下配置信息:
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:10.10.10.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
四、Skywalking
4.1 持久化配置
skywalking 默认持久化的方式是存储在内存中,只要服务端重启之后,这些链路追踪数据将会全部丢失了,如果想要数据持久化保存那么需要修改持久化方式。
skywalking 支持Mysql以及ES持久化的方式,可以通过修改config/application.yml 文件进行配置,生产环境中推荐将数据持久化到 ElasticSearch。
4.2 告警配置
告警的核心由一组规则驱动,这些规则定义在config/Alarm-settings.yml文件中。 告警规则的定义分为三部分。
- 告警规则,它们定义了应该如何触发度量警报,应该考虑什么条件
- 网络钩子(Webhook),当警告触发时,哪些服务终端需要被告知
- gRPC钩子,远程gRPC方法的主机和端口,告警触发后调用
4.3 网关支持
SkyWalking agent通过插件对多种中间件、框架和库进行了支持。
所有启用的插件都在/plugins文件夹下。当某个插件的jar包在此文件夹下,表示此插件已被激活;从这个文件夹下移除后,表示插件不可用。
同时默认有一些可选的插件在/optional-plugins文件夹下,如网关,若要激活网关插件,则可以把网关的插件复制到/plugins文件夹下。
五、关于JavaAgent
SkyWalking 探针在使用上是无代码侵入的,而这种无侵入的自动埋点基于 Java 的 JavaAgent 技术。
启动时加载的 JavaAgent(以下所说的 JavaAgent 均代表启动时加载的 JavaAgent)是 JDK 1.5 中引入的 java.lang.Instrument 包,该包提供了一些工具使得在类加载时期修改 Class 类成为了可能。这实际上就是提供了一种虚拟机级别的 AOP,此特性为用户提供了在 JVM 将字节码文件读入内存之后,使用对应的字节流在 Java 堆中生成一个 Class 对象之前,对其字节码进行修改的能力,而JVM 也会使用用户修改过的字节码进行 Class 对象的创建。
SkyWalking 探针依赖于 JavaAgent 在一些特殊点(某个类的某些方法)拦截对应的字节码数据并进行 AOP 修改。当某个调用链路运行至已经被 SkyWalking 代码过的方法时,SkyWalking 会通过代理逻辑进行这些关键节点信息的收集、传递和上报,从而还原出整个分布式链路。