APM——SkyWalking


发布于 2018-01-13 / 45 阅读 / 0 评论 /
Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。

1.SkyWalking概述

SkyWalking是国内一个开源并提交到Apache孵化器的产品,是用于收集、分析、聚合、可视化来自不同服务和本地基础服务的数据的可视化的平台。

SkyWalking提供了一个可以对分布式系统甚至是跨云服务有清晰了解的简单方法。SkyWalking符合OpenTracing规范,同时提供更加现代化、炫酷的UI,可以更加直观地监控应用。

Skywalking是一个国产的开源框架,2015年有吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,跟Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持,目前增长势头强劲,社区活跃。

2.SkyWalking架构

SkyWalking架构如下图所示:

SkyWalking逻辑上分为四个部分:探针、平台后端、存储、用户界面。

2.1.探针

基于不同的来源可能是不一样的, 但作用都是收集数据, 将数据格式化为 SkyWalking 适用的格式.

2.2.平台后端

支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等。 你甚至可以使用 Observability Analysis Language 对原生度量指标 和 用于扩展度量的计量系统 自定义聚合分析。

2.3.存储

通过开放的插件化的接口存放 SkyWalking 数据. 你可以选择一个既有的存储系统, 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统. 当然, 我们非常欢迎你贡献新的存储系统实现。

2.4.用户界面

即UI,是一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 SkyWalking 数据。

3.功能介绍

SkyWalking支持以下功能特点:

(1)多种监控手段,可以通过语言探针和service mesh获得监控的数据

(2)支持多重语言的自动探针,包括JAVA, .NET Core和NodeJS

(3)轻量高效,无需大数据平台和大量的服务器资源

(4)模块化,UI ,存储,集群管理都有多种机制可选

(5)支持告警

(6)优秀的可视化解决方案

3.1.使用方法

SkyWalking与业务的整个集成架构如下图所示:

Skywalking agent和业务端绑定在一起,负责收集各种监控数据。

Skywalking oapservice是负责处理监控数据,接受agent的数据并存储在数据库中,接受来自UI的请求,查询监控数据。

Skywalking UI提供给用户,展现各种监控数据和告警。

3.2.SkyWalking log集成

Skywalking 可以与日志功能集成,将模块的日志上传到中心进行集中查看。由logback,log4j等对应的jar来收集各个模块的日志。比如集成logback,配置方式如下。

首先,引入相关jar包,配置如下:

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>8.4.0</version>
</dependency>

然后,配置logback,在logback配置文件中添加如下内容:

<!-- skywalking grpc 日志收集 8.4.0版本开始支持 -->
<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.mdc.TraceIdMDCPatternLogbackLayout">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
        </layout>
    </encoder>
</appender>

<!--系统操作日志-->
<root level="DEBUG">  
    <appender-ref ref="STDOUT"/> 
    <appender-ref ref="ASYNC"/> 
    <appender-ref ref="grpc-log"/>
</root>

最后,需要在应用中添加日志插件相关的配置,如下所示:

plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}

主要是配合SkyWalking的远程地址和端口。