一、skywalking是什么

skywalking是一个可观测性分析平台和应用性能管理系统,它也是基于OpenTracing规范、开源的AMP系统。Skywalking提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。支持Java

二、SkyWalking 分为三个核心部分:

1、Agent(探针):Agent 运行在各个服务实例中,负责采集服务实例的 Trace 、Metrics 等数据,然后通过 gRPC方式上报给SkyWalking后端。

2、OAP:SkyWalking 的后端服务,其主要责任有两个。
一个是负责接收 Agent 上报上来的 Trace、Metrics 等数据,交给 Analysis Core (涉及SkyWalkingOAP 中的多个模块)进行流式分析,最终将分析得到的结果写入持久化存储中。SkyWalking 可以使用ElasticSearch、H2、MySQL等作为其持久化存储,一般线上使用ElasticSearch 集群作为其后端存储。
另一个是负责响应 SkyWalking UI 界面发送来的查询请求,将前面持久化的数据查询出来,组成正确的响应结果返回给 UI界面进行展示。

3、UI 界面:SkyWalking 前后端进行分离,该 UI 界面负责将用户的查询操作封装为 GraphQL 请求提交给 OAP后端触发后续的查询操作,待拿到查询结果之后会在前端负责展示。

三、教程

安装agent

四、Skywalking的几大特点:

  1. 多语言自动探针,Java,.NET Core和Node.JS。
  2. 多种监控手段,语言探针和service mesh。
  3. 轻量高效。不需要额外搭建大数据平台。
  4. 模块化架构。UI、存储、集群管理多种机制可选。
  5. 支持告警。
  6. 优秀的可视化效果。

五、Open Tracing

OpenTracing中最核心的概念就是Trace

1、Trace
在广义上,一个trace代表了一个事务或者流程在(分布式)系统中的执行过程。在OpenTracing标准中,trace是多个span组成的一个有向无环图(DAG),每一个span代表trace中被命名并计时的连续性的执行片段。Trace表示一个调用链路,由全局唯一的TraceID标识。Trace由Span组成。

2、 Span
(一般)表示一个函数调用,由全局唯一的SpanID标识。Span组成的Trace实际上是一颗树结构,除了根Span外,每个Span都会有一个父Span。

Span里面的信息包括:操作的名字,开始时间和结束时间,可以附带多个 key:value 构成的 Tags(key
必须是String,value可以是 String, bool 或者数字),还可以附带 Logs 信息(不一定所有的实现都支持)
也是 key:value形式。

3、Metric和Tracing的区别
Metrics和Tracing属于开箱即用的一套API,其目的是为了监控、跟踪程序调用。下面看看二者的区别

Metric主要用来进行数据的统计,比如HTTP请求数的计算。 Metrics即度量指标。其原理是,将要监测的值记录在特定的全局变量中,然后通过HTTP的形式向外提供查询这些指标的接口,即Exporter。Prometheus会通过Exporter拉取这些数据,并存放在时序数据库中,可通过PromQL进行查询。

2、Tracing即链路跟踪。其目的是在分布式系统中,完成一个用户请求可能需要多个子系统之间的相互调用,而子系统为了实现高可用都会有多个节点,导致排查问题非常困难。Tracing相对于Metrics来说,实现会更复杂

六、启动带有agent相关的服务

通过注入agent的方式启动skywalking_mysql服务,注意skywalking_mysql要打成jar包

java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent_mysql/skywalking-agent.jar -jar skywalking_mysql.jar

让Skywalking以指定appname的方式启动skywalking_mysql,最终的结果就是我们在skywalking后台可以看到多了一个skywalking_mysql服务

java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent_mysql/skywalking-agent.jar -Dskywalking.agent.service_name=skywalking_mysql -jar skywalking_mysql.jar &

七、项目中获取traceId

<!--skywalking trace工具包-->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>${skywalking.version}</version>
</dependency>

引入这个就可以在系统中通过TraceContext.traceId() 来获取traceId,如果不引,只是在系统不能通过代码去获取,但是在skywalking也是可以采集到的。

七、排除不需要监控的端点

有的端点不需要监控,比如Swagger相关的端点,要把他排除掉:

java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar
-Dskywalking.agent.service_name=skywalking_plugins
-Dskywalking.trace.ignore_path=/exclude jar skywalking_plugins.jar &

通过命令启动服务,Dskywalking.trace.ignore_path标识不监控的url

八、告警功能

Skywalking每隔一段时间根据收集到的链路追踪的数据和配置的告警规则(如服务响应时间、服务响应时间百分比)等,判断如果达到阈值则发送相应的告警信息。发送告警信息是通过调用webhook接口完成,具体的webhook接口可以使用者自行定义,从而开发者可以在指定的webhook接口中编写各种告警方式,比如邮件、短信等。告警的信息也可以在RocketBot中查看到。

默认的告警规则配置,位于skywalking安装目录下的config文件夹下 alarm-settings.yml 文件中:

