SkyWalking
1. skywalking是什么对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:如何串联整个调用链路,快速定位问题?如何理清各个微服务之间的依赖关系?如何进行各个微服务接口的性能分折?如何跟踪整个业务流程的调用处理顺序?skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器。skywalking是分布式系统的应用程序
1. skywalking是什么
对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:
- 如何串联整个调用链路,快速定位问题?
- 如何理清各个微服务之间的依赖关系?
- 如何进行各个微服务接口的性能分折?
- 如何跟踪整个业务流程的调用处理顺序?
skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器。skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统,提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
下载:Downloads | Apache SkyWalking
Github:GitHub - apache/skywalking: APM, Application Performance Monitoring System
中文文档地址:UI Introduction | Apache SkyWalking
1.1 Skywalking主要功能特性
1、多种监控手段,可以通过语言探针和service mesh获得监控的数据;
2、支持多种语言自动探针,包括 Java,.NET Core 和 Node.JS;
3、轻量高效,无需大数据平台和大量的服务器资源;
4、模块化,UI、存储、集群管理都有多种机制可选;
5、支持告警;
6、优秀的可视化解决方案;
1.2 Skywalking整体架构
整个架构分成四部分:
1、上部分Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器;
2、下部分 SkyWalking OAP :负责接收Agent发送的Tracing数据信息,然后进行分析(Analysis Core),存储到外部存储器(Storage),最终提供查询(Query)功能;
3、右部分Storage:Tracing数据存储,目前支持ES、MySQL、Sharding Sphere、TiDB、H2多种存储器,目前采用较多的是ES,主要考虑是SkyWalking开发团队自己的生产环境采用ES为主;
4、左部分SkyWalking UI:负责提供控制台,查看链路等等;
SkyWalking支持三种探针:
● Agent – 基于ByteBuddy字节码增强技术实现,通过jvm的agent参数加载,并在程序启动时拦截指定的方法来收集数据。
● SDK – 程序中显式调用SkyWalking提供的SDK来收集数据,对应用有侵入。
● Service Mesh – 通过Service mesh的网络代理来收集数据。
后端(Backend)
接受探针发送过来的数据,进行度量分析,调用链分析和存储。后端主要分为两部分:
● OAP(Observability Analysis Platform)- 进行度量分析和调用链分析的后端平台,并支持将数据存储到各种数据库中,如:ElasticSearch,MySQL,InfluxDB等。
● OAL(Observability Analysis Language)- 用来进行度量分析的DSL,类似于SQL,用于查询度量分析结果和警报。
界面(UI)
● RocketBot UI – SkyWalking 7.0.0 的默认web UI
● CLI – 命令行界面
1.3 操作
官网下载8.7.0版本:Downloads | Apache SkyWalking
在本地目录进行解压如下:
目录结构说明:
启动:直接执行./startup.sh ,该命令包含了2部分
启动成功后会启动两个服务,一个是skywalking-oap-server,一个是skywalking-web-ui
skywalking-oap-server服务启动后会暴露11800 和 12800 两个端口,分别为收集监控数据的端口11800和接受前端请求的端口12800,修改端口可以修改config/applicaiton.yml
启动的日志如下所示:
skywalking-web-ui服务会占用 8080 端口, 修改端口可以修改webapp/webapp.yml
打开页面:http://localhost:8080
后端项目配置以及启动
-DSW_AGENT_NAME:在skywalking可视化界面上显示的服务名称
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES:和skywalking通讯的ip地址和端口号
-javaagent:无侵入引入skywalking增强jar包
首页:
拓扑图显示了springboot中调用的关联关系,如果引入了第三方程序,则调用链也会展示出来。
追踪:一个请求接口从请求到响应的完整链路。可以展示请求的参数,执行的sql语句以及返回的结果集合【前提:配置trace和tag注解】
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.7.0</version>
<scope>provided</scope>
</dependency>
@ApiOperation("获取通话记录列表2")
@Trace
@Tags({@Tag(key = "self-param", value = "arg[0]"),
@Tag(key = "self-user", value = "returnedObj")})
@PostMapping("/list3")
public ApiResult<TbCallRecord> list3(@RequestBody(required = false) TbCallRecordReq tbCallRecordReq) {
//TraceContext可以绑定key-value
TraceContext.putCorrelation("name", "你好list3");
Optional<String> op = TraceContext.getCorrelation("name");
log.info("name = {} ", op.get());
//获取跟踪的traceId
String traceId = TraceContext.traceId();
log.info("traceId = {} ", traceId);
String s = baseAgent.doGet("http://localhost:8091/skydemo");
log.info("remote-result:{}",s);
return ApiResult.success(callRecordService.list(tbCallRecordReq));
}
@Trace:表明该方法放入链路追踪中,只要调用了,一定会在链路上展示出来
@Tag:相当于自定义返回的结果参数,可以在链路中查看。如:key=self-param,value=arg[0](相当于展示请求的参数对象),key=self-user,value=returnObj(相当于展示返回的结果对象)
doGet调用另外模块效果:
告警模块:config/alarm-settings.yml可以设置告警信息。如果配置了告警的回调接口,则满足告警机制的时候,会触发。(备注:回调函数必须是post请求,否则会报错)
性能分析:创建一个任务,指定要检测的端点名称(观察的接口),以及监控时间,可以针对性的看出调用链的执行情况。个人觉得和追踪类似。
日志管理:在日志中可以将traceId打印在经过的所有方法日志中,方便排查问题。
pom文件引入
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.7.0</version>
</dependency>
日志文件引入:
<appender name="console-sky" 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>%d{yyyy-MM-dd HH:mm:ss.SSS} 【%tid】 [%thread] %-5level %-40.40logger{39} - %-4line : %msg%n</Pattern>
</layout>
</encoder>
</appender>
如果想上本地打印的日志上传到skywalking前端页面,则需要在日志文件中文件
<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>%d{yyyy-MM-dd HH:mm:ss.SSS} 【%tid】 [%thread] %-5level %-40.40logger{39} - %-4line : %msg%n</Pattern>
</layout>
</encoder>
</appender>
<springProfile name="dev">
<root level="INFO">
<appender-ref ref="console-sky" />
<appender-ref ref="grpc-log" />
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
grpc推送在agent/config/agent.config配置中的默认配置如下:【备注:ui页面上的日志是倒序展示的】
配置名 | 解释 | 默认值 |
plugin.toolkit.log.transmit_formatted | 是否以格式化或未格式化的格式传输记录的数据 | true |
plugin.toolkit.log.grpc.reporter.server_host | 指定要向其报告日志数据的grpc服务器的主机 | 127.0.0.1 |
plugin.toolkit.log.grpc.reporter.server_port | 指定要向其报告日志数据的grpc服务器的端口 | 11800 |
plugin.toolkit.log.grpc.reporter.max_message_size | 指定grpc客户端要报告的日志数据的最大大小 | 10485760 |
plugin.toolkit.log.grpc.reporter.upstream_timeout | 客户端向上游发送数据时将超时多长时间。单位是秒 | 30 |
更多推荐
所有评论(0)