一,APM概念介绍

APM(Application Performance Management)对应用程序性能和可用性的监控管理系统。它主要有这三个方面的内容,分别是 Logs(日志)、 Traces(链路追踪)和 Metrics(报表统计)。简单描述就是通过各种探针采集并上报数据,收集关键指标,同时搭配数据展示以实现对应用程序性能管理和故障管理的系统化解决方案。

二,全链路监控特点

1,低侵入性

监控系统应尽可能减少对业务系统的侵入,保持对使用方的透明性,减少开发人员的负担,降低接入门槛和难度。
2,低性能影响
由于全链路监控系统需要对各种应用中间件进行日志数据采集,大多都需要在业务系统内进行“埋点”或放置agent,一般都是在核心业务流程。因此应尽可能降低对业务系统造成的性能影响,对CPU的耗用和内存耗用都需要有一个参考阈值。并且APM系统的故障不能影响业务系统的正常使用。
3,时效性
实时有效的监控数据展示功能,帮助相关人员理解系统行为,为流程、架构、代码优化,以及扩容缩容、服务限流降级提供正确客观的数据参考。能对系统的反常阈值进行业务告警达到及时恢复处理的目的。

三,主流的开源APM产品

CAT:是由国内美团点评开源的,基于Java语言开发,目前提供Java、C/C++、Node.js、Python、Go等语言的客户端,监控数据会全量统计,国内很多公司在用,例如美团点评、携程、拼多多等,使用的时候,需要在应用程序中埋点,对代码侵入性强。

Zipkin:由Twitter公司开发并开源,Java语言实现,侵入性相对于CAT要低一点,需要对web.xml之类的配置文件做修改,依然对代码有侵入。

Pinpoint:一个韩国团队开源的产品,运用了字节码增强技术,只需要在启动时添加启动参数即可,对代码无侵入,目前支持Java和PHP语言,底层采用HBase来存储数据,探针收集的数据粒度非常细,但是性能损耗大,因其出现的时间较长,完成度也很高。

SkyWalking:国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,跟Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持,目前增长势头强劲,社区活跃,中文文档没有语言障碍。

下面我们以SkyWalking来做全链路监控介绍

四,skywalking介绍

1,skywalking官网地址

https://skywalking.apache.org/

2,skywalking架构

SkyWalking 逻辑上分为四部分: 探针, 平台后端, 存储和用户界面.

1)探针:收集数据并重新格式化以符合SkyWalking的要求(不同的探针支持不同的来源)。

2)平台后端:支持数据聚合,分析和流处理,涵盖跟踪,指标和日志。

3)存储:是开放式的. 你可以选择一个既有的存储系统, 例如ElasticSearch,H2,MySQL,TiDB,InfluxDB, 也可以选择自己实现一个存储系统.

4)用户界面:是一个高度可定制的基于Web的界面,允许SkyWalking最终用户可视化和管理SkyWalking数据。

五,SkyWalking实战

1,skywalking版本

apache-skywalking-apm-es7-8.4.0

启动skywalking

进入下载的skywalking,这里以window版本为例子,然后进入bin目录,双击startup.bat启动

稍等一会启动成功后,访问管理台地址,默认8080端口

http://127.0.0.1:8080/

整体界面如下

2,整合skywalking,以spirngboot为例,引入以下两个jar

<!-- logback日志依赖--><dependency>    <groupId>org.apache.skywalking</groupId>    <artifactId>apm-toolkit-logback-1.x</artifactId>    <version>8.4.0</version></dependency><!--手工日志打点依赖--><dependency>    <groupId>org.apache.skywalking</groupId>    <artifactId>apm-toolkit-trace</artifactId>    <version>8.4.0</version></dependency>

3,与日志整合

这里以logback为例,%tid 就是skywalking ,链路id的占位符​​​​​​

<?xml version="1.0" encoding="UTF-8"?><configuration>    <property name="LOG_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss} | %highlight(%-5level) | %boldYellow(%tid) | %boldYellow(%thread) | %boldGreen(%logger) | %msg%n"/>    <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.TraceIdPatternLogbackLayout">                <pattern>${LOG_PATTERN}</pattern>            </layout>        </encoder>    </appender>
    <root level="INFO">        <appender-ref ref="STDOUT"/>    </root></configuration>

4,探针数据采集

agent包在下载的skywalking这个目录下

\apache-skywalking-apm-bin-es7\agent

javaagent方式,在springboot项目启动参数加入agent启动项目

-javaagent:D:\apache-skywalking-apm-es7-8.4.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar-Dskywalking.agent.service_name=my-service-Dskywalking.collector.backend_service=127.0.0.1:11800

-javaagent:skywalking的agent包位置

-Dskywalking.agent.service_name:应用上报的服务名称

-Dskywalking.collector.backend_service:skywalking接收agent发送采集数据的服务及端口

项目日志打印效果显示示例

到此,我们整合skywalking基本ok,可以监控应用的所有web请求。

但是skwalking目前的版本对异步线程和相关一些中间件的链路监控是无法通过agent方式把链路统一串联起来。所以下文继续介绍相关解决方案。

5,获取全局链路id

//代码中任何位置直接使用这个类获取当前线程的链路idTraceContext.traceId();

6,异步线程链路打点

异步线程链路监控需要手工打点,这里有两种方式。一种是使用skywalking提供的包装类,RunnableWrapper和CallableWrapper。另一种是使用skywalking提供的注解TraceCrossThread.实际上我们看源代码可以知道RunnableWrapper和CallableWrapper实际上也是用注解TraceCrossThread来实现。以下是使用的代码示例。

