【转载请注明出处】:http://www.javashuo.com/article/p-kfelrwfm-nq.html前端
SkyWalking 是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。java
特性:mysql
Skywalking 技术架构web
整个系统分为三部分:sql
Skywalking也提供了其余的一些特性:数据库
因为Skywalking并无本身定制的数据容器或者使用多种数据容器增长复杂度,而是主要使用ElasticSearch(固然开源的基本上都是这样来保持简洁,例如Pinpoint也只使用了HBase),因此数据容器的特性以及本身数据结构基本上就限制了业务的上限,以ES为例:apache
整体来讲,Skywalking尽可能使用ES在大数据和查询方面的优点,同时尽可能减小ES数据密度低的劣势带来的影响,从目前来看,ES在调用链跟踪方面是不二的数据容器,而在数据指标方面,ES也能中规中矩的完成业务,虽然和时序数据库相比要弱一些,但在PB级如下的数据支持也不会有太大问题。编程
若是说数据容器决定了上限,那么数据结构则决定了实际到达的高度。Skywalking的数据结构主要为:segmentfault
数据维度(ES索引为skywalking_*_inventory)后端
数据内容
原始数据
二次统计指标
特别记录
其中数量占比最大的就是调用链跟踪数据和各类指标,而这些数据都可以经过OAP设置过时时间,以下降历史数据的对磁盘占用和查询效率的影响。
做为Skywalking的核心数据,调用链跟踪数据(skywalking_segment)基本上奠基了整个系统的基础,而若是要详细的了解调用链跟踪的话,就不得不提到openTracing。
openTracing基本上是目前开源调用链跟踪系统的一个事实标准,它制定了调用链跟踪的基本流程和基本的数据结构,同时也提供了各个语言的实现。若是用一张图来表现openTracing,则是以下:
其中:
Trace:一次调用的完整记录
Span:一次调用中的某个节点/步骤,相似于一层堆栈信息,Trace是由多个Span组成,Span和Span之间也有父子或者并列的关系来标志这个节点/步骤在整个调用中的位置
以一个Trace为例:
首先是外部请求调用A,而后A依次同步调用了B和C,而B被调用时会去同步调用D,C被调用的时候会依次同步调用E和F,F被调用的时候会经过异步调用G,G则会异步调用H,最终完成一次调用。
上图是经过Span之间的依赖关系来表现一个Trace,而在时间线上,则能够有以下的表达:
固然,若是是同步调用的话,父Span的时间占用是包括子Span的时间消耗的。
而落地到Skywalking中,咱们以一条skywalking_segment的记录为例:
{ "trace_id": "52.70.15530767312125341", "endpoint_name": "Mysql/JDBI/Connection/commit", "latency": 0, "end_time": 1553076731212, "endpoint_id": 96142, "service_instance_id": 52, "version": 2, "start_time": 1553076731212, "data_binary": "CgwKCjRGnPvp5eikyxsSXhD///////////8BGMz62NSZLSDM+tjUmS0wju8FQChQAVgBYCF6DgoHZGIudHlwZRIDc3FsehcKC2RiLmluc3RhbmNlEghyaXNrZGF0YXoOCgxkYi5zdGF0ZW1lbnQYAiA0", "service_id": 2, "time_bucket": 20190320181211, "is_error": 0, "segment_id": "52.70.15530767312125340" }
其中:
这里能够看到,目前Skywalking虽然相较于Pinpoint来讲查询的维度要多一些,可是也颇有限,并且除了endPoint,并无和业务有关联的字段,只能经过时间/服务/实例/接口/成功标志/耗时来进行非业务相关的查询,若是后续要加强业务相关的搜索查询的话,应该还须要增长一些用于保存动态内容(如messageId,orderId等业务关键字)的字段用于快速定位
指标数据相对于Tracing则要简单得多了,通常来讲就是指标标志、时间戳、指标值,而Skywalking中的指标有两种:一种是采集的原始指标值,例如jvm的各类运行时指标(例如cpu消耗、内存结构、GC信息等);一种是各类二次统计指标(例如tp性能指标、SLA等,固然也有为了便于查询的更高时间维度的指标,例如基于分钟、小时、天、周、月)
例如如下是索引skywalking_endpoint_cpm_hour中的一条记录,用于标志一个小时内某个接口的cpm指标:
{ "total": 8900, "service_id": 5, "time_bucket": 2019031816, "service_instance_id": 5, "entity_id": "7", "value": 148 }
各个字段的释义以下:
agent(apm-sniffer)是Skywalking的Java探针实现,主要负责:
固然,agent还实现了客户端采样,不过在APM监控系统里进行客户端数据采样都是没有灵魂的,因此这里就再也不赘述了。
首先,agent经过 org.apache.skywalking.apm.agent.core.boot.BootService 实现了总体的插件化,agent启动会加载全部的BootService实现,并经过 ServiceManager 来管理这些插件的生命周期,采集jvm指标、gRPC链接管理、调用链数据维护、数据上报OAP这些服务均是经过这种方式扩展。
而后,agent还经过bytebuddy以javaagent的模式,经过字节码加强的机制来构造AOP环境,再提供PluginDefine的规范方便探针的开发,最终实现非侵入性的数据埋点,采集调用链数据。
同agent相似,OAP做为Skywalking最核心的模块,也实现了本身的扩展机制,不过在这里叫作Module,具体能够参考library-module,在module的机制下,Skywalking实现了本身必须核心组件:
以及一个可选组件:
而前面提到的OAP的高扩展性则体如今核心业务的规范均定义在了core中,若是有须要本身扩展的,只须要本身单独作本身的实现,而不须要作侵入式的改动,最典型的示例则是官方支持的storage,不只支持单机demo的内存数据库H2和经典的ES,连目前开源的Tidb均可以接入。
startup.sh
启动http://localhost:8080/
便可看到面板-javaagent:${agent_home}/agent/skywalking-agent.jar -Dskywalking.agent.service_name=${service_name}
【转载请注明出处】:http://www.javashuo.com/article/p-kfelrwfm-nq.html