skywalking实现分布式系统链路追踪
一、背景
随着微服务的越来越流行,我们服务之间的调用关系就显得越来越复杂,我们急需一个APM工具来分析系统中存在的各种性能指标问题以及调用关系。目前主流的APM工具有CAT、Zipkin、Pinpoint以及SkyWalking,本文主要简单介绍一下SkyWalking的搭建。
二、SkyWalking的组成
SkyWalking主要的几个组成模块。
 1、Agent 主要负责从系统中采集各种指标,链路数据,发送给 oap服务。
 2、oap服务接收Agent发送过来的数据,存储,执行分析,提供查询和报警功能。
 3、Storage和UI负责存储数据以及查看数据。
三、使用 docker-compose 搭建一个 oap 和 ui 服务
version: '3'
services:
  elasticsearch7:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0
    container_name: elasticsearch7
    restart: always
    ports:
      - 9023:9200
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - TZ=Asia/Shanghai
    ulimits:
      memlock:
        soft: -1
        hard: -1
    networks:
      - skywalking
    volumes:
      - elasticsearch7:/usr/share/elasticsearch/data
  oap:
    image: apache/skywalking-oap-server:8.0.1-es7
    container_name: oap
    depends_on:
      - elasticsearch7
    links:
      - elasticsearch7
    restart: always
    ports:
      - 9022:11800
      - 9021:12800
    networks:
      - skywalking
    volumes:
      - ./ext-config:/skywalking/ext-config
  ui:
    image: apache/skywalking-ui:8.0.1
    container_name: ui
    depends_on:
      - oap
    links:
      - oap
    restart: always
    ports:
      - 9020:8080
    environment:
      SW_OAP_ADDRESS: oap:12800
    networks:
      - skywalking
networks:
  skywalking:
    driver: bridge
volumes:
  elasticsearch7:
    driver: local
1、docker-compose文件的目录
skywalking
├── ext-config
│   └── application.yml
├── ext-libs
├── skywalking.yml
└── temp.txt
2、访问
http://localhost:9020
3、注意事项
1、如果我们想覆盖oap镜像中的/skywalking/config 目录下的配置文件,我们可以在 docker 中挂载一个/skywalking/ext-config目录,将配置文件丢到此目录中即可。
 2、如果我们想覆盖oap镜像中的/skywalking/oap-libs 目录下的jar,我们可以在 docker 中挂载一个/skywalking/ext-libs目录,将新的jar包丢到此目录中即可,但是已经存在的jar包无法被覆盖。
 3、使用的版本是 8.0.1,数据持久化到 es7 中
四、全局日志追踪 traceId 的使用
方案一:
1、引入依赖
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>8.0.1</version>
</dependency>
2、修改 logback.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- Logback Configuration.  -->
<configuration debug="false">
    <!-- ConsoleAppender:把日志输出到控制台 -->
    <appender name="STDOUT" 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.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern><![CDATA[
%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} [%X{tid}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
            ]]></Pattern>
            </layout>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>
方案二
参考如下链接 https://github.com/apache/skywalking/blob/master/docs/en/setup/service-agent/java-agent/Application-toolkit-trace.md
五、idea 或 jar 中使用
使用如下命令,需要折成一行
java
-javaagent:(agentjar包的位置)(eg: /Users/huan/soft/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar )
-Dskywalking.agent.service_name=xxxxx-service
-Dskywalking.collector.backend_service=127.0.0.1:9022  -jar xxxx.jar
-javaagent 指定 agent jar 包的位置
 -Dskywalking.agent.service_name 指定服务名
 -Dskywalking.collector.backend_service 指定 oap 服务的地址
 
六、skywalking的目录解释
apache-skywalking-apm-bin-es7
├── LICENSE
├── NOTICE
├── README.txt
├── agent
						├── activations
					  ├── bootstrap-plugins
					  ├── config   -- agent 的配置文件,比如我们上一步使用 -Dskywalking.agent.service_name配置的这些
					  ├── logs
					  ├── optional-plugins     可选插件      (将optional-plugins目录的jar包放到 plugins 目录下即可启动这些插件)
					  ├── plugins                     启用的插件
					 └── skywalking-agent.jar  我们自己的服务需要使用 -javaagent 指定到这个jar的位置
├── bin          oap/ui 的启动脚本
├── config    配置文件
├── licenses
├── oap-libs
├── tools
└── webapp   ui界面
七、访问 skywalking 的界面