//执行Runnable任务  public static void addTask(Runnable task) {      taskExecutor.execute(RunnableWrapper.of(task));  }
  //Callable任务  public static Future addReturnedTask(Callable task){      return taskExecutor.submit(CallableWrapper.of(task));  }
  @TraceCrossThread  public class MyRunnableClass implements Runnable{      @Override      public void run() {      }  }

7,相关中间件链路打点

对于rabbitmq和xxjob等中间件的链接监控,实际上目前版本的skywalking无法将链路串联起来。这个时候,我们可以用skywalking提供的注解@Trace,将方法的链路串联起来,间接达到对中间件链路监控的目的。

以下是rabbitmq消费者使用示例

  @Trace  @RabbitListener(queues = RabbitMqConfig.QUEUE_A)  public void process(String content) {      log.info("接收处理队列A当中的消息:" + content);  }

rabbitmq消费者链路显示示例

8,常用用户界面​​​​​​​

1)链路监控

通过日志打印的traceId或者请求路径,或者方法名进行快速定位链路

实际工作中用得最多。

2)cpu和内存和jvm等

3)全链路拓扑图

因笔者只启动了一个服务,所以看起来非常单调。

最后说一句

感谢您的阅读,您的正反馈是我持续创作的动力,十分期待欢迎您的关注!

一文带你入坑全链路监控,skywalking相关推荐

  1. skywalking 安装_如何使用skywalking 进行全链路监控

    本文涉及内容 skywalking 全链路监控 skywalking 的参数配置 skywalking UI 监控视角与指标介绍 一些很有用的点 skywalking 全链路监控 下图是我从网上找到的 ...

  2. cat全链路监控_全链路监控选型

    实现全链路监控 SkyWalking SkyWalking是apache基金会下面的一个开源APM项目,为微服务架构和云原生架构系统设计.它通过探针自动收集所需的指标,并进行分布式追踪.通过这些调用链 ...

  3. 一文搞懂全链路监控:方案概述与比较!

    作者:陶邦仁 https://www.jianshu.com/p/92a12de11f18 0 - 问题背景 随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应 ...

  4. 一文搞懂全链路监控:方案概述与比较 | 干货

    原文标题为<全链路监控(一):方案概述与比较>,作者陶邦仁,链接:https://www.jianshu.com/p/92a12de11f18 0 - 问题背景 随着微服务架构的流行,服务 ...

  5. 全链路监控细节和难点剖析!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料!原文 | https://www.jianshu.com/p ...

  6. 主流微服务全链路监控系统之战

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料!问题背景随着微服务架构的流行,服务按照不同的维度进行拆分,一次 ...

  7. 实现一个全链路监控平台很难吗?Pinpoint、skywalking、zipkin,哪个实现比较好?...

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往 ...

  8. 实现一个全链路监控平台很难吗?一点都不难。。。

    0 问题背景 随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发.可能使用不同的编程语言来实现 ...

  9. cat全链路监控_谛听全链路监控平台实践与思考

    一.项目背景 近几年,信也科技的研发技术伴随着业务的快速增长逐步演化为微服务化的分布式体系架构,但随之带来的系统间的上下游依赖关系的复杂度也呈指数级上升,已有的烟囱式的监控产品(CAT.ELK等)存在 ...

最新文章

  1. Android 5.0新特性之沉浸式状态栏
  2. 组队学习:学习者参考手册
  3. 算法导论2-9章补充几道题
  4. 【paddlepaddle速成】paddlepaddle图像分类从模型自定义到测试
  5. c语言形考作业1答案,c语言程序设计形考任务二答案.doc
  6. 解决datagrid单元格不能设置100%问题
  7. Bitcoin比特币与BlockChain区块链技术
  8. 6号板编译失败找不到arm-none-linux-gnueabi-gcc
  9. bkg bnc_BNC的完整形式是什么?
  10. Server 2012 Log off 按键
  11. 使用 Jupyter Notebook
  12. [经验] 三星I9300recovery中文版基于CWM 6.0.1.2,支持挂载U盘
  13. 拉格朗日松弛算法(一)——论文阅读笔记
  14. 2022最新7个开源Kubernetes(k8s)开发工具
  15. python主线程执行_python多线程学习一
  16. 揭秘如何搭建梦幻西游社交框架
  17. 《财务自由之路I》阅读笔记2021-03-16
  18. UNIX网络编程:卷2-读书笔记
  19. 服务器装系统提示获取分区失败,u盘装系统时获取硬盘分区失败怎么办
  20. 穷人冲冲冲:7个有钱人买,穷人不买的东西

热门文章

  1. iOS中分类(category)和类扩展(Extension)的区别
  2. 阿里云ECS使用指南
  3. 19、Jetson Xavier NX使用yolov5对比GPU模型下的pt、onnx、engine 、 DeepStream 加速性能
  4. 一剑开尘走龙蛇 XGBoost
  5. 安卓机如果相册不选图片就退出_微商相册如何在「多台设备登录」?
  6. springcloud分布式配置中心(二)-阿波罗apollo
  7. 云服务显示服务器异常,云服务器显示异常登录
  8. 学习php开发难吗,PHP开发自学难吗,PHP自学要多长时间?
  9. windows硬盘数据安全处理工具
  10. 在godot的canvas_item着色器中构建逆投影矩阵和逆视图矩阵