SkyWalking
SkyWalking
1、SkyWalking是什么?
skywalking 是一个国产开源框架,2015年由个人吴晟(华为开发者)开源 , 2017年加入Apache孵化器,skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案
官网:http://skywalking.apache.org/
下载:https://skywalking.apache.org/downloads/
Github: https://github.com/apache/skywalking
文档:https://skywalking.apache.org/docs/main/latest/readme/
1.1、链路追踪框架对比
- 1、Zipkin是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单。
- 2、Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具,特点是支持多种插件,UI功能强大,接入端无代码侵入。
- 3、SkyWalking是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具,特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已成为apache顶级项目
- 4、CAT是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。
项目 | Cat | Zipkin | SkyWalking |
---|---|---|---|
调用链可视化 | 有 | 有 | 有 |
聚合报表 | 非常丰富 | 少 | 较丰富 |
服务依赖图 | 简单 | 简单 | 好 |
埋点方式 | 侵入式 | 侵入式 | 非侵入,字节码增强 |
VM监控指标 | 好 | 无 | 有 |
支持语言 | java/.net | 丰富 | java/.net/Nodejs/php/go |
存储机制 | mysql(报表),本地文件/HDFS(调用链) | 内存,es,mysql等 | H2,es |
社区支持 | 主要国内 | 国外主流 | Apache支持 |
使用案例 | 美团,携程,陆金所 | 京东,阿里定制后不开源 | 华为,小米,当当,微众银行 |
APM | 是 | 否 | 是 |
是否支持webflux | 否 | 是 | 是 |
1.2、SkyWalking主要功能特性
- 多种监控手段,可以通过语言探针和service mesh获得监控的数据
- 支持多种语言自动探针,包括Java,.NET Core 和 Node.js
- 轻量高效,无需大数据平台和大量服务器资源
- 模块化,UI,存储,集群管理都有多种机制可选
- 支持告警
- 优秀的可视化解决方案
2、SkyWalking环境搭建
下载:https://www.apache.org/dyn/closer.cgi/skywalking/8.9.1/apache-skywalking-apm-8.9.1.tar.gz
下载探针:https://www.apache.org/dyn/closer.cgi/skywalking/java-agent/8.8.0/apache-skywalking-java-agent-8.8.0.tgz
windows双击apache-skywalking-apm-bin\bin下startup.bat启动,linux运行startup.sh
3、微服务接入SkyWalking
3.1、windows环境接入SkyWalking
# skywalking-agent.jar的本地磁盘路径
-javaagent:D:\SkyWalking\skywalking-agent\skywalking-agent.jar
# 在skywalking上显示的服务名
-DSW_AGENT_NAME=springboot-skywalking-demo
# skywalking的collector服务的IP及端口
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800
# -DSW_AGENT_COLLECTOR_BACKEND_SERVICES 可以指定远程地址,但javaagent必须指定本机物理路径的skywalking-agent.jar
注意:skywalking默认不支持gateway需要到 skywalking-agent\optional-plugins 文件夹下将 apm-spring-cloud-gateway-3.x-plugin-8.8.0.jar 复制到 skywalking-agent\plugins 文件夹后,重启服务
3.2、linux环境接入SkyWalking
java -javaagent:/usr/loacl/soft/skywalking-agent/skywalking-agent.jar
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800
-DSW_AGENT_NAME=springboot-skywalking-demo
-jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar
3.3、多个微服务接入SkyWalking
只需要每个微服务设置运行参数
4、SkyWalking UI介绍
- Service Apdex (数字) :当前服务的评分
- Service Apdex (折线图):不同时间的Apdex评分
- Service Avg Response Times:平均响应延时,单位ms
- Service Response Time Percentile:百分比响应延时
- Successful Rate (数字):请求成功率
- Successful Rate (折线图):不同时间的请求成功率
- Service Load (数字):每分钟请求数
- Service Load (折线图):不同时间的每分钟请求数
- Service Instances Load :每个服务实例的每分钟请求数
- Show Service Instance:每个服务实例的最大延时
- Service Instance Successful Rate :每个服务实例的请求成功率
5、SkyWalking基于mysql持久化数据
config/application.yml
storage:
selector: ${SW_STORAGE:mysql} #默认使用的H2数据库存储,将h2改为mysql
mysql: #修改mysql连接 IP端口号,数据库
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest?rewriteBatchedStatements=true"}
dataSource.user: ${SW_DATA_SOURCE_USER:root} #用户名
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root@1234} #密码
dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
skywalking默认没有mysql驱动,下载好mysql驱动放入 apache-skywalking-apm-bin/oap-libs 文件夹后,重启服务
6、自定义链路追踪
如需要对业务中的方法,实现链路追踪,可以按照下面步骤实现
<!-- SkyWalking 工具类 -->
<!-- skywalking.version 为版本号,需和服务版本保持一致 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-tookit-trace</artifactId>
<version>${skywalking.version}</version>
</dependency>
//在业务方法上加入@Trace注解即可
@Override
@Trace
@Tags(@Tag(key="selectAppHistoryVersionList",value="arg[0]"), //记录参数,value=arg[0],0为参数下标,key=方法名
@Tag(key="selectAppHistoryVersionList",value="returnObj")) //记录返回值 value=returnObj,key=方法名
public List<AppHistoryVersion> selectAppHistoryVersionList(AppHistoryVersion appHistoryVersion)
{
return appHistoryVersionMapper.selectAppHistoryVersionList(appHistoryVersion);
}
//返回对象需在实体类加入toString,否则返回对象的内存地址
7、告警
自定义发送邮件:
SkyWalking的告警消息会通过 HTTP 请求进行发送,请求方法为 POST,Content-Type 为 application/json,其JSON 数据实基于List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage进行序列化的
json数据字段说明:
- scopeId、scope:所有可用的 Scope
- name:目标 Scope 的实体名称
- id0:Scope 实体的 ID
- id1:保留字段,目前暂未使用
- ruleName:告警规则名称
- alarmMessage:告警消息内容
- startTime:告警时间,格式为时间戳
定义一个接口接收skywalking告警通知
@RequestMapping("/alarm")
public class AlarmController {
private final JavaMailSender sender;
/**
* 接收skywalking服务的告警通知并发送至邮箱
*/
@PostMapping("/receive")
public void receive(@RequestBody List<SwAlarmDTO> alarmList) {
SimpleMailMessage message = new SimpleMailMessage();
// 发送者邮箱
message.setFrom("邮箱");
// 接收者邮箱
message.setTo("邮箱");
// 主题
message.setSubject("告警邮件");
String content = getContent(alarmList);
// 邮件内容
message.setText(content);
sender.send(message);
}
private String getContent(List<AlarmDTO> alarmList) {
StringBuilder sb = new StringBuilder();
for (AlarmDTO 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());
}
return sb.toString();
}
}
将接口配置到 config/alarm-settings.yml
网络钩子,告警触发接口
webhooks:
- http://127.0.0.1:8888/alarm/receive # 接口访问地址