https://img-blog.csdnimg.cn/2db751d4c4de46f9b070d69ad12ecff9.png

比如定义:

  1. 最近3分钟内服务的平均响应时间超过1秒
  2. 最近2分钟服务成功率低于80%
  3. 最近3分钟90%服务响应时间超过1秒
  4. 最近2分钟内服务实例的平均响应时间超过1秒
@RestController
public class WebHooks {private List<AlarmMessage> lastList = new ArrayList<>();//产生告警时调用的接口@PostMapping("/webhook")public void webhook(@RequestBody List<AlarmMessage> alarmMessageList){lastList = alarmMessageList;}//为了方便,新增一个接口展示告警的信息接口@GetMapping("/show")public List<AlarmMessage> show(){return lastList;}
}

注意一定要书写一个url=/webhook的接口

九、搭建自己的java agent工程

public class PreMainAgent {/*** 在这个 premain 函数中,开发者可以进行对类的各种操作。* 1、agentArgs 是 premain 函数得到的程序参数,随同 “– javaagent”一起传入。与 main函数不同的是,* 这个参数是一个字符串而不是一个字符串数组,如果程序参数有多个,程序将自行解析这个字符串。* 2、Inst 是一个 java.lang.instrument.Instrumentation 的实例,由 JVM 自动传入。** java.lang.instrument.Instrumentation 是 instrument 包中定义的一个接口,也是这个包的核心部分,* 集中了其中几乎所有的功能方法,例如类定义的转换和操作等等。类中提供两个静态方法,方法名均为premain,不能拼错。在pom文件中添加打包插件:* @param agentArgs* @param inst*/public static void premain(String agentArgs, Instrumentation inst) {System.out.println("=========premain方法执行1========");System.out.println(agentArgs);}/*** 如果不存在 premain(String agentArgs, Instrumentation inst)* 则会执行 premain(String agentArgs)* @param agentArgs*/public static void premain(String agentArgs) {System.out.println("=========premain方法执行2========");System.out.println(agentArgs);}
}

类中提供两个静态方法,方法名均为premain,不能拼错。

<build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><appendAssemblyId>false</appendAssemblyId><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><!--自动添加META-INF/MANIFEST.MF --><manifest><addClasspath>true</addClasspath></manifest><manifestEntries><Premain-Class>PreMainAgent</Premain-Class><Agent-Class>PreMainAgent</Agent-Class><Can-Redefine-Classes>true</Can-Redefine-Classes><Can-Retransform-Classes>true</Can-RetransformClasses></manifestEntries></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
</build>

再把项目打包package,这样就得到一个agent的jar

在IDEA的VM options中添加代码

-javaagent:路径\java-agent-demo-1.0-SNAPSHOT.jar=HELLOAGENT

十、ByteBuddy

Byte Buddy致力于解决字节码操作和instrumentation API的复杂性。Byte Buddy提供了额外的API来生成Java agent,可以轻松的增强我们已有的代码。注意是增强代码,比如我们要统计方法调用时间,他可以通过类似于切面一样的东西增强我们的目标代码

在我们自己的agent项目中添加依赖

<dependencies><dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy</artifactId><version>1.9.2</version></dependency><dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy-agent</artifactId><version>1.9.2</version></dependency>
</dependencies>
public class PreMainAgent {public static void premain(String agentArgs, Instrumentation inst) {//创建一个转换器,转换器可以修改类的实现//ByteBuddy对java agent提供了转换器的实现,直接使用即可AgentBuilder.Transformer transformer = new AgentBuilder.Transformer() {public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule) {return builder.method(ElementMatchers.<MethodDescription>any()) // 拦截任意方法.intercept(MethodDelegation.to(MyInterceptor.class));//拦截到的方法委托给TimeInterceptor}};//Byte Buddy专门有个AgentBuilder来处理Java Agent的场景new AgentBuilder.Default().type(ElementMatchers.nameStartsWith("com.agent"))// 根据包名前缀拦截类.transform(transformer)// 拦截到的类由transformer处理.installOn(inst);}
}

先生成一个转换器,ByteBuddy提供了java agent专用的转换器。转换器的条件如下
1、实现Transformer接口利用builder对象来创建一个转换器。转换器可以配置拦截方法的格式,比如用名称,本例中拦截所有方法
2、定义一个拦截器类MyInterceptor。创建完拦截器之后可以通过Byte Buddy的AgentBuilder建造者来构建一个agent对象。AgentBuilder可以对指定的包名前缀来生效,同时需要指定转换器对象。

public class MyInterceptor {@RuntimeTypepublic static Object intercept(@Origin Method method, @SuperCall Callable<?> callable)throws Exception {long start = System.currentTimeMillis();try {//执行原方法return callable.call();} finally {//打印调用时长System.out.println(method.getName() + ":" + (System.currentTimeMillis() - start) + "ms");}}
}

MyInterceptor就是一个拦截器的实现,统计的调用的时长。参数中的method是反射出的方法对象,而callable就是调用对象,可以通过callable.call()方法来执行原方法。

链路追踪对比
https://blog.csdn.net/A123638/article/details/123117142
https://blog.csdn.net/z45351/article/details/125779241

日志采集:
https://blog.csdn.net/xiaoweite1/article/details/121865241
https://blog.csdn.net/ruocheng6/article/details/124415664

skywalking-介绍相关推荐

