一、背景

随着微服务的越来越流行,我们服务之间的调用关系就显得越来越复杂,我们急需一个APM工具来分析系统中存在的各种性能指标问题以及调用关系。目前主流的APM工具有CATZipkinPinpoint以及SkyWalking,本文主要简单介绍一下SkyWalking的搭建。

二、SkyWalking的组成

SkyWalking主要的几个组成模块。
1、Agent 主要负责从系统中采集各种指标,链路数据,发送给 oap服务。
2、oap服务接收Agent发送过来的数据,存储,执行分析,提供查询和报警功能。
3、StorageUI负责存储数据以及查看数据。

三、使用 docker-compose 搭建一个 oap 和 ui 服务

version: '3'
services:elasticsearch7:image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0container_name: elasticsearch7restart: alwaysports:- 9023:9200environment:- discovery.type=single-node- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"- TZ=Asia/Shanghaiulimits:memlock:soft: -1hard: -1networks:- skywalkingvolumes:- elasticsearch7:/usr/share/elasticsearch/dataoap:image: apache/skywalking-oap-server:8.0.1-es7container_name: oapdepends_on:- elasticsearch7links:- elasticsearch7restart: alwaysports:- 9022:11800- 9021:12800networks:- skywalkingvolumes:- ./ext-config:/skywalking/ext-configui:image: apache/skywalking-ui:8.0.1container_name: uidepends_on:- oaplinks:- oaprestart: alwaysports:- 9020:8080environment:SW_OAP_ADDRESS: oap:12800networks:- skywalkingnetworks:skywalking:driver: bridgevolumes: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、参考文档

https://github.com/apache/skywalking/blob/master/docs/en/FAQ/Compatible-with-other-javaagent-bytecode-processing.md

九、项目源码

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实现分布式系统链路追踪相关推荐

  1. SkyWalking 微服务链路追踪

    目录 8. SkyWalking 微服务链路追踪 8.1 介绍 SkyWalking 8.2 Skywalking---服务搭建 8.3 SkyWalking---接入服务 8.3.1 windows ...

  2. Asp.Net Core使用Skywalking实现分布式链路追踪

    介绍 Skywalking 是 Apache 基金会下面的一个开源 APM 项目,是一套(APM)分布式追踪系统,提供了很多数据存储列如:Mysql,H2,Elasticsearch7 等.其中APM ...

  3. NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

    对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操作查看日志,那么,随着业务越来越复杂,企业应用也进入了分布式服务化的 ...

  4. 基于 SkyWalking 实现服务链路追踪

    https://blog.51cto.com/zero01/2463116 https://skywalking.apache.org/zh/blog/2019-03-29-introduction- ...

  5. PHP分布式链路追踪,SkyWalking:分布式架构链路追踪-SkyWalking介绍

    前面几篇文章提到了微服务相关系统的使用与搭建,在微服务架构下的问题也比较突出.正常系统下我们的每个请求都会在同一个系统中进行输出.但是在微服务架构中一个请求可能设置一到多个服务进行处理.服务之间相互依 ...

  6. skywalking前端_skywalking实现分布式系统链路追踪

    一.背景 随着微服务的越来越流行,我们服务之间的调用关系就显得越来越复杂,我们急需一个APM工具来分析系统中存在的各种性能指标问题以及调用关系.目前主流的APM工具有CAT.Zipkin.Pinpoi ...

  7. dubbo分布式系统链路追踪_zipkin

    基础知识储备 分布式跟踪的目标 一个分布式系统由若干分布式服务构成,每一个请求会经过多个业务系统并留下足迹,但是这些分散的数据对于问题排查,或是流程优化都很有限,要能做到追踪每个请求的完整链路调用,收 ...

  8. Springcloud 集成 Skywalking 实现全链路追踪

    下载链接 https://skywalking.apache.org/downloads/ 本地搭建springcloud工程,偷懒可参考gitee https://gitee.com/wangLi1 ...

  9. 在微服务框架Demo.MicroServer中添加SkyWalking+SkyApm-dotnet分布式链路追踪系统

    1.APM工具的选取 Apm监测工具很多,这里选用网上比较火的一款Skywalking. Skywalking是一个应用性能监控(APM)系统,Skywalking分为服务端Oap.管理界面UI.以及 ...

最新文章

  1. 一种新方法或让AI模型拥有“联想”力,或能识别从未见过的事物
  2. Android移动开发之【Android实战项目】DAY13-MPChart简单的折线图LineChart
  3. python编程基础是什么-Python面向对象编程基础解析(一)
  4. linux java远程调试_Visual Studio 2017 Linux远程调试(gdbserver)
  5. 删除Windows 系统快捷方式箭头 Delete Windows Shortcuct Arrows
  6. linux下php反编译apk,php反编译
  7. 2018 支付宝Java开发四面:Ngnix+MQ队列+集群+并发抢购
  8. 利用openpyxl,Python对excel读写文件
  9. 读源代码学Asp.net Ajax(一)
  10. ASP.NET FileUpload用法
  11. 高校校园网络设计与实现
  12. 3t硬盘 xp_华硕Disk Unlocker
  13. Ps学习(快速选择工具和魔棒的使用)
  14. 微信java精简版低内存_微信精简版低内存apk-微信精简版2019下载v7.0.6 安卓版-腾牛安卓网...
  15. SpringBoot-logback配置输出Json格式日志
  16. 圣斗士星矢游戏抽奖计算机怎么计算,圣斗士星矢手游最划算抽奖方式推荐
  17. 医保卡和社保卡的区别
  18. html2canvas微信头像没绘制,解决使用canvas生成含有微信头像的邀请海
  19. Sketchup 程序自动化(二)Ruby 基础、单位转换
  20. 研究生学php丢不丢人,研究生压力过大?导师给研究生朋友的一些建议

热门文章

  1. 使用share SDK实现人人网授权登录分享(1.x版本)
  2. abb阀门定位器能够较大程度的改善碟阀
  3. 123457123456#2#----com.ppGame.ShiZi43--前拼后广--shizi游戏_pp
  4. pyinstaller打包tensorflow的坑之 Importerror DLL not fined 找不到指定模块
  5. 【安全头条】谷歌因收集Android位置数据被澳大利亚罚款6000万美元
  6. Berkeley DB设计经验
  7. 快递鸟顺丰、申通物流查询类通用接口文档
  8. 恒压供水(无负压供水)全套图纸程序 西门子s7-200smart PLC 西门子触摸屏
  9. 《源泉》节选:现实是多目标折衷
  10. ROS2初级知识(6):Action服务概念