• 分布式服务调用链路追踪——Skywalking


    SkyWalking是什么?

    SkyWalking是一个可观测性分析平台和应用性能管理系统,提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案,并支持多种开发语言。

    官网:http://skywalking.apache.org/

    特点:

    SkyWalking 架构

    说明:

    SkyWalking 的核心是数据分析和度量结果的存储平台,通过 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量数据,

    SkyWalking Collecter 对数据进行分析和聚合,存储到 Elasticsearch、H2、MySQL、TiDB 等其一即可,最后我们可以通过 SkyWalking UI 的可视化界面对最终的结果进行查看。

    Skywalking 支持从多个来源和多种格式收集数据:多种语言的 Skywalking Agent 、Zipkin v1/v2 、Istio 勘测、Envoy 度量等数据格式。

    整体架构看似模块有点多,但在实际上还是比较清晰的,主要就是通过收集各种格式的数据进行存储,然后展示。

    所以搭建 Skywalking 服务我们需要关注的是 SkyWalking Collecter、SkyWalking UI 和 存储设备,SkyWalking Collecter、SkyWalking UI 官方下载安装包内已包含,最终我们只需考虑存储设备即可。

    安装部署

    • 下载

    SkyWalking支持单机与集群部署(默认standalone),并支持多种数据存储(默认H2),如mysql,Elasticsearch,Elasticsearch7等。

    本文以SkyWalking8.4.0并使用Elasticsearch来存储数据进行讲解,ElasticSearch搭建请参考我的另外一篇文章。

    SkyWalking下载地址:http://skywalking.apache.org/downloads/

    由于要使用Elasticsearch,下载的时候请注意选择:

    根据不同版本,点击tar后选择一个地址即可开始下载:

    相关操作命令如下:

    mkdir -p /opt/soft/skywalking
    cd /opt/soft/skywalking
    wget https://mirrors.tuna.tsinghua.edu.cn/apache/skywalking/8.4.0/apache-skywalking-apm-es7-8.4.0.tar.gz
    tar -xvf apache-skywalking-apm-es7-8.4.0.tar.gz
    cd apache-skywalking-apm-bin-es7/
    • 配置

    1.web访问端口 8080 -> 18080 (本机8080已被其它服务占用)

    vim /opt/soft/skywalking/apache-skywalking-apm-bin-es7/webapp/webapp.yml
    #将server.port: 8080 改为18080

    2.修改使用Elasticsearch(默认使用h2)

    注意:nameSpace要和Elasticsearch集群的cluster_name一致.

    • 启动

    在启动 SkyWalking 之前,确保 Elasticsearch 已启动。

    SkyWalking 的启动包括两部分,一个是 SkyWalking Collector(oapService) ,一个是 SkyWalking UI(webappService),SkyWalking 解压后的 bin 目录:

    我们可以分别启动 oapService 和 webappService,也可以通过 startup 一次性全部启动。

    /opt/soft/skywalking/apache-skywalking-apm-bin-es7/bin/startup.sh

    确认应用启动成功端口正常监听:

    如果出错可以查看日志并根据错误类型进行处理:

    • 验证

    启动成功后,打开浏览器进行查看。ip地址:38080

    注:一开始是没数据的,待项目集成后再刷新页面就可以看到数据了。

    项目集成

    1. 将skywalking主目录下的agent目录,拷贝到各服务所在机器上用作探针:

    scp -r /opt/soft/skywalking/apache-skywalking-apm-bin-es7/agent chengjs@192.168.100.12:/opt/skywalking/

    2. 修改 agent/config/agent.config 配置文件,也可以通过命令行参数指定。

    主要是配置服务名称和后端服务地址:

    # 服务名称
    agent.service_name=${SW_AGENT_NAME:user-center}
    # 采集信息的服务地址
    collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.100.12:11800}

    当然,也可以在启动的时候通过环境变量来设置,例如:

    -Dskywalking.agent.service_name=masl
    -Dskywalking.collector.backend_service=XXX.XXX.XXX.XXX:11800
    #skywalking.agent.service_name 服务名称
    #skywalking.collector.backend_service 采集信息的服务地址 agent.config配置了就可以不用指定

    3. 最后,在服务启动的时候用相关命令行参数来指定探针:

    • Linux Tomcat

    修改 tomcat/bin/catalina.sh,在首行加入如下信息:

    CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/skywalking/agent/skywalking-agent.jar"; export CATALINA_OPTS
    • JAR file

    在启动你的应用程序的命令行中添加 -javaagent 参数. 并确保在-jar参数之前添加它. 例如:

    java -javaagent:/opt/skywalking/agent/skywalking-agent.jar -jar yourApp.jar

    java -javaagent:/opt/skywalking/agent/skywalking-agent.jar 
         -Dskywalking.agent.service_name=masl
         -Dskywalking.collector.backend_service=XXX.XXX.XXX.XXX:11800 
         -jar yourApp.jar
    • IDEA
    -javaagent:D:softapache-skywalking-apm-bin-es7agentskywalking-agent.jar -Dskywalking.agent.service_name=masl -Dskywalking.collector.backend_service=172.16.10.63:11800

    4. 访问应用中服务后访问skywalking UI界面查看相应信息:

    其它

    • 日志输出TraceId

    1. pom添加依赖项:

    <!--打印skywalking的TraceId到日志-->
    <dependency>
        <groupId>org.apache.skywalking</groupId>
        <artifactId>apm-toolkit-logback-1.x</artifactId>
        <version>8.4.0</version>
    </dependency>

    2. logback日志layout使用 org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout,通过%tid输出trace-id%tid必须小写):

        <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>
                        %black(%d{ISO8601}) [%tid] %highlight(${LOG_LEVEL_PATTERN:-%5p}) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
                    </Pattern>
                </layout>
            </encoder>
        </appender>

    3. 访问相关请求,输出日志如下:

    • 将方法加入链路跟踪

    业务代码中未被跟踪的方法,如果需要跟踪,则:

    1. pom添加依赖项:

    <dependency>
        <groupId>org.apache.skywalking</groupId>
        <artifactId>apm-toolkit-trace</artifactId>
        <version>8.4.0</version>
    </dependency>

    2. 在方法上添加@Trace注解:

    SkyWalking通过AOP实现跟踪,静态方法添加@Trace无效,只能用于实例方法;
    • Span中添加自定义Tag

    链路跟踪只记录方法名,不记录参数值,可通过代码添加,在当前span上添加tag(必须是被SkyWalking跟踪的方法):

    ActiveSpan.tag("account", account);
    ActiveSpan.tag("userId", String.valueOf(userId));

    链路跟踪中即查看tag名称和值:

    • 记录SQL语句参数值

    agentconfigagent.config文件中将plugin.mysql.trace_sql_parameters设为true

    • 自动收集日志

    1、skywalking8.4.0版本开始才支持收集日志功能,同时pom需引用以下依赖(version对应skywalking的版本):

    <dependency>
        <groupId>org.apache.skywalking</groupId>
        <artifactId>apm-toolkit-trace</artifactId>
        <version>8.4.0</version>
    </dependency>

    2、配置应用中的logback-spring.xml 文件:

    <appender name="skywalking-grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"></appender>

    同时要开启日志,且你要输出日志到文件中,grpc是利用本地日志去上传的:

    <root level="info">
        <appender-ref ref="skywalking-grpc-log" />
    </root>

    3、打开你的agent/config/agent.config配置文件,添加如下配置信息,注意skywalking的log通信用的grpc:

    # 指定要向其报告日志数据的grpc服务器的主机
    plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:172.16.10.63}
    # 指定要向其报告日志数据的grpc服务器的端口 plugin.toolkit.log.grpc.reporter.server_port
    =${SW_GRPC_LOG_SERVER_PORT:11800}
    # 指定grpc客户端要报告的日志数据的最大大小 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}

    注:gRPC报告程序可以将收集到的日志转发到SkyWalking OAP服务器或SkyWalking Satellite卫星。

    4、然后就可以在你的UI界面上看到:

    功能介绍

    这里先着重介绍下 SkyWalking 中最重要的三个概念:

    • 服务(Service) : 表示对请求提供相同行为的一系列或一组工作负载。在使用 Agent 或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 将会使用应用名称上定义的名字。
    • 服务实例(Service Instance) : 上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样, 服务实例未必就是操作系统上的一个进程。但当你在使用 Agent 的时候, 一个服务实例实际就是操作系统上的一个真实进程。
    • 端点(Endpoint) : 对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。

    仪表盘

    • 仪表盘布局

     skywalking仪表盘分为服务、端点、实例的性能监控。大致结构如下(展示的图表可以自定义):

    • 服务视角

    服务视角有以下的监控数据,可以自定义监视数据图表的展示:

    • 实例视角

    实例仪表盘分析了JVM相关的图表和请求响应相关的图表,可以直观的看到请求或者服务占用等情况。

    • 端点视角

    端点仪表盘展示了每个端点的请求响应情况以及延时情况。在端点可以看到影响性能的端点名称等。

    拓补图

    拓补图可以看到整个微服务的相互作用关系,可以看到整个调用链的大致结构,以及服务的类型。方便开发者理解整个系统的架构。

    拓补图可以大致的看出某个服务的运行情况,也可以点击服务相关内容查看详细信息。在每个调用链上也展示了请求数和延时情况等信息,方便查看者对服务情况大体的了解。

    拓补图内容如下:

    追踪

    skywalking链路追踪可以收集整个服务的调用链,以及调用情况,执行情况,和参数等。

    蓝色为调用成功的链路,点击列表可展示链路具体的调用信息,查看耗时,参数,执行情况等,方便对链路进行分析。

    性能分析

    skywalking的性能分析,在根据服务名称、端点名称,以及相应的规则建立了任务列表后,在调用了此任务列表的端点后。skywalking会自动记录,剖析当前端口,生成剖析结果,具体流程如图:

    skywalking告警

    • 配置

    skywalking告警的配置文件如图:

     在skywalking目录的config目录下的alarm-setings.yml文件中进行配置:

    •  配置规则

    具体规格参考:

    中文文档:https://github.com/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/setup/backend/backend-alarm.md

    英文文档:https://github.com/apache/skywalking/blob/v8.0.1/docs/en/setup/backend/backend-alarm.md

    • 动态规则

    skywalking可以设置动态规则,可以配合nacos或者Zookeeper实现。

     

  • 相关阅读:
    Daily Scrumming* 2015.12.19(Day 11)
    Daily Scrumming* 2015.12.18(Day 10)
    软件工程 个人作业1
    网络1711-12&信管1711-12 图 作业评分
    网络1711-12 数据结构第一次作业评分
    Java课程设计
    网络1711-1712班 c 语言评分总表一览
    网络1711班 C语言第八次作业批改总结
    201621123050 《Java程序设计》第14周学习总结
    201621123050 《Java程序设计》第13周学习总结
  • 原文地址:https://www.cnblogs.com/caoweixiong/p/14486450.html
Copyright © 2020-2023  润新知