目录
1、skywalking是什么
1.2 链路追踪框架对比
1.3 性能对比
1.4 Skywalking主要功能特性
2、 SkyWalking 环境搭建部署
2.1 下载 SkyWalking
2.2 搭建SkyWalking OAP 服务
2.3 SkyWalking中三个概念
3、 SkyWalking 接入微服务
3.1 linux环境—通过jar包方式接入
3.2 windos环境—在IDEA中使用Skywalking
3.3 Skywalking跨多个微服务跟踪
4、 Skywalking持久化跟踪数据
4.1 基于mysql持久化
5、 自定义SkyWalking链路追踪
5.1 @Trace将方法加入追踪链路
编辑 5.2 加入@Tags或@Tag
6.性能分析
7.Skywalking集成日志框架
7.1Skywalking通过grpc上报日志 (需要v8.4.0+)
8.SkyWalking 告警功能
8.1告警规则
8.2Webhook(网络钩子)
8.3邮件告警功能实践
9.Skywalking高可用
10.demo源码:springcloudAlibaba: Alibaba微服务学习demo
1、skywalking是什么
1.2 链路追踪框架对比
1.3 性能对比
1.4 Skywalking主要功能特性
2、 SkyWalking 环境搭建部署
- skywalking agent和业务系统绑定在一起,负责收集各种监控数据
- Skywalking oapservice是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中;
- 接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapservice通常以集 群的形式存在。
- skywalking webapp,前端界面,用于展示数据。
- 用于存储监控数据的数据库,比如mysql、elasticsearch等。
2.1 下载 SkyWalking
根据需求下载对应版本解压即可。
2.2 搭建SkyWalking OAP 服务
日志信息存储在logs目录
页面的右下角可以中英文切换,可以切换选择要展示的时间区间的跟踪数据
2.3 SkyWalking中三个概念
3、 SkyWalking 接入微服务
3.1 linux环境—通过jar包方式接入
#!/bin/sh
# SkyWalking Agent配置
export SW_AGENT_NAME=springboot‐skywalking‐demo #Agent名字,一般使用`spring.application.name`
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 #配置 Collector 地址。
export SW_AGENT_SPAN_LIMIT=2000 #配置链路的最大Span数量,默认为 300。
export JAVA_AGENT=‐javaagent:/usr/local/soft/apache‐skywalking‐apm‐bin‐es7/agent/skywalking‐agent.jar
java $JAVA_AGENT ‐jar springboot‐skywalking‐demo‐0.0.1‐SNAPSHOT.jar #jar启动
java ‐javaagent:/usr/local/soft/apache‐skywalking‐apm‐bin‐es7/agent/skywalking‐agent.jar
‐DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
‐DSW_AGENT_NAME=springboot‐skywalking‐demo ‐jar springboot‐skywalking‐demo‐0.0.1‐SNAPSHOT.jar
3.2 windos环境—在IDEA中使用Skywalking
-javaagent:E:\apache-skywalking-apm-8.5.0\apache-skywalking-apm-bin\agent\skywalking-agent.jar
-DSW_AGENT_NAME=api-gateway
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
3.3 Skywalking跨多个微服务跟踪
访问8444端口:
4、 Skywalking持久化跟踪数据
4.1 基于mysql持久化
3. 添加对应版本的mysql数据驱动包到oap-libs目录下
4. 启动Skywalking
测试:重启skywalking,验证跟踪数据会不会丢失
5、 自定义SkyWalking链路追踪
<!-- SkyWalking 工具类, 跟服务版本一致 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.5.0</version>
</dependency>
5.1 @Trace将方法加入追踪链路
测试
5.2 加入@Tags或@Tag
测试
6.性能分析
7.Skywalking集成日志框架
引入依赖
<!-- apm-toolkit-logback-1.x -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.5.0</version>
</dependency>
添加logback-spring.xml文件,并配置 %tid 占位符
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 引入 Spring Boot 默认的 logback XML 配置文件 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<appender name="console" 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.TraceIdPatternLogbackLayout">
<Pattern>-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} [%tid] %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 -->
<root level="INFO">
<appender-ref ref="console"/>
</root>
</configuration>
7.1Skywalking通过grpc上报日志 (需要v8.4.0+)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 引入 Spring Boot 默认的 logback XML 配置文件 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<appender name="console" 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.TraceIdPatternLogbackLayout">
<Pattern>-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} [%tid] %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="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.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<!-- 设置 Appender -->
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="grpc-log"/>
</root>
</configuration>
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.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 UI效果
8.SkyWalking 告警功能
8.1告警规则
- Rule name:规则名称,也是在告警信息中显示的唯一名称。必须以_rule结尾,前缀可自定义
- Metrics name:度量名称,取值为oal脚本中的度量名,目前只支持long、double和int类型。详见Official OAL script
- Include names:该规则作用于哪些实体名称,比如服务名,终端名(可选,默认为全部)
- Exclude names:该规则作不用于哪些实体名称,比如服务名,终端名(可选,默认为空)
- Threshold:阈值
- OP: 操作符,目前支持 >、<、=
- Period:多久告警规则需要被核实一下。这是一个时间窗口,与后端部署环境时间相匹配
- Count:在一个Period窗口中,如果values超过Threshold值(按op),达到Count值,需要发送警报
- Silence period:在时间N中触发报警后,在TN -> TN + period这个阶段不告警。 默认情况下,它和Period一样,这意味着 相同的告警(在同一个Metrics name拥有相同的Id)在同一个Period内只会触发一次
- message:告警消息
8.2Webhook(网络钩子)
[{"scopeId" : 1 ,"scope" : "SERVICE" ,"name" : "serviceA" ,"id0" : "12" ,"id1" : "" ,"ruleName" : "service_resp_time_rule" ,"alarmMessage" : "alarmMessage xxxx" ,"startTime" : 1560524171000}, {"scopeId" : 1 ,"scope" : "SERVICE" ,"name" : "serviceB" ,"id0" : "23" ,"id1" : "" ,"ruleName" : "service_resp_time_rule" ,"alarmMessage" : "alarmMessage yyy" ,"startTime" : 1560524171000}]
8.3邮件告警功能实践
< dependency >< groupId > org . springframework . boot </ groupId >< artifactId > spring ‐ boot ‐ starter ‐ mail </ artifactId ></ dependency >
server :port : 9134# 邮箱配置spring :mail :host : smtp . 163. com# 发送者邮箱账号username : 你的邮箱 @ 163. com# 发送者密钥password : 你的邮箱服务密钥default ‐ encoding : utf ‐ 8port : 465 # 端口号 465 或 587protocol : smtpproperties :mail :debug :falsesmtp :socketFactory :class : javax . net . ssl . SSLSocketFactory
@Data
public class SwAlarmDTO {
private Integer scopeId;
private String scope;
private String name;
private Integer id0;
private Integer id1;
private String ruleName;
private String alarmMessage;
private Long startTime;
}
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/alarm")
public class SwAlarmController {
private final JavaMailSender sender;
@Value("${spring.mail.username}")
private String from;
/**
* 接收skywalking服务的告警通知并发送至邮箱
*/
@PostMapping("/receive")
public void receive(@RequestBody List<SwAlarmDTO> alarmList) {
SimpleMailMessage message = new SimpleMailMessage();
// 发送者邮箱
message.setFrom(from);
// 接收者邮箱
message.setTo(from);
// 主题
message.setSubject("告警邮件");
String content = getContent(alarmList);
// 邮件内容
message.setText(content);
sender.send(message);
log.info("告警邮件已发送...");
}
private String getContent(List<SwAlarmDTO> alarmList) {
StringBuilder sb = new StringBuilder();
for (SwAlarmDTO dto : alarmList) {
sb.append("scopeId: ").append(dto.getScopeId())
.append("\nscope: ").append(dto.getScope())
.append("\n目标 Scope 的实体名称: ").append(dto.getName())
.append("\nScope 实体的 ID: ").append(dto.getId0())
.append("\nid1: ").append(dto.getId1())
.append("\n告警规则名称: ").append(dto.getRuleName())
.append("\n告警消息内容: ").append(dto.getAlarmMessage())
.append("\n告警时间: ").append(dto.getStartTime())
.append("\n\n‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐\n\n");
}
return sb.toString();
}
}
@Override
@Trace
@Tag(key="getAll",value="returnedObj")
public List<Order> all() throws InterruptedException {
TimeUnit.SECONDS.sleep(2);
return orderMapper.selectAll();
}
9.Skywalking高可用
可以选择性修改监听端口
2. 配置ui服务webapp.yml文件的listOfServers,写两个地址
3.启动服务测试
‐ DSW_AGENT_COLLECTOR_BACKEND_SERVICES = 192.168.3.10 : 11800 , 192.168.3.12 : 1180