1. 概述

1.1 概念

SkyWalking 是什么?
FROM http://skywalking.apache.org/
分布式系统的应用程序性能监督工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
提供分布式追踪、服务网格遥测剖析、度量聚合和可视化一体化解决方案。

1.2 性能列表

SkyWalking 有哪些性能?
FROM http://skywalking.apache.org/

  • 多种监控伎俩。能够通过语言探针和 service mesh 取得监控是数据。
  • 多个语言主动探针。包含 Java,.NET Core 和 Node.JS。
  • 轻量高效。无需大数据平台,和大量的服务器资源。
  • 模块化。UI、存储、集群治理都有多种机制可选。
  • 反对告警。
  • 优良的可视化解决方案。

    1.3 整体架构

    SkyWalking 整体架构如何?
    FROM http://skywalking.apache.org/

    整个架构,分成上、下、左、右四局部:
    思考到让形容更简略,咱们舍弃掉 Metric 指标相干,而着重在 Tracing 链路相干性能。

  • 上局部 Agent :负责从利用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前反对 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而咱们目前采纳的是,SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给服务器。
  • 下局部 SkyWalking OAP :负责接管 Agent 发送的 Tracing 数据信息,而后进行剖析(Analysis Core) ,存储到内部存储器( Storage ),最终提供查问( Query )性能。
  • 右局部 Storage :Tracing 数据存储。目前反对 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而咱们目前采纳的是 ES ,次要思考是 SkyWalking 开发团队本人的生产环境采纳 ES 为主。
  • 左局部 SkyWalking UI :负责提供控台,查看链路等等。

    1.4 官网文档

    在 https://github.com/apache/skywalking/tree/master/docs 地址下,提供了 SkyWalking 的英文文档。
    思考到大多数胖友的英语水平和艿艿不相伯仲,再加上胖友一开始对 SkyWalking 比拟生疏,所以比拟举荐先浏览 https://github.com/SkyAPM/document-cn-translation-of-skywalking 地址,提供了 SkyWalking 的中文文档。
    思考到胖友应用 SkyWalking 的目标,是实现分布式链路追踪的性能,所以最好去理解下相干的常识。这里举荐浏览两篇文章:

  • 《OpenTracing 官网规范 —— 中文版》
  • Google 论文 《Dapper,大规模分布式系统的跟踪零碎》

2.搭建

2.1 Elasticsearch 搭建

#间接拉取镜像sudo docker pull elasticsearch:7.4.2#创立所需目录:mkdir -p /mydata/elasticsearch/config/ mkdir -p /mydata/elasticsearch/data/ echo "http.host: 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml#创立实例并启动:sudo docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \-e ES_JAVA_OPS="-Xms512m -Xmx512m" \-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \-d elasticsearch:7.4.2

参数阐明:

留神要有拜访权限:chmod -R 777 /mydata/elasticsearch参数阐明:-p 9200:9200 将容器的9200端口映射到主机的9200端口;--name elasticsearch 给以后启动的容器取名叫 elasticsearch-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data 将数据文件夹挂载到主机;-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml 将配置文件挂载到主机;-d 当前台形式运行(daemon)-e ES_JAVA_OPS="-Xms256m -Xmx256m" 测试时限定内存小一点

拜访elasticsearch:http://IP:9200/

2.2 下载 SkyWalking 软件包

对于 SkyWalking 的软件包,有两种形式获取:

  • 手动编译
  • 官网包

个别状况下,咱们倡议应用官网包。手动编译,更多是尝鲜或者等焦急修复的 BUG 的版本。

2.2.1 官网包

在 http://skywalking.apache.org/downloads/ 下,咱们下载操作系统对应的公布版。
这里,咱们抉择 Binary Distribution for ElasticSearch 7 (Linux) 版本,因为艿艿是 Mac 环境,再加上想应用 Elasticsearch 7.X 版本作为存储。如果胖友想用 Elasticsearch 6.X 版本作为存储,记得下载 Binary Distribution (Linux) 版本。
① 下载

# 创立目录$ mkdir -p /Users/yunai/skywalking$ cd /Users/yunai/skywalking# 下载$ wget http://mirror.bit.edu.cn/apache/skywalking/6.6.0/apache-skywalking-apm-es7-6.6.0.tar.gz

② 解压

# 解压$ tar -zxvf apache-skywalking-apm-es7-6.6.0.tar.gz$ cd  apache-skywalking-apm-bin-es7$ ls -ls 4 drwxr-xr-x 8 root root  4096 Sep  9 15:09 agent # SkyWalking Agent 4 drwxr-xr-x 2 root root  4096 Sep  9 15:44 bin # 执行脚本 4 drwxr-xr-x 2 root root  4096 Sep  9 15:44 config # SkyWalking OAP Server 配置文件32 -rwxr-xr-x 1 root root 28903 Sep  9 14:32 LICENSE 4 drwxr-xr-x 3 root root  4096 Sep  9 15:44 licenses32 -rwxr-xr-x 1 root root 31850 Sep  9 14:32 NOTICE16 drwxr-xr-x 2 root root 16384 Sep  9 15:22 oap-libs # SkyWalking OAP Server 4 -rw-r--r-- 1 root root  1978 Sep  9 14:32 README.txt 4 drwxr-xr-x 2 root root  4096 Sep  9 15:44 webapp # SkyWalking UI

