1. skywalking是什么

对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:

  1. 如何串联整个调用链路,快速定位问题?
  2. 如何理清各个微服务之间的依赖关系?
  3. 如何进行各个微服务接口的性能分折?
  4. 如何跟踪整个业务流程的调用处理顺序?

skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器。skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统,提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

官网:Apache 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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