SkyWalking分布式追踪和应用性能监控系统

2021-01-27  本文已影响0人  iamChel

用SkyWalking做分布式追踪和应用性能监控系统

SkyWalking 是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

特性:

Skywalking 技术架构

图片.png

整个系统分为三部分:

Skywalking也提供了其他的一些特性:

数据容器

由于Skywalking并没有自己定制的数据容器或者使用多种数据容器增加复杂度,而是主要使用ElasticSearch(当然开源的基本上都是这样来保持简洁,例如Pinpoint也只使用了HBase),所以数据容器的特性以及自己数据结构基本上就限制了业务的上限,以ES为例:

总体来说,Skywalking尽量使用ES在大数据和查询方面的优势,同时尽量减少ES数据密度低的劣势带来的影响,从目前来看,ES在调用链跟踪方面是不二的数据容器,而在数据指标方面,ES也能中规中矩的完成业务,虽然和时序数据库相比要弱一些,但在PB级以下的数据支持也不会有太大问题。

数据结构

如果说数据容器决定了上限,那么数据结构则决定了实际到达的高度。Skywalking的数据结构主要为:

其中数量占比最大的就是调用链跟踪数据和各种指标,而这些数据均可以通过OAP设置过期时间,以降低历史数据的对磁盘占用和查询效率的影响。

调用链跟踪数据

作为Skywalking的核心数据,调用链跟踪数据(skywalking_segment)基本上奠定了整个系统的基础,而如果要详细的了解调用链跟踪的话,就不得不提到openTracing

openTracing基本上是目前开源调用链跟踪系统的一个事实标准,它制定了调用链跟踪的基本流程和基本的数据结构,同时也提供了各个语言的实现。如果用一张图来表现openTracing,则是如下:

图片.png

其中:

以一个Trace为例:

图片.png

首先是外部请求调用A,然后A依次同步调用了B和C,而B被调用时会去同步调用D,C被调用的时候会依次同步调用E和F,F被调用的时候会通过异步调用G,G则会异步调用H,最终完成一次调用。

上图是通过Span之间的依赖关系来表现一个Trace,而在时间线上,则可以有如下的表达:

图片.png

当然,如果是同步调用的话,父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

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的规范方便探针的开发,最终实现非侵入性的数据埋点,采集调用链数据。

OAP

同agent类似,OAP作为Skywalking最核心的模块,也实现了自己的扩展机制,不过在这里叫做Module,具体可以参考library-module,在module的机制下,Skywalking实现了自己必须核心组件:

以及一个可选组件:

而前面提到的OAP的高扩展性则体现在核心业务的规范均定义在了core中,如果有需要自己扩展的,只需要自己单独做自己的实现,而不需要做侵入式的改动,最典型的示例则是官方支持的storage,不仅支持单机demo的内存数据库H2和经典的ES,连目前开源的Tidb都可以接入。

【转载请注明出处】:https://blog.csdn.net/huahao1989/article/details/107117546

上一篇下一篇

猜你喜欢

热点阅读