2.2 SkyWalking OAP 配置批改

批改 skywalking/config/application.yml



其中 nameSpace是申请装置的es http://IP:9200/ 返回的cluster_name对应值。

2.3启动

skywalking/bin/ 目录下 sh startup.sh 即可启动

2.4拜访

http://IP:8080/

3.SpringCloud 服务接入SkyWalking

3.1 SkyWalking Agent

大多数状况下,咱们在启动我的项目的 Shell 脚本上,通过 -javaagent 参数进行配置 SkyWalking Agent 。
思考到偶然咱们须要在 IDE 中,也心愿应用 SkyWalking Agent ,所以咱们在 上面IDE大节来看。

3.1.1 Shell

① Agent 软件包
咱们须要将 apache-skywalking-apm-bin/agent 目录,拷贝到 Java 利用所在的服务器上。这样,Java 利用才能够配置应用该 SkyWalking Agent。咱们来看看 Agent 目录下有哪些:

$ ls -lstotal 35176    0 drwxr-xr-x@  7 yunai  staff       224 Dec 24 14:20 activations    0 drwxr-xr-x@  4 yunai  staff       128 Dec 24 14:21 bootstrap-plugins    0 drwxr-xr-x@  3 yunai  staff        96 Dec 24 14:12 config # SkyWalking Agent 配置    0 drwxr-xr-x@  3 yunai  staff        96 Jan  2 19:29 logs # SkyWalking Agent 日志    0 drwxr-xr-x@ 13 yunai  staff       416 Dec 24 14:22 optional-plugins # 可选插件    0 drwxr-xr-x@ 68 yunai  staff      2176 Dec 24 14:20 plugins # 插件35176 -rw-r--r--@  1 yunai  staff  18006420 Dec 24 14:12 skywalking-agent.jar # SkyWalking Agent
  • 对于 SkyWalking Agent 提供的插件列表,能够看看《SkyWalking 文档 —— 插件反对列表》。

因为艿艿是在本机测试,所以无需拷贝,SkyWalking Agent 目录是 /Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/。

② 配置 Java 启动脚本

# SkyWalking Agent 配置export SW_AGENT_NAME=demo-application # 配置 Agent 名字。一般来说,咱们间接应用 Spring Boot 我的项目的 `spring.application.name` 。export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 # 配置 Collector 地址。export SW_AGENT_SPAN_LIMIT=2000 # 配置链路的最大 Span 数量。个别状况下,不须要配置,默认为 300 。次要思考,有些新上 SkyWalking Agent 的我的项目,代码可能比拟蹩脚。export JAVA_AGENT=-javaagent:/Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar # SkyWalking Agent jar 地址。# Jar 启动java -jar $JAVA_AGENT -jar lab-39-demo-2.2.2.RELEASE.jar#简单脚本可参考:nohup java -javaagent:/data/application/skywalking/agent/skywalking-agent.jar -Xmx512m -Xms512m -jar ${APP_NAME} --spring.profiles.active=dev --spring.cloud.nacos.discovery.server-addr=192.168.0.79:8848 --spring.cloud.nacos.discovery.password=nacos --spring.cloud.nacos.discovery.username=nacos --spring.cloud.nacos.config.server-addr=192.168.0.79:8848 >/dev/null 2>&1 &
  • 通过环境变量,进行配置。
  • 更多的变量,能够在 /agent/config/agent.config 查看。要留神,可能有些变量是被正文掉的,例如说 SW_AGENT_SPAN_LIMIT 对应的 agent.span_limit_per_segment 。

③ 执行脚本

3.1.2 IDEA

咱们对立应用 IDEA 作为开发 IDE ,所以疏忽 Eclipse 的配置形式。
具体参考下图,比较简单:

3.2 微服务接入日志