八、实战
1、忽略某些url不被追踪
1、第一步将 apm-trace-ignore-plugin-8.0.1.jar 从optional-plugins 移动到 plugins 目录中
2、配置忽略url
方法一: 在 agent/config 目录下创建 apm-trace-ignore-plugin.config文件
trace.ignore_path=${SW_AGENT_TRACE_IGNORE_PATH:需要忽略的url}
eg:trace.ignore_path=${SW_AGENT_TRACE_IGNORE_PATH:/xxx/**}
方法二: 直接使用环境变量
 -Dskywalking.trace.ignore_path=需要忽略的url路径
注意:
 1、忽略路径是支持 ant 风格的。
 2、忽略多个url使用英文的逗号分隔。
2、追踪子线程的信息
1、引入依赖
<dependency>
		<groupId>org.apache.skywalking</groupId>
		<artifactId>apm-toolkit-trace</artifactId>
		<version>8.0.1</version>
</dependency>
2、使用@TraceCrossThread注解或使用SupplierWrapper/RunnableWrapper/TraceCrossThread
@GetMapping("tractThread")
    public String tractThread() {
        log.info("准备自己线程信息");
        new Thread(RunnableWrapper.of(() -> log.info("子线程的信息"))).start();
        return "trace thread";
    }
此处演示RunnableWrapper.of包装Runnable线程。
 
3、如果某个方法SkyWalking没有追踪,但是想追踪并输出一些额外的tag信息等
1、引入依赖
<dependency>
		<groupId>org.apache.skywalking</groupId>
		<artifactId>apm-toolkit-trace</artifactId>
		<version>8.0.1</version>
</dependency>
2、自己想加入的方法使用 @Trace 注解修饰
@GetMapping("tractAnnotation")
    public User traceAnnotation(
            @RequestParam("name") String name
    ) {
        log.info("从前端接收到的参数:[{}]", name);
        User user = trace(name);
        ActiveSpan.tag("new-tag", user.toString());
        ActiveSpan.info("输出信息");
        log.info("tractId:[{}]", TraceContext.traceId());
        return user;
    }
    @Trace(operationName = "添加自定义的方法")
    @Tags({
            @Tag(key = "从方法参数中获取值", value = "arg[0]"),
            @Tag(key = "从返回值中获取值", value = "returnedObj.name")
    })
    private User trace(String name) {
        log.info("如果此方法没有被SkyWalking收集,但是又需要被收集到,可以加上@Trace注解");
        User user = new User();
        user.setName("创建的名字");
        return user;
    }
4、自定义显示服务实例
默认服务实例的名字是 uuid@hostname,这个在某些时候不一定好区分,因为我们希望自定义一个 instanceName 名字
1、默认的实现

2、自定义实现
使用 -Dskywalking.agent.instance_name=自定义的服务名即可。
 
5、配置记录的过期时间

 修改 application.yml 配置文件中的信息。
6、和其它agent使用时候的处理
1、问题
当我们和其它的agent一起使用时,比如Arthas,其它的agent可能工作的不是那么好。
2、解决方案
jar程序启动命令增加如下JVM参数
-Dskywalking.agent.is_cache_enhanced_class=true -Dskywalking.agent.class_cache_mode=MEMORY
3、参考文档
九、项目源码
docker-compose.yml文件 https://gitee.com/huan1993/configuration/blob/master/docker/compose/skywalking/skywalking.yml
 java代码 https://gitee.com/huan1993/skywalking
十、参考链接
SkyWalking官网 http://skywalking.apache.org/zh/
 SkyWalking的docker github地址 https://github.com/apache/skywalking-docker
 elasticsearch https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docker.html
 skywalking中文文档 https://skyapm.github.io/document-cn-translation-of-skywalking/
 agent config https://github.com/apache/skywalking/blob/v8.0.1/docs/en/setup/service-agent/java-agent/README.md#table-of-agent-configuration-properties
 skywalking和其它agent一起使用的处理
skywalking实现分布式系统链路追踪的更多相关文章
- SkyWalking+SkyApm-dotnet分布式链路追踪系统
		
SkyWalking+SkyApm-dotnet分布式链路追踪系统 对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操 ...
 - NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享
		
对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操作查看日志,那么,随着业务越来越复杂,企业应用也进入了分布式服务化的 ...
 - 在微服务框架Demo.MicroServer中添加SkyWalking+SkyApm-dotnet分布式链路追踪系统
		
1.APM工具的选取 Apm监测工具很多,这里选用网上比较火的一款Skywalking. Skywalking是一个应用性能监控(APM)系统,Skywalking分为服务端Oap.管理界面UI.以及 ...
 - 全链路追踪技术选型:pinpoint vs skywalking
		
目前分布式链路追踪系统基本都是根据谷歌的<Dapper大规模分布式系统的跟踪系统>这篇论文发展而来,主流的有zipkin,pinpoint,skywalking,cat,jaeger等. ...
 - 分布式链路追踪体验-skywalking入门使用
		
背景 旁友,你的线上服务是不是偶尔来个超时,或者突然抖动一下,造成用户一堆反馈投诉.然后你费了九牛二虎之力,查了一圈圈代码和日志才总算定位到问题原因了.或者公司内部有链路追踪系统,虽然可以很轻松地通过 ...
 - SkyWalking分布式链路追踪和监控-项目实战
		
微服务框架落地后,分布式部署架构带来的问题就会迅速凸显出来.服务之间的相互调用过程中,如果业务出现错误或者异常,如何快速定位问题?如何跟踪业务调用链路?如何分析解决业务瓶颈?本专栏将引入Skywalk ...
 - 在spring boot中三分钟上手apache顶级分布式链路追踪系统skywalking
		
原文:https://juejin.im/post/5cd10e81e51d453b560f2d53 skywalking在apache里全票通过成为了apache顶级链路追踪系统 项目地址:gith ...
 - 使用Skywalking分布式链路追踪系统
		
使用Skywalking分布式链路追踪系统 https://www.cnblogs.com/sunyuliang/p/11424848.html 当我们用很多服务时,各个服务间的调用关系是怎么样的?各 ...
 - skywalking与pinpoint全链路追踪方案对比
		
由于公司目前有200多微服务,微服务之间的调用关系错综复杂,调用关系人工维护基本不可能实现,需要调研一套全链路追踪方案,初步调研之后选取了skywalking和pinpoint进行对比; 选取skyw ...
 
随机推荐
- Linux proc文件系统小记
			
序言: 当linux系统存在多个网口时(也可以是一个网口配置两个IP),每个网口配置不同的IP地址,并且分别连接到不同的电脑上,电脑分别配置与相连的网口统一网段的IP且将电脑网关设置为linux的网口 ...
 - JS010. 三元运算符扩展运用(多层判断语句 / 多条表达式)
			
MDN - 三元运算符 语法 Condition ? exprIfTrue : exprIfFalse 用例: function getFee(isMember) { return(isMember ...
 - C# 获得当前方法 和 方法调用链 的 方法
			
一个获得方法名的方法,depth表示调用此方法的回溯深度. 比如,A方法调用B方法,B方法调用GetCurrentMethodFullName(2),那么得到的结果是A方法的全名(namespace+ ...
 - CodeForce-797C  Minimal string(贪心模拟)
			
Minimal string CodeForces - 797C Petya 收到一个长度不超过 105 的字符串 s.他拿了两个额外的空字符串 t 和 u 并决定玩一个游戏.这个游戏有两种合法操作: ...
 - POJ1321——棋盘问题
			
http://poj.org/problem?id=1321 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解 ...
 - pymysql基础教程
			
pymysql基础教程 1.下载pymysql 在命令框输入指令即可 pip install pymysql 2.连接pymysql 连接数据库: import pymysql conn = pymy ...
 - 利用滴答定时器(SysTick)实现简单的延时函数
			
预备知识: 对标准库来说,如果定义了时钟频率,则系统会默认初始化该时钟频率. SysTick是CM4的内核外设,是一个24位的向下递减计数器,每次计数时间是1/SYSCLK,即1/168000000. ...
 - 【PHP数据结构】其它排序:简单选择、桶排序
			
这是我们算法正式文章系列的最后一篇文章了,关于排序的知识我们学习了很多,包括常见的冒泡和快排,也学习过了不太常见的简单插入和希尔排序.既然今天这是最后一篇文章,也是排序相关的最后一篇,那我们就来轻松一 ...
 - 在PHP中如何为匿名函数指定this?
			
在之前的文章中,我们已经学习过匿名函数的使用,没有看过的小伙伴可以进入传送门先去了解下闭包匿名函数的用法,传送:还不知道PHP有闭包?那你真OUT了. 关于闭包匿名函数,在JS中有个很典型的问题就是要 ...
 - JS HTML5仿微信朋友圈特效
			
完美! 图片相册翻页可定位在第几张,右上角可关闭. 源代码下载地址: 链接: https://pan.baidu.com/s/1o7PA7wu 密码: asyt