SkyWalking深度研究
文件状态: [ ] 草稿 [√] 正在修改 |
当前版本 |
1.0 |
历史修订版本 |
1.0; |
|
作 者 |
杜有龙 |
|
完成日期 |
2019-01-10 |
在目前的微服务或者分布式架构下,分布式追踪变得很重要,在开发测试中可以帮助我们更快发现架构或者一些设计有问题的地方,在生产上可以帮我们统计和分析服务器性能和一些部署相关的问题,还可以帮助我们解决或者分析一些未知的问题。
skywalking的定位是apm,不仅提供了自动分布式追踪,还可以通过手动埋探针的方式去处理我们的一些特殊问题。同时它还支持了很多中间件和jvm监控,这是目前一些分布式追踪技术未能解决的问题。
比如spring cloud sleuth zipkin技术,不能解决kafka等一些中间件和jvm的监控功能,也不支持自定义去追踪自己想要了解的链路信息。
在这些方面skywalking做的还是比较好,通过探针的方式来进行监控做到代码0侵入性,而开销也不是很大。
据官方说在4000tps目前只会多占你当前应用所占cpu的百分之十,意思你的应用占用10%的CPU,加上skywalking你的应用会占到11%,个人认为这种开销是都会被大家所接收的。但目前skywalking还属于apache孵化器,一些组件还不完善,目前5.0版本也还没有到正式版本,所以有些地方做的还不完美,目前笔者使用的是5.0beta版本测试效果还不错,期待尽早能发apache正式版。
collector:主要为收集agent发送过来的数据,和为web提供接口服务
web:主要提供UI监控服务
agent:探针,获取应用信息
存储:其中数据存储为elasticsearch(5.0版本以下单机支持本地h2)
需要注意的是部署collector时默认地址localhost如果不是两个服务同时启在一台服务器的话最好改写为内网或者公网ip地址,如果说一个服务写localhost别的服务写的这台机器的ip,这样的话日志会报错,最好同时写成ip。
另外collector支持定时清理elasticsearh数据,默认好像是7天,在collector配置文件中有一个ttl属性,这个就是设置定期清理时间的。web部署时,需要在启动脚本里传入elasticsearch地址,并且端口设置也在启动脚本中。
agent的放置策略与实际场景有关,建议一个应用独立放一个探针,同一个应用的不同实例可以用一个探针。
其中有一个问题是探针如何来放置?尤其在docker环境下去部署agent,如果每个应用都把agent打在镜像里去启动这样的话感觉资源有些浪费(5.0版本的agent大概好像是17m)。
目前个人解决方式为在配置dockerfile时,可以使用VOLUME指令创建一个agent路径(例如/usr/local/agent/,以下举例将采用这个测试路径),在启动服务时执行“docker run -v 主机路径:容器路径 ”可以把宿主机文件路径中的agent(agent中配置一下通用的配置,例如collector地址)映射到容器中,Dockerfile启动时命令可以这样写 java -javaagent:/usr/local/agent/skywalking-agent.jar -Dskywalking.agent.application_code=应用名 -Dskywalking.logging.file_name=日志名.log -jar 应用.jar,用这种方式来部署比较方便,只需要在部署服务器上放置一个通用的配置的agent就好。
开发团队乐于帮助使用者,在github提issue和官方群谈论,很快会受到回复消息。
-- https://www.jianshu.com/p/2fd56627a3cf
如果一切顺利(不顺利请多看几遍 快速入门),这时候就可以通过 http://localhost:8080 来查看 SkyWalking UI 了(默认全是0,截图是测试效果),默认账号/密码:admin/admin。
单个服务的效果并不明显,看不出请求跨度、链路关系,下面是一个多服务的例子(下载源码),依赖关系图如下:
根据以上的关系图搭建好项目后,访问接口后结果如下:
一共有4各跨度,先访问 WenAPIService1,然后发送 HttpClient 请求,转到 WenAPIService2,WenAPIService2 执行操作 DB 的命令,每个跨度的耗时一目了然。
服务关系的拓扑图,调用链路径也非常清晰。
-- https://juejin.im/post/5a7a9e0af265da4e914b46f1
如上所述,那么我们选择全链路监控组件有哪些目标要求呢?Google Dapper中也提到了,总结如下:
APM组件服务的影响应该做到足够小。服务调用埋点本身会带来性能损耗,这就需要调用跟踪的低损耗,实际中还会通过配置采样率的方式,选择一部分请求去分析请求路径。在一些高度优化过的服务,即使一点点损耗也会很容易察觉到,而且有可能迫使在线服务的部署团队不得不将跟踪系统关停。
即也作为业务组件,应当尽可能少入侵或者无入侵其他业务系统,对于使用方透明,减少开发人员的负担。
对于应用的程序员来说,是不需要知道有跟踪系统这回事的。如果一个跟踪系统想生效,就必须需要依赖应用的开发者主动配合,那么这个跟踪系统也太脆弱了,往往由于跟踪系统在应用中植入代码的bug或疏忽导致应用出问题,这样才是无法满足对跟踪系统“无所不在的部署”这个需求。
一个优秀的调用跟踪系统必须支持分布式部署,具备良好的可扩展性。能够支持的组件越多当然越好。或者提供便捷的插件开发API,对于一些没有监控到的组件,应用开发者也可以自行扩展。
数据的分析要快 ,分析的维度尽可能多。跟踪系统能提供足够快的信息反馈,就可以对生产环境下的异常状况做出快速反应。分析的全面,能够避免二次开发。
-- https://juejin.im/post/5a7a9e0af265da4e914b46f1
一般的全链路监控系统,大致可分为四大功能模块:
埋点即系统在当前节点的上下文信息,可以分为 客户端埋点、服务端埋点,以及客户端和服务端双向型埋点。埋点日志通常要包含以下内容traceId、spanId、调用的开始时间,协议类型、调用方ip和端口,请求的服务名、调用耗时,调用结果,异常信息等,同时预留可扩展字段,为下一步扩展做准备;
不能造成性能负担:一个价值未被验证,却会影响性能的东西,是很难在公司推广的!
因为要写log,业务QPS越高,性能影响越重。通过采样和异步log解决。
主要支持分布式日志采集的方案,同时增加MQ作为缓冲;
调用链跟踪分析:把同一TraceID的Span收集起来,按时间排序就是timeline。把ParentID串起来就是调用栈。
抛异常或者超时,在日志里打印TraceID。利用TraceID查询调用链情况,定位问题。
依赖度量:
离线分析:按TraceID汇总,通过Span的ID和ParentID还原调用关系,分析链路形态。
实时分析:对单条日志直接分析,不做汇总,重组。得到当前QPS,延迟。
作者:猿码道
链接:https://juejin.im/post/5a7a9e0af265da4e914b46f1
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-- https://juejin.im/post/5a7a9e0af265da4e914b46f1
基本工作单元,一次链路调用(可以是RPC,DB等没有特定的限制)创建一个span,通过一个64位ID标识它,uuid较为方便,span中还有其他的数据,例如描述信息,时间戳,key-value对的(Annotation)tag信息,parent_id等,其中parent-id可以表示span调用链路来源。
上图说明了span在一次大的跟踪过程中是什么样的。Dapper记录了span名称,以及每个span的ID和父ID,以重建在一次追踪过程中不同span之间的关系。如果一个span没有父ID被称为root span。所有span都挂在一个特定的跟踪上,也共用一个跟踪id。
Span数据结构:
type Span struct {
TraceID int64 // 用于标示一次完整的请求id
Name string
ID int64 // 当前这次调用span_id
ParentID int64 // 上层服务的调用span_id 最上层服务parent_id为null
Annotation []Annotation // 用于标记的时间戳
Debug bool
}
复制代码
类似于 树结构的Span集合,表示一次完整的跟踪,从请求到服务器开始,服务器返回response结束,跟踪每次rpc调用的耗时,存在唯一标识trace_id。比如:你运行的分布式大数据存储一次Trace就由你的一次请求组成。
每种颜色的note标注了一个span,一条链路通过TraceId唯一标识,Span标识发起的请求信息。树节点是整个架构的基本单元,而每一个节点又是对span的引用。节点之间的连线表示的span和它的父span直接的关系。虽然span在日志文件中只是简单的代表span的开始和结束时间,他们在整个树形结构中却是相对独立的。
注解,用来记录请求特定事件相关信息(例如时间),一个span中会有多个annotation注解描述。通常包含四个注解信息:
(1) cs:Client Start,表示客户端发起请求 (2) sr:Server Receive,表示服务端收到请求 (3) ss:Server Send,表示服务端完成处理,并将结果发送给客户端 (4) cr:Client Received,表示客户端获取到服务端返回信息
Annotation数据结构:
type Annotation struct {
Timestamp int64
Value string
Host Endpoint
Duration int32
}
复制代码
· 通过AGENT生成调用链日志。
· 通过logstash采集日志到kafka。
· kafka负责提供数据给下游消费。
· storm计算汇聚指标结果并落到es。
· storm抽取trace数据并落到es,这是为了提供比较复杂的查询。比如通过时间维度查询调用链,可以很快查询出所有符合的traceID,根据这些traceID再去 Hbase 查数据就快了。
· logstash将kafka原始数据拉取到hbase中。hbase的rowkey为traceID,根据traceID查询是很快的。
5 AGENT无侵入部署
通过AGENT代理无侵入式部署,将性能测量与业务逻辑完全分离,可以测量任意类的任意方法的执行时间,这种方式大大提高了采集效率,并且减少运维成本。根据服务跨度主要分为两大类AGENT:
(1)Dubbo支持;
(2)Rest支持;
(3)自定义RPC支持;
复制代码
6调用链监控好处
作者:猿码道
链接:https://juejin.im/post/5a7a9e0af265da4e914b46f1
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-- https://juejin.im/post/5a7a9e0af265da4e914b46f1
市面上的全链路监控理论模型大多都是借鉴Google Dapper论文,本文重点关注以下三种APM组件:
以上三种全链路监控方案需要对比的项提炼出来:
主要是agent对服务的吞吐量、CPU和内存的影响。微服务的规模和动态性使得数据收集的成本大幅度提高。
能够水平扩展以便支持大规模服务器集群。
提供代码级别的可见性以便轻松定位失败点和瓶颈。
添加新功能而无需修改代码,容易启用或者禁用。
自动检测应用拓扑,帮助你搞清楚应用的架构
-- https://juejin.im/post/5a7a9e0af265da4e914b46f1
比较关注探针的性能,毕竟APM定位还是工具,如果启用了链路监控组建后,直接导致吞吐量降低过半,那也是不能接受的。对skywalking、zipkin、pinpoint进行了压测,并与基线(未使用探针)的情况进行了对比。
选用了一个常见的基于Spring的应用程序,他包含Spring Boot, Spring MVC,redis客户端,mysql。 监控这个应用程序,每个trace,探针会抓取5个span(1 Tomcat, 1 SpringMVC, 2 Jedis, 1 Mysql)。这边基本和 skywalkingtest 的测试应用差不多。
模拟了三种并发用户:500,750,1000。使用jmeter测试,每个线程发送30个请求,设置思考时间为10ms。使用的采样率为1,即100%,这边与生产可能有差别。pinpoint默认的采样率为20,即50%,通过设置agent的配置文件改为100%。zipkin默认也是1。组合起来,一共有12种。下面看下汇总表:
从上表可以看出,在三种链路监控组件中,skywalking的探针对吞吐量的影响最小,zipkin的吞吐量居中。pinpoint的探针对吞吐量的影响较为明显,在500并发用户时,测试服务的吞吐量从1385降低到774,影响很大。然后再看下CPU和memory的影响,在内部服务器进行的压测,对CPU和memory的影响都差不多在10%之内。
-- https://juejin.im/post/5a7a9e0af265da4e914b46f1
collector的可扩展性,使得能够水平扩展以便支持大规模服务器集群。
开发zipkin-Server(其实就是提供的开箱即用包),zipkin-agent与zipkin-Server通过http或者mq进行通信,http通信会对正常的访问造成影响,所以还是推荐基于mq异步方式通信,zipkin-Server通过订阅具体的topic进行消费。这个当然是可以扩展的,多个zipkin-Server实例进行异步消费mq中的监控信息。
2 skywalking
skywalking的collector支持两种部署方式:单机和集群模式。collector与agent之间的通信使用了gRPC。
3 pinpoint
同样,pinpoint也是支持集群和单机部署的。pinpoint agent通过thrift通信框架,发送链路信息到collector。
全面的调用链路数据分析,提供代码级别的可见性以便轻松定位失败点和瓶颈。
skywalking 还支持20+的中间件、框架、类库,比如:主流的dubbo、Okhttp,还有DB和消息中间件。上图skywalking链路调用分析截取的比较简单,网关调用user服务,由于支持众多的中间件,所以skywalking链路调用分析比zipkin完备些。
3 pinpoint
pinpoint应该是这三种APM组件中,数据分析最为完备的组件。提供代码级别的可见性以便轻松定位失败点和瓶颈,上图可以看到对于执行的sql语句,都进行了记录。还可以配置报警规则等,设置每个应用对应的负责人,根据配置的规则报警,支持的中间件和框架也比较完备。
对于开发透明,容易开关,添加新功能而无需修改代码,容易启用或者禁用。我们期望功能可以不修改代码就工作并希望得到代码级别的可见性。
对于这一点,Zipkin 使用修改过的类库和它自己的容器(Finagle)来提供分布式事务跟踪的功能。但是,它要求在需要时修改代码。skywalking和pinpoint都是基于字节码增强的方式,开发人员不需要修改代码,并且可以收集到更多精确的数据因为有字节码中的更多信息。
上面三幅图,分别展示了APM组件各自的调用拓扑,都能实现完整的调用链应用拓扑。相对来说,pinpoint界面显示的更加丰富,具体到调用的DB名,zipkin的拓扑局限于服务于服务之间。
Pinpoint 实现了基于字节码注入的 Java Agent 探针,而 Zipkin 的 Brave 框架仅仅提供了应用层面的 API,但是细想问题远不那么简单。字节码注入是一种简单粗暴的解决方案,理论上来说无论任何方法调用,都可以通过注入代码的方式实现拦截,也就是说没有实现不了的,只有不会实现的。但 Brave 则不同,其提供的应用层面的 API 还需要框架底层驱动的支持,才能实现拦截。比如,MySQL 的 JDBC 驱动,就提供有注入 interceptor 的方法,因此只需要实现 StatementInterceptor 接口,并在 Connection String 中进行配置,就可以很简单的实现相关拦截;而与此相对的,低版本的 MongoDB 的驱动或者是 Spring Data MongoDB 的实现就没有如此接口,想要实现拦截查询语句的功能,就比较困难。
因此在这一点上,Brave 是硬伤,无论使用字节码注入多么困难,但至少也是可以实现的,但是 Brave 却有无从下手的可能,而且是否可以注入,能够多大程度上注入,更多的取决于框架的 API 而不是自身的能力。
Monitor可分为系统监控和应用监控。系统监控比如CPU,内存,网络,磁盘等等整体的系统负载的数据,细化可具体到各进程的相关数据。这一类信息是直接可以从系统中得到的。应用监控需要应用提供支持,暴露了相应的数据。比如应用内部请求的QPS,请求处理的延时,请求处理的error数,消息队列的队列长度,崩溃情况,进程垃圾回收信息等等。Monitor主要目标是发现异常,及时报警。
Tracing的基础和核心都是调用链。相关的metric大多都是围绕调用链分析得到的。Tracing主要目标是系统分析。提前找到问题比出现问题后再去解决更好。
Tracing和应用级的Monitor技术栈上有很多共同点。都有数据的采集,分析,存储和展式。只是具体收集的数据维度不同,分析过程不一样。
-- https://www.cnblogs.com/xiaoqi/p/apm.html
APM组件服务的影响应该做到足够小。服务调用埋点本身会带来性能损耗,这就需要调用跟踪的低损耗,实际中还会通过配置采样率的方式,选择一部分请求去分析请求路径。在一些高度优化过的服务,即使一点点损耗也会很容易察觉到,而且有可能迫使在线服务的部署团队不得不将跟踪系统关停。
即也作为业务组件,应当尽可能少入侵或者无入侵其他业务系统,对于使用方透明,减少开发人员的负担。
对于应用的程序员来说,是不需要知道有跟踪系统这回事的。如果一个跟踪系统想生效,就必须需要依赖应用的开发者主动配合,那么这个跟踪系统也太脆弱了,往往由于跟踪系统在应用中植入代码的bug或疏忽导致应用出问题,这样才是无法满足对跟踪系统“无所不在的部署”这个需求。
一个优秀的调用跟踪系统必须支持分布式部署,具备良好的可扩展性。能够支持的组件越多当然越好。或者提供便捷的插件开发API,对于一些没有监控到的组件,应用开发者也可以自行扩展。
数据的分析要快 ,分析的维度尽可能多。跟踪系统能提供足够快的信息反馈,就可以对生产环境下的异常状况做出快速反应。分析的全面,能够避免二次开发。
-- https://www.cnblogs.com/xiaoqi/p/apm.html
先来看一次请求调用示例:
Dapper是如何来跟踪记录这次请求呢?
1.3.1 跟踪树和span
Span是dapper的基本工作单元,一次链路调用(可以是RPC,DB等没有特定的限制)创建一个span,通过一个64位ID标识它;同时附加(Annotation)作为payload负载信息,用于记录性能等数据。
上图说明了span在一次大的跟踪过程中是什么样的。Dapper记录了span名称,以及每个span的ID和父ID,以重建在一次追踪过程中不同span之间的关系。如果一个span没有父ID被称为root span。所有span都挂在一个特定的跟踪上,也共用一个跟踪id。
再来看下Span的细节:
Span数据结构:
typeSpan
struct{
TraceID
int64// 用于标示一次完整的请求id
Name
string
ID
int64// 当前这次调用span_id
ParentID
int64// 上层服务的调用span_id 最上层服务parent_id为null
Annotation []Annotation
// 用于标记的时间戳
Debug
bool
}
1.3.2 TraceID
类似于 树结构的Span集合,表示一次完整的跟踪,从请求到服务器开始,服务器返回response结束,跟踪每次rpc调用的耗时,存在唯一标识trace_id。比如:你运行的分布式大数据存储一次Trace就由你的一次请求组成。
每种颜色的note标注了一个span,一条链路通过TraceId唯一标识,Span标识发起的请求信息。树节点是整个架构的基本单元,而每一个节点又是对span的引用。节点之间的连线表示的span和它的父span直接的关系。虽然span在日志文件中只是简单的代表span的开始和结束时间,他们在整个树形结构中却是相对独立的。
1.3.3 Annotation
Dapper允许应用程序开发人员在Dapper跟踪的过程中添加额外的信息,以监控更高级别的系统行为,或帮助调试问题。这就是Annotation:
Annotation,用来记录请求特定事件相关信息(例如时间),一个span中会有多个annotation注解描述。通常包含四个注解信息:
(1) cs:Client Start,表示客户端发起请求
(2) sr:Server Receive,表示服务端收到请求
(3) ss:Server Send,表示服务端完成处理,并将结果发送给客户端
(4) cr:Client Received,表示客户端获取到服务端返回信息
Annotation数据结构:
type Annotation struct {
Timestamp int64
Value string
Host Endpoint
Duration int32
}
1.3.4 采样率
低损耗的是Dapper的一个关键的设计目标,因为如果这个工具价值未被证实但又对性能有影响的话,你可以理解服务运营人员为什么不愿意部署它。
另外,某些类型的Web服务对植入带来的性能损耗确实非常敏感。
因此,除了把Dapper的收集工作对基本组件的性能损耗限制的尽可能小之外,Dapper支持设置采样率来减少性能损耗,同时支持可变采样。
发现当前用的EF框架偶尔会因为不小心就写出了性能很差的SQL,测试环境基本看不
到了生产可能就炸.
##&###&###&###&#
--https://github.com/apache/incubator-skywalking
SkyWalking支持从多个来源和多种格式收集遥测(痕迹和指标)数据。
SkyWalking supports to collect telemetry (traces and metrics) data from multiple sources and multiple formats. including
Java, .NET Core and NodeJS auto-instrument agents in SkyWalking format
Istio telemetry format
Zipkin v1/v2 formats
来源:http://skywalking.apache.org/downloads/
6.x版本
6.0.0-beta的变化
支持SpringMVC 5
支持webflux
支持通过系统环境覆盖agent.config的新方法。
Span标记可以通过显式方式覆盖。
后端
支持MySQL作为存储。
支持服务实例和端点告警。
支持服务吞吐量(cpm),成功率(sla),平均响应时间和p99 / p95 / p90 / p75 / p50响应时间。
支持后端跟踪采样。
再次支持Zipkin格式。
支持init模式。
支持Zookeeper集群管理中的命名空间。
支持集群模块中的consul插件。
UI
支持服务吞吐量(cpm),成功率(sla),平均响应时间和p99 / p95 / p90 / p75 / p50响应时间
(一)、环境部署--社区
1、网络
https://blog.csdn.net/y_h_d/article/details/83342846
https://blog.csdn.net/zhangkang65/article/details/78991760
2、端口修改skywalking 8080 端口 修改
https://my.oschina.net/ytqvip/blog/1793767
3、社区
docker环境:
https://www.cnblogs.com/liguobao/p/9686310.html
4、版本5.X
A类
es环境安装:
http://blog.51cto.com/zero01/2130696
高级特性
https://blog.csdn.net/jilo88/article/details/81355265
https://blog.csdn.net/SoberChina/article/details/79315242
https://blog.csdn.net/qq_42281649/article/details/82804703
5、独到总结
https://blog.csdn.net/qq_36236890/article/details/79647017
6、官方社区
https://github.com/OpenSkywalking/Community
7、高级部署
http://blog.51cto.com/536410/2318051
8、APM、Google
pass==++++https://www.cnblogs.com/xiaoqi/p/apm.html
(二)、环境部署--官方--文档
1、官方
中文
https://github.com/apache/incubator-skywalking/blob/5.x/docs/README_ZH.md
--英文
https://github.com/apache/incubator-skywalking
2、Docker
https://github.com/JaredTan95/skywalking-docker
3、如何构建项目
https://github.com/apache/incubator-skywalking/blob/master/docs/en/guides/How-to-build.md
(三)、高级特性
1、个性化服务过滤
https://github.com/apache/incubator-skywalking/blob/5.x/apm-sniffer/optional-plugins/trace-ignore-plugin/README_CN.md
https://blog.csdn.net/u013095337/article/details/80452088
2、版本、
https://github.com/SkywalkingTest/agent-integration-test-report#dubbo
(四)、理论、深入研究文章
1、架构设计-系列文章
https://github.com/apache/incubator-skywalking/blob/5.x/docs/cn/Architecture-CN.md
https://blog.csdn.net/Saphulot/article/details/81739411
pass==https://www.jianshu.com/p/2fd56627a3cf
2、全面深入分析
https://juejin.im/post/5a7a9e0af265da4e914b46f1
3、全面学习
http://www.iocoder.cn/categories/SkyWalking/
4、10加文章
https://juejin.im/post/5ab5b0e26fb9a028e25d7fcb
5、skywalking源码分析之javaAgent工具ByteBuddy的应用
http://www.kailing.pub/article/index/arcid/178.html
6、谷歌论文《 Dapper,大规模分布式系统的跟踪系统》
http://bigbully.github.io/Dapper-translation/
(五)、监控应用
https://www.jianshu.com/p/3ddd986c7581
https://www.cnblogs.com/huangxincheng/p/9666930.html
(六)、APM常见技术对比
https://blog.csdn.net/u012394095/article/details/79700200
https://www.jianshu.com/p/0fbbf99a236e
https://www.cnblogs.com/davidwang456/articles/8119047.html
(七)、UI
https://blog.csdn.net/qq_36236890/article/details/79647017
http://blog.zollty.com/b/archive/apm-comparison-of-skywalking-and-pinpiont.html