3.2.1 日志打印接入

  1. 退出依赖

       <dependency>        <groupId>org.apache.skywalking</groupId>        <artifactId>apm-toolkit-logback-1.x</artifactId>        <version>8.5.0</version>    </dependency>
  2. logback日志应用grpc收集,logback.xml 片段为:

    <!-- skywalking 通过grpc采集日志 --><appender name="grpc_log_info" 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} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>        </layout>    </encoder>    <filter class="ch.qos.logback.classic.filter.LevelFilter">        <!-- 过滤的级别 -->        <level>INFO</level>        <!-- 匹配时的操作:接管(记录) -->        <onMatch>ACCEPT</onMatch>        <!-- 不匹配时的操作:回绝(不记录) -->        <onMismatch>DENY</onMismatch>    </filter></appender><appender name="grpc_log_error" 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} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>        </layout>    </encoder>    <filter class="ch.qos.logback.classic.filter.LevelFilter">        <!-- 过滤的级别 -->        <level>ERROR</level>        <!-- 匹配时的操作:接管(记录) -->        <onMatch>ACCEPT</onMatch>        <!-- 不匹配时的操作:回绝(不记录) -->        <onMismatch>DENY</onMismatch>    </filter></appender>   

    3.logback.xml残缺内容为:

    <?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="60 seconds" debug="false"><!-- 日志寄存门路 --><property name="log.path" value="/data/logs/iot-platform-gateway"/><!-- 日志输入格局 --><property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/><property name="log.pattern.traceId" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%tid] - %msg%n"/><!-- 控制台输入 --><!--    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">--><!--        <encoder>--><!--            <pattern>${log.pattern}</pattern>--><!--        </encoder>--><!--    </appender>--><appender name="console" 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>${log.pattern.traceId}</pattern>        </layout>    </encoder></appender><!-- skywalking 通过grpc采集日志 --><appender name="grpc_log_info" 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} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>        </layout>    </encoder>    <filter class="ch.qos.logback.classic.filter.LevelFilter">        <!-- 过滤的级别 -->        <level>INFO</level>        <!-- 匹配时的操作:接管(记录) -->        <onMatch>ACCEPT</onMatch>        <!-- 不匹配时的操作:回绝(不记录) -->        <onMismatch>DENY</onMismatch>    </filter></appender><appender name="grpc_log_error" 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} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>        </layout>    </encoder>    <filter class="ch.qos.logback.classic.filter.LevelFilter">        <!-- 过滤的级别 -->        <level>ERROR</level>        <!-- 匹配时的操作:接管(记录) -->        <onMatch>ACCEPT</onMatch>        <!-- 不匹配时的操作:回绝(不记录) -->        <onMismatch>DENY</onMismatch>    </filter></appender><!-- 系统日志输入 --><appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">    <file>${log.path}/info.log</file>    <!-- 循环政策:基于工夫创立日志文件 -->    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">        <!-- 日志文件名格局 -->        <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>        <!-- 日志最大的历史 60天 -->        <maxHistory>60</maxHistory>    </rollingPolicy>    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">        <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">            <pattern>${log.pattern.traceId}</pattern>        </layout>    </encoder>    <filter class="ch.qos.logback.classic.filter.LevelFilter">        <!-- 过滤的级别 -->        <level>INFO</level>        <!-- 匹配时的操作:接管(记录) -->        <onMatch>ACCEPT</onMatch>        <!-- 不匹配时的操作:回绝(不记录) -->        <onMismatch>DENY</onMismatch>    </filter></appender><appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">    <file>${log.path}/error.log</file>    <!-- 循环政策:基于工夫创立日志文件 -->    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">        <!-- 日志文件名格局 -->        <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>        <!-- 日志最大的历史 60天 -->        <maxHistory>60</maxHistory>    </rollingPolicy>    <!--        <encoder>-->    <!--            <pattern>${log.pattern}</pattern>-->    <!--        </encoder>-->    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">        <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">            <pattern>${log.pattern.traceId}</pattern>        </layout>    </encoder>    <filter class="ch.qos.logback.classic.filter.LevelFilter">        <!-- 过滤的级别 -->        <level>ERROR</level>        <!-- 匹配时的操作:接管(记录) -->        <onMatch>ACCEPT</onMatch>        <!-- 不匹配时的操作:回绝(不记录) -->        <onMismatch>DENY</onMismatch>    </filter></appender><!--只打印 dozer包下的error级别的日志 --><logger name="org.dozer" level="error" additivity="false"/><!--屏蔽 nacos包下的warn级别以上的日志 --><logger name="com.alibaba.nacos.client.naming" level="warn" additivity="false"/><!-- Spring日志级别管制  --><logger name="org.springframework" level="warn"/><root level="info">    <appender-ref ref="console"/></root><!--零碎操作日志--><root level="info">    <appender-ref ref="file_info"/>    <appender-ref ref="file_error"/>    <appender-ref ref="grpc_log_info"/>    <appender-ref ref="grpc_log_error"/></root></configuration>

4.批改agent配置文件:
skywalking/agent/config/agent.config

# Backend service addresses.collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.0.77:11800}plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:192.168.0.77}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}

3.2.2.退出对SpringCloud gateway网关的反对

将skywalking/plugins目录下的apm-spring-cloud-gateway-2.1.x-plugin-8.5.0.jar、apm-spring-cloud-gateway-2.0.x-plugin-8.5.0.jar 拷贝到skywalking/optional-plugins目录下即可

3.2.3 疏忽跟踪某项节点(url)

1.将skywalking/plugins目录下的apm-trace-ignore-plugin-8.5.0.jar 拷贝到skywalking/optional-plugins目录下
2.在skywalking/agent/config下创立apm-trace-ignore-plugin.config文件,并退出trace.ignore_path=${SW_AGENT_TRACE_IGNORE_PATH:/api-docs/**} 为例,来疏忽拜访swaggerUI的追踪

参考:https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/