skywalking
Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等官网:http://skywalking.apache.org/下载:http://skywalking.apache
skywalking链路追踪
Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等
官网:http://skywalking.apache.org/
下载:http://skywalking.apache.org/downloads/
Github: https://github.com/apache/skywalking
文档:https://skywalking.apache.org/docs/main/v8.4.0/readme/
中文文档:https://skyapm.github.io/document-cn-translation-of-skywalking/
1、需要解决的问题:
-
如何串联整个调用链路,快速定位问题?
-
如何理清楚各个微服务之间的依赖关系?
-
如何进行各个微服务接口的性能分析?
-
如何跟踪整个业务流程的调用处理顺序?
与其他框架的对比:
skywalking的探针对吞吐量的影响最小,zipkin的吞吐量居中。pinpoint的探针对吞吐量的影响较为明显。
2、Skywalking主要功能特性
- 多种监控手段,可以通过语言探针和service mesh获得监控的数据;
- 支持多种语言自动探针,包括java,.NET Core和Node.JS;
- 轻量高效,无需大数据平台和大量的服务器资源;
- 模块化,UI、存储、集群管理都有多种机制可选;
- 支持告警;
- 优秀的可视化解决方案;
3、Skywalking环境搭建部署
- skywalking agent和业务系统绑定在仪器,负责收集各种监控数据;
- Skywalking oapservice(相当于服务端):是负责收集并处理监控数据的,如接收skywalking agent的监控数据,并存储在数据库(mysql、h2)中;接收skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapservice通常以集群的形式存在。
- skywalking webapp,前端界面,用于展示数据。
- 用于存储监控数据的数据库,比如mysql、elasticsearch等。
4、下载及安装
1)下载:Index of /dist/skywalking (apache.org)
(这里下v8.5.0)
2)解压完成后文件夹内容
目录结构
-
**webapp:**UI 前端( web 监控页面)的 jar 包和配置文件 .yml;(可以通过配置文件修改端口)
-
**oap-libs:**后台应用的 jar 包,以及它的依赖jar包,里边有一个 server-starter-*.jar 就是启动程序;
-
**config:**启动后台应用程序的配置文件,是使用的各种配置(主要是修改里边的 application.yml 文件,可在 storage 修改默认存储方式(h2是内存数据库,重启会丢失监控数据))
-
**bin:*各种启动版本,一般使用脚本 startup. 启动 web页面 和对应的 后台应用 ;
- oapService.*:默认使用的后台程序的启动脚本;(使用的是默认模式启动,还支持其他模式,各模式区别)
- oapServiceinit.*:使用 init 模式启动;在此模式下,OAP服务器启动以执行初始化工作,然后退出
- oapServiceNoInit.*:使用 no init 模式启动;在此模式下,OAP服务器不进行初始化。
- webappService.*:UI前端的启动脚本;
- stratup.*:组合脚本,同时启动 oapService. *、webappService. *脚本;
-
agent:
- skywalking-agent.jar:代理服务 jar 包
- config:代理服务启动时使用的配置文件
- plugins:包含多个插件,代理服务启动时会加载该目录下的所有插件(就是各种jar包)
- optional-plugins:可选插件,当需要支持某种功能时,比如 SpringCloud Gateway,则需要把对应的 jar 包拷贝到plugins
5、SkyWalking的服务
SkyWalking启动之后,会启动两个Java服务:skywalking-oap-server、skywalking-web-ui
skywalking-oap-server服务启动后会暴露11800 和 12800 两个端口,分别为 收集监控数据的端口11800 和 接收前端请求的端口12800 ,修改端口可以修改config/application.yml
- Skywalking-Collector
1. 追踪信息收集器,通过gRPC/Http收集客户端的采集信息。默认采用gRPC。
2. gRPC默认端口11800,Http默认端口12800
-
Skywalking-Webapp
1. 管理平台页面,默认端口8080
6、skywalking中的三个概念
- 服务(Service):表示对请求提供相同行为的一系列或一组工作负载,使用Agent时,可以定义服务名字
- 服务实例(instance):自已工作负载中的每一个工作负载是一个实例,一个服务实例就是操作系统的一个真实流程
- 端点(Endpoint):对特定服务接收的请求路径,如HTTP的URI路径和gRPC服务的类名+方法签名
7、skywalking在idea中的配置
无侵入式,不需要对代码修改
-javaagent:D:\skywalking\apache-skywalking-apm-bin\agent\skywalking-agent.jar (指定agent.jar所在的位置)
-DSW-AGENT_NAME=springboot-skywalking-demo (指定服务名字)
-DSW_AGENT_COLLECTOR_SERVICES=127.0.0.1:11800 (指定aollector连接地址,与微服务对接的端口)
springcloud中:默认不显示gateway,需要将 agent \optional-plugins 文件夹下的 apm-spring-cloud-gateway-2.1.x-plugin-8.5.0.jar 复制到 agent\plugins文件夹下
自定义链路追踪
- 对项目中的方法实现链路追踪,引入一下依赖
<!--skywalking工具类, 跟服务版本一致-->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.5.0</version>
</dependency>
-
@Trace 将方法加入链路追踪
- 若业务方法想在UI界面的追踪链路上显示出来,只需要在业务方法上加 @Trace
- 为追踪链路增加其他的额外信息,比如记录参数和返回信息,在方法上增加 @Tag 或 @Tags
- @Tag中 Key = 方法名,value = returnedObj 返回值 ,value = arg[0] =参数
@Trace @Tag(key = "add", value = "returnedObj") public int add(String businessKey) { BusinessStatus bs = new BusinessStatus(); // 待提交 bs.setStatus(BusinessStatusEnum.WAIT.getCode()); bs.setBusinessKey(businessKey); return baseMapper.insert(bs); } @Override @Trace @Tags({ @Tag(key = "add", value = "returnedObj"), @Tag(key = "add", value = "arg[0]") })
8、UI管理端图形界面使用说明
仪表盘
Global
-
Services Load:服务每分钟请求数
-
Slow Services:慢响应服务,单位ms
-
Un-Health Services (Apdex):不健康服务
-
Slow Endpoints:慢端点,单位ms
-
Global Response Latency:百分比响应延时,不同百分比的延时时间,单位ms
-
Global Heatmap:服务响应时间热力分布图,根据时间段内不同响应时间的数量显示颜色深度
Service
-
Service Apdex(数字):当前服务的评分
-
Service Apdex(折线图):不同时间的Apdex评分
-
Service Avg Response Time:服务平均响应时间
-
Successful Rate(数字):请求成功率
-
Successful Rate(折线图):不同时间的请求成功率
-
Service Response Time Percentile:百分比响应延时
-
Service Load(数字):每分钟请求数
-
Servce Load(折线图):不同时间的每分钟请求数
-
Service Instances Load:每个服务实例的每分钟请求数
-
Slow Service Instance:每个服务实例的最大延时
-
Service Instance Successful Rate:每个服务实例的请求成功率
Instance
-
Service Instance Load:当前实例的每分钟请求数
-
Service Instance Throughput:实例吞吐量
-
Service Instance Successful Rate:当前实例的请求成功率
-
Service Instance Latency:当前实例的响应延时
-
JVM CPU (Java Service):jvm占用CPU的百分比
-
JVM Memory (Java Service):JVM内存占用大小,单位m
-
JVM GC Time:JVM垃圾回收时间,包含YGC和OGC
-
JVM GC Count:JVM垃圾回收次数,包含YGC和OGC
-
JVM Thread Count (Java Service):JVM线程数
-
JVM Thread State Count (Java Service)
-
JVM Class Count (Java Service)
EndPoint
-
Endpoint Load in Current Service:每个端点的每分钟请求数
-
Slow Endpoints in Current Service:每个端点的最慢请求时间,单位ms
-
Successful Rate in Current Service:每个端点的请求成功率
-
Endpoint Load:当前端点每个时间段的请求数据
-
Endpoint Avg Response Time:当前端点每个时间段的请求行响应时间
-
Endpoint Response Time Percentile:当前端点每个时间段的响应时间占比
-
Endpoint Successful Rate:当前端点每个时间段的请求成功率
拓扑图
单个服务相关内容(从左到右)
- 单个服务内容
- 服务告警信息
- 服务端点追踪信息
- 服务实例性能信息
- api信息面板
追踪
- 左侧:api接口列表,红色-异常请求,蓝色-正常请求;
- 右侧:api追踪列表,api请求连接各端点的先后顺序和时间;
性能剖析
可以用来解决 慢请求,慢响应的问题
新建任务
刷新后界面信息
分析线程信息
日志
skywalking集成日志框架(logback)
- 引入依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.5.0</version>
</dependency>
- 添加logback-spring.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 引入 Spring Boot 默认的logback XML 配置文件-->
<include resource = "org/springframework/boot/logging/logback/defaults.xml"/>
<property name="log_pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%tid] [%thread] %-5level %logger{36}:%line - %msg%n" />
<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.TraceIdPatternLogbackLayout">
<pattern>${log_pattern}</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.TraceIdPatternLogbackLayout">
<pattern>${log_pattern}</pattern>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
<appender-ref ref="grpc-log"/>
</root>
</configuration>
github.com/apache/skywalking/blob/v8.5.0/docs/en/setup/service-agent/java-agent/Application-tookit-logback-1.x.md
- 若oap与agent不在同一个服务器上,需要配置 agent/config/agent.config 的内容
# 指定要向其报告日志数据的GRPC服务器主机
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:10.10.10.1}
# 指定要向其报告日志数据的GRPC服务器端口
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
# 指定GRPC客户端要报告的日志数据的最大大小
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每隔一段时间根据收集到的链路追踪的数据和配置的告警规则(如服务响应时间、服务响应时间百分比)等,判断如果达到阈值则发送相应的告警信息。发送告警信息是通过调用webhook接口完成,具体的webhook接口可以使用者自行定义,从而开发者可以在指定的webhook接口中编写各种告警方式,比如邮件、短信等。告警的信息也可以在RocketBot中查看到。
以下是默认的告警规则配置,位于skywalking安装目录下的config文件夹下 alarm-settings.yml 文件,若要使用webhooks,需要在alarm-settings.yml下配置
webhooks:
http://127.0.0.1:8088/webhook
常见的报警规则
- 最近3分钟内服务的平均响应时间超过1秒
- 最近2分钟服务成功率低于80%
- 最近3分钟90%服务响应时间超过1秒
- 最近2分钟内服务实例的平均响应时间超过1秒
实现报警机制:
1、配置webhook
2、实现接口
编写告警功能接口来进行测试,创建skywalking_alarm项目。
AlamController:
package com.itcast.skywalking_alarm.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AlarmController {
//每次调用睡眠1.5秒,模拟超时的报警
@GetMapping("/timeout")
public String timeout(){
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "timeout";
}
}
主要用于模拟超时,多次调用产生告警信息
WebHooks
package com.itcast.skywalking_alarm.controller;
import com.itcast.skywalking_alarm.pojo.AlarmMessage;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class WebHooks {
private List<AlarmMessage> lastList = new ArrayList<>();
@PostMapping("/webhook")
public void webhook(@RequestBody List<AlarmMessage> alarmMessageList){
lastList = alarmMessageList;
}
@GetMapping("/show")
public List<AlarmMessage> show(){
return lastList;
}
}
告警时会调用webhook接口,该接口必须是Post类型,同时接口参数使用RequestBody,支持邮件,钉钉,企业微信等
package com.itcast.skywalking_alarm.pojo;
public class AlarmMessage {
private int scopeId;
private String name;
private int id0;
private int id1;
//告警的消息
private String alarmMessage;
//告警的产生时间
private long startTime;
public int getScopeId() {
return scopeId;
}
public void setScopeId(int scopeId) {
this.scopeId = scopeId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId0() {
return id0;
}
public void setId0(int id0) {
this.id0 = id0;
}
public int getId1() {
return id1;
}
public void setId1(int id1) {
this.id1 = id1;
}
public String getAlarmMessage() {
return alarmMessage;
}
public void setAlarmMessage(String alarmMessage) {
this.alarmMessage = alarmMessage;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
@Override
public String toString() {
return "AlarmMessage{" +
"scopeId=" + scopeId +
", name='" + name + '\'' +
", id0=" + id0 +
", id1=" + id1 +
", alarmMessage='" + alarmMessage + '\'' +
", startTime=" + startTime +
'}';
}
}
实体类用于接收告警信息
- 调用接口,地址为http://IP:8088/timeout,直到出现告警
- 查看告警信息接口:http://IP:8088/show
实体类用于接收告警信息
- 调用接口,地址为http://IP:8088/timeout,直到出现告警
- 查看告警信息接口:http://IP:8088/show
一次Skywalking线上分享会上记录的关于使用Skywalking定位问题的思路:
- 纵览全局,通过Skywalking拓扑图
- 监控告警,metric/tracting确定问题存在故障(根据metric做告警),确定故障在哪,tracing调用关系,确定故障出现在那个service或者endpoint
- 追踪(profile手段)定位
更多推荐
所有评论(0)