暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

skywalking初体验

码不禁言 2020-08-26
1582

背景
分布式链路追踪是微服务分析和监控的利器,试想一下如果服务接口涉及到几十个以上调用关系,当出现问题或者需要排查链路瓶颈,没有相应的工具,将会非常头疼。我们系统目前已经有一套链路追踪系统,系根据OpenTracing规范进行自研,目前已经线上跑了两年多。
至于为什么采用自研,主要是历史原因和当时的技术栈考量。现在反思起来,虽然系统还算稳定,也确实给业务带来了一定帮助。但整个系统设计从扩展性,侵入性,可维护性等方面相对较差。近期看SkyWalking热度挺高(github的star达到了14.4k),因此本人想做下调研学习,吸收一下优秀开源组件的优点,甚至看下引入到现有系统的可能性。


skywalking简介

官网的简介如上(让人遗憾的是中国人开发的软件居然没有中文文档),实现的功能挺多,间接说明了在链路追踪功能的基础上可以做很多事情。这次体验主要是验证链路追踪的功能。


skywalking快速部署

skywalking的部署非常方便,我们以默认的配置为例,底层用了本地的h2存储。首先下载最新的tar包,wget https://mirror.bit.edu.cn/apache/skywalking/8.1.0/apache-skywalking-apm-8.1.0.tar.gz,解压之后执行./bin/startup.sh就启动完成了。可以直接通过http://host:8080访问dashboard,如下图所示:


服务接入skywalking

1 服务启动指定skywalking的javaagent,这里通过java探针实现了非侵入性

我们以spring boot项目为例,打包成jar,启动命令如下:

java \

-javaagent:xxx/apache-skywalking-apm-bin/agent/skywalking-agent.jar \

-Dskywalking_config=./agent.config \

-jar ./target/sky-demo-1.0-SNAPSHOT.jar 

其中agent.config配置文件如下:

    # 设置为应用名称
    agent.service_name=skydemo
    # 设置为OAP地址
    collector.backend_service=yourhost:11800

    引用agent注意的问题:

    - agent目录下包含了plugin等相关插件,实际运行用到了这些插件,不能单独只指定skywalking-agent.jar

    skywalking-agent.jar的版本必须与skywalking服务端保持一致,避免不必要的兼容性问题


    2 测试服务间的调用关系

    在springboot服务中通过okhttp调用另外的服务,测试验证服务间的调用关系

    3 测试服务调用存储系统

    这里测试验证以调用redis和mysql为例

    4 系统中打印traceid

    在日志中打印traceId有助于定位问题,根据traceid可以在skywalking dashboard上查询到具体的调用链路。skywalking提供了sdk可以轻松实现,如下:
      log.info("{}", TraceContext.traceId());

      5 golang语言接入

      无疑,skywalking配合javaagent做无侵入性的接入,对业务来说接入成本非常低。如果业务是用其他语言如golang/c++实现的,则接入成本会相对较高,必须通过api封装接入协议,跟我们当前实现的思路类似。这里以golang为例,使用了现成的sdk:github.com/SkyAPM/go2sky,该module实现了http服务的skywalking接入。具体demo可以参考/test/e2e/example-server/main.go

      如上所示,我们实现了一个包含spring boot,golang服务,redis、mysql的调用关系,skywalking做了调用关系拓扑图的展示,这对于业务梳理调用关系和系统瓶颈大有帮助。


      skywalking体验总结

      (1)部署方便。从demo角度看几乎零门槛,线上的话主要考虑存储方面的部署和维护,比如es。

      (2)无侵入性接入。由于本人并不擅长java技术栈,部署和验证过程费了一些周折,如果是搞java的同学接入的话基本是分分钟的事情。

      (3)扩展性好。目前skywalking已经支持多种插件的探针实现,参考:https://github.com/apache/skywalking/blob/v6.6.0/docs/en/setup/service-agent/java-agent/Supported-list.md。我们甚至可以根据自己的情况添加相应的插件,而这对于业务侧是无感知的。这种插件的方式具有极强的扩展性,同时可以集各路开发的力量完善整个社区。

      (4)功能强大。实际上通过搜集链路信息本身就可以实现很多强大的功能,举个例子我们可以根据SQL语句去分析慢查询,可以对接口的质量进行告警,可以通过拓扑关系判断链路的瓶颈等。


      现有系统接入skywalking的可行性

      我们现有的技术栈是Java+ServiceMesh(golang),并且现在已经有一套链路追踪系统。首先业务侧的java服务可以无侵入性地指定javaagent进行skywalking的接入,但是service mesh也必须进行改造,升级为支持skywalking的实现(蚂蚁金服的mosn即实现了skywalking的上报),但这里带来了兼容性问题,即mesh还需要兼容老的未升级的链路协议的支持,实现上比较复杂性。

      另外一个问题是java服务接入也不是完全无侵入,因为现有系统日志中打印了traceId,而接入skywalking则相应的日志中的traceid要做修改。虽然改动不大,但系统的改造和过渡期会带来各种问题。


      总结

      通过本次测试体验,本人非常看好skywalking,如果是java技术栈,如果没有历史遗留问题,强烈建议将skywalking引入到业务系统中。

      文章转载自码不禁言,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论