  1. Skywalking-01:Skywalking介绍

    Skywalking介绍 Application performance monitor tool for distributed systems, especially designed for m ...

  2. skywalking介绍

    微服务架构已经是一个很通用的系统架构,常见的技术栈如下图所示,这张架构图基本涵括了当前微服务体系下的各种技术栈,可能不同的技术栈有不同的开源实现. 链路追踪介绍 对于一个大型的几十个,几百个微服务构成 ...

  3. 开源APM系统skywalking介绍与使用

    介绍 SkyWalking 创建与2015年,提供分布式追踪功能.从5.x开始,项目进化为一个完成功能的Application Performance Management系统. 他被用于追踪.监控和 ...

  4. 测试使用skywalking_开源APM系统skywalking介绍与使用

    介绍 SkyWalking 创建与2015年,提供分布式追踪功能.从5.x开始,项目进化为一个完成功能的Application Performance Management系统. 他被用于追踪.监控和 ...

  5. 专为云原生、微服务架构而设计的链路追踪工具 【SkyWalking介绍及搭建】

    文章目录 前言. 当前企业级分布式微服务集群架构图 一. skywalking是什么 二. 为什么需要服务追踪 三 链路追踪框架对比 3.1 性能对比 四. 链路追踪的实际应用预览 4.1 捋清业务 ...

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

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

  7. 分布式链路追踪工具skywalking 介绍

    当企业应用进入分布式微服务时代,应用服务依赖会越来越多,skywalking可以很好的解决服务调用链路追踪的问题,而且基于java探针技术,基本对应用零侵入零耦合. skywalking是什么,有什么 ...

  8. 基于 Docker Compose 实践 .NET Core 的现代化架构 2:在容器中集成 Skywalking APM

    本章节代码已经上传至 https://github.com/siegrainwong/.NET-Core-with-Docker/tree/master/Part2 系列大纲 还是先介绍一下目录,这次 ...

  9. skywalking 安装_SkyWalking全链路追踪利器

    随着目前系统架构的复杂度越来越高(中台.微服务),并且线上应用的多级监控覆盖到了通讯.应用处理过程监控并且实现端到端的应用监测,线上性能故障的快速定位修复:而传统的监控分析方式已经无法满足我们的需求, ...

  10. 一文带你入坑全链路监控,skywalking

    一,APM概念介绍 APM(Application Performance Management)对应用程序性能和可用性的监控管理系统.它主要有这三个方面的内容,分别是 Logs(日志). Trace ...

最新文章

  1. python爬虫scrapy框架教程_Python爬虫教程-30-Scrapy 爬虫框架介绍
  2. 三部排序|2013年蓝桥杯B组题解析第六题-fishers
  3. aspx后台调用前台jquery_Jquery Ajax调用aspx页面方法
  4. 用java实现zip压缩
  5. java 补充日期_Java 9对可选的补充
  6. discuz x2.5 DIY模块模板语法详解
  7. 帮管客CRM客户管理系统
  8. WPF动画1---基础动画
  9. TOMCAT启动汉字乱码解决方案
  10. 对比Vector、ArrayList、LinkedList有何区别(转)
  11. dnf全部使用_DNF:1.13拍卖最后1天物价,花瓣礼箱破千万,果然人人都是黑商
  12. 揭露微信朋友圈当中出现刷票群0.01一票微信号、刷票0.01一票微信号的虚假面目
  13. Python 常用迭代函数总结
  14. BZOJ1753: [Usaco2005 qua]Who's in the Middle
  15. 记录一次服务器被入侵(恶意挖矿)的问题
  16. node节点kubelet报错 node \“xxxxx“ not found
  17. python在程序中模拟键盘鼠标操作
  18. 不要跟别人争对错,争了,对也变成错了。
  19. Dynamic ARP Inspection
  20. 计算机网络应用竞赛样题答案,计算机网络技术竞赛选拔赛试题(含答案).doc

热门文章

  1. 家用洗地机到底好不好用?家用洗地机分享
  2. C++ lock_guard 自动释放锁
  3. 【Scratch考级99图】图12-等级考试scratch绘制 正八边形
  4. 简单学JAVA-Java学习方法-费曼学习法
  5. 投资平台诚诚富众五种个人投资理财方式
  6. 买马桶哪个牌子的最好?
  7. 直播拉流设备接入阿里云
  8. php 拼团_详解在微信公众平台里实现微信拼团功能的步骤
  9. 武汉大学 遥感院 数据结构实习
  10. RocketMq 消费者