分布式链路追踪系统Skywalking的部署和应用

一,背景

随着业务的扩张, 系统变得越来越复杂, 由前端、app、api,微服务,数据库,缓存,消息队列,关系数据库, 列式数据库等构成了繁杂的分布式网络. 当出现一个调用失败的问题时,要定位异常在哪个服务,需要进入每一个服务里看日志, 这个过程的复杂度和工作量是不可想象的。

​    当讲到大型微服务系统时, 下面这张图经常被引用到。

为了解决故障定位难,链路梳理难,容量预估难的问题, 一般引入APM体系统来解决, 而链路追踪则是APM中尤为重要的一环。
有了链路追踪, 我们可以做到:

  1. 请求链路追踪,故障快速定位: 可以通过调用链路并结合业务日志快速定位问题所在;
  2. 可视化: 展示各阶段耗时, 进行性能瓶颈分析;
  3. 应用拓扑: 梳理服务依赖关系并加以优化;
  4. 数据分析:  汇总分析用户的行为路径。


二,术语

APM: 应用系统的实时监控,用于实现性能管理和故障管理
Dapper:  google一篇论文里提到, 主要详谈分布式跟踪服务的设计
prometheus: 服务监控系统
grafana:度量分析和可视化工具
zipkin:分布式的跟踪系统
cat: 大众点评开发的实时应用监控平台
skywalking:Apache顶级项目的链路跟踪系统
ELK:Elasticsearch、Logstash和Kibana三大开源框架
EFK:elasticsearch、filebeat和kibana
Filebeat:golang实现的日志采集器

三,APM主要解决的问题

  1. Metrics集中式度量系统 (prometheus+grafana),用于可聚合的数据
  2. Tracing分布式全链接追踪系统 (zipkin,cat,skywalking等),用于请求范围内的信息
  3. Loging集中日志系统 (ELK, EFK, Filebeat+ELK),用于记录离散的事件

三者有相互重叠的部分


四,技术选型

阿里的鹰眼, 点评的cat:闭源或侵入式
zipkin:可视化方面做得太简单
这个三个框架从技术选型上排除掉。下面主要从pinpoint和skywalking这两个作对对比
 

对比项PinpointSkywalking
opentracing
协议thriftgRPC
存储hbase+mysqles,mysql,h2,tidb
ui丰富度一般
代码侵入式
性能损耗
部署难度

通过对比可以看到,Pinpoint和Skywalking不相上下,各有优劣,从界面、操作,集成方式来说,Pinpoint更好,  不过因为种种不得已的原因,我们今天还是聚焦在Skywalking上,它的优点是部署难度低,监控范围广、维度多,对代码侵入少,系统性能损失低,还支持接入 ELK 进行存储展示。

其他限制
1.只支持已知的代理,如果使用的中间件还未被支持,需要自己写插件。
2.跨线程的场景不支持自动代理,比如任务分配,任务池,批处理的场景。

五,skywalking原理

什么是span
下图描述的是树结构的Span集合,表示一次完整的跟踪,从请求到服务器开始,服务器返回response结束,跟踪每次rpc调用的耗时,存在唯一标识trace_id。

什么是skywalking

  • 客户端是通过Agent,与Collector相连接,然后Collector将数据存储在Es中。
  • 监控页面是连接的Collector,Collector从Es中将数据查询出来。
  • 直接和数据打交道的是Collector。


六,部署

1, 部署elk

docker run -dit --name elk \
    -p 5601:5601 \
    -p 9200:9200 \
    -p 5044:5044 \
    -v /data/elk-data:/var/lib/elasticsearch \
    -v /etc/localtime:/etc/localtime \
    sebp/elk:700

2,安装Skywalking server 


docker run --name oap --restart always -d \
-e TZ=Asia/Shanghai \
-p 12800:12800 \
-p 11800:11800 \
--link elk:es7 \
-e SW_STORAGE=elasticsearch7 \
-e SW_STORAGE_ES_CLUSTER_NODES=es7:9200 \
apache/skywalking-oap-server:8.2.0-es7

docker run -d --restart always --name skywalking-ui \
-e TZ=Asia/Shanghai \
-p 18080:8080 \
--link oap:oap \
-e SW_OAP_ADDRESS=oap:12800 \
apache/skywalking-ui:8.2.0

访问地址:http://服务器IP/18080

七,无侵入跟踪采集

注意:Skywalking并不是无侵入的,只是可以用无侵入这种来用,实际上要用traceId查询的话,还是要侵入代码,这是它不安全的地方!!!

1,如果是准备用无侵入的方式接入采集的话,agent-jar包所在的下载地址

1, 下载:wget  https://dlcdn.apache.org/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz
2, 解压缩: tar -zxvf apache-skywalking-java-agent-9.0.0.tgz

3, 在解压后的文件夹中有 skywalking-agent.jar

2,运行jar时,加入jvm选项

-javaagent:\path\skywalking-agent.jar -Dskywalking.agent.service_name=${service_name} -Dskywalking.collector.backend_service=${ip}:{port}
注意:上面一行要放在 -jar选项之前

例如:
java -javaagent:/root/apm/skywalking-agent.jar -Dskywalking.agent.service_name=myName -Dskywalking.collector.backend_service=127.0.0.1:11800 -jar xxxx.jar

八,侵入式记录traceid到日志

1,引入pom

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

2, 修改log4j.xml的pattern

日志展现结果, 有了traceid,parrent spanid, spanid, 使得有ELK统一日志系统把具体业务

<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level [%X{TRACE_ID},%X{SPAN_ID}] - %msg%xEx%n"/>

3, filter的实现

@Component
public class TraceIdFilter extends OncePerRequestFilter {private static final String TRACE_ID = "TRACE_ID";private static final String SPAN_ID = "SPAN_ID";private static final String SPAN_PID = "SPAN_PID";@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws ServletException, IOException {String traceId = TraceContext.traceId();if(null == traceId){chain.doFilter(request, response);return;}String spanPid = request.getHeader(SPAN_PID);// 生成spanIdString spanId;if(spanPid == null){spanPid = "0";spanId = "1";}else {spanId = String.valueOf(Integer.valueOf(spanPid) +1);}SpanContext.getContext().initContext(spanId);MDC.put(TRACE_ID, traceId);MDC.put(SPAN_ID, spanId);MDC.put(SPAN_PID, spanPid);chain.doFilter(request, response);}@Overridepublic void destroy() {MDC.clear();}
}


4,  feign拦截器的实现

public class FeignClientInterceptor implements RequestInterceptor {private static final String SPAN_PID = "SPAN_PID";@Overridepublic void apply(RequestTemplate requestTemplate) {try {SpanContext spanContext = SpanContext.getContext();if (Objects.nonNull(spanContext)) {requestTemplate.header(SPAN_PID, spanContext.getSpanId());}} catch (Exception e) {e.printStackTrace();}}
}
SpanContext
@Data
public class SpanContext {private String spanId;private static ThreadLocal<SpanContext> LOCAL = new ThreadLocal<>();public static SpanContext getContext() {SpanContext context = LOCAL.get();if (Objects.isNull(context)) {context = new SpanContext();LOCAL.set(context);}return context;}/*** 初始化*/public void initContext(String spanId){this.spanId = spanId;}
}

九,UI界面

简单记录一下,实际上我是不喜欢这个工具,没有PP好用!

码字不易,记得点赞关注哟!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【XSS_MSN】基于GCN的web攻击Payload识别与可解释性分析

原文标题&#xff1a;Web Attack Payload Identification and Interpretability Analysis Based on Graph Convolutional Network 原文链接&#xff1a;https://ieeexplore.ieee.org/document/10076547/ 作者单位&#xff1a;四川大学网络安全学院 相似原理论文&#xff1…

字节码增强技术-ASM

概述 在Java中一般是用javac命令编译源代码为字节码文件&#xff0c;一个.java文件从编译到运行的示例如图所示: 使用字节码的好处&#xff1a;一处编译&#xff0c;到处运行。java 就是典型的使用字节码作为中间语言&#xff0c;在一个地方编译了源码&#xff0c;拿着.class …

TCP/IP模型五层协议

TCP/IP模型五层协议 认识协议 约定双方进行的一种约定 协议分层 降低了学习和维护的成本&#xff08;封装&#xff09;灵活的针对这里的某一层协议进行替换 四/五层协议 五层协议的作用 应用层 应用层常见协议 应用层常见协议概览 基于TCP的协议 HTTP&#xff08;超…

AI绘画的魅力与未来:人工智能如何重塑艺术创作

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;AI绘画已经成为艺术与技术交汇的新领域。通过深度学习、神经网络等先进技术&#xff0c;AI不仅能理解和模拟人类艺术家的创作风格&#xff0c;还能生成令人惊叹的原创艺术作品。本文旨在探讨AI绘画的现状、挑…

ChatGPT AIGC自动生成多条件复杂计算函数

在Excel中经常会遇到多条件判断,根据不同的条件与内容显示不同的值。 例如: 需要给每个员工根据入职年限,员工等级,满意度等维度给员工发年终奖。 这在职场办公过程中经常要面临的一个问题。如销售额达到多少,取多少提成,如学生成绩在什么区间是设置为优秀还是良好等一…

python 对图片增加边框,logo贴图,获取图片exif参数,填写图片文本内容

完整代码 # 找到个可以下载免费字体的网站https://font.chi删除我naz.com/mi删除我anfei.html from PIL import Image, ImageDraw, ImageFont import exifreaddef photo_exif(image_path):f open(image_path, rb)tags exifread.process_file(f)# 打印所有照片信息&#xff0…

2023CRM排行:深度对比16款CRM

客户关系管理系统&#xff08;CRM&#xff09;作为数字化转型的重要载体&#xff0c;选择一个优秀的CRM系统将为企业未来健康增长保障。市场上CRM软件众多&#xff0c;但很难分清哪个适合自己&#xff0c;最近赶在公司选型&#xff0c;我对市场所有软件进行了一个调研&#xff…

单点登录是什么?

单点登录&#xff08;Single Sign On, SSO&#xff09;是指在同一帐号平台下的多个应用系统中&#xff0c;用户只需登录一次&#xff0c;即可访问所有相互信任的应用系统。 单点登录的本质就是在多个应用系统中共享登录状态。如果用户的登录状态是记录在 Session 中的&#xff…

异或运算.

相同为0&#xff0c;不同为1。 1 ^ 10 0 ^ 00 1 ^ 01 0 ^ 11性质&#xff1a; 0 ^ N N N ^ N 0交换、结合 a ^ b b ^ a&#xff1b; (a ^ b) ^ c a ^ (b ^ c)&#xff1b; 因此异或全部的元素的结果就是那个只出现1次的元素。 实现两个值的交换&#xff0c;而不必使…

C的魅力在于指针

原有的adrv9025 代理框架很好用,在其原有的平台上做改进

Python特征分析重要性的常用方法

前言 特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征&#xff0c;它是机器学习中经常使用的一种方法。 为什么特征重要性分析很重要? 如果有一个包含数十个甚至数百个特征的数据集&#xff0c;每个特征…

C#冒泡排序算法

冒泡排序实现原理 冒泡排序是一种简单的排序算法&#xff0c;其原理如下&#xff1a; 从待排序的数组的第一个元素开始&#xff0c;依次比较相邻的两个元素。 如果前面的元素大于后面的元素&#xff08;升序排序&#xff09;&#xff0c;则交换这两个元素的位置&#xff0c;使…

汽车屏类产品(四):仪表Cluster

###前言 仪表Cluster/仪表盘Dashboard,作为伴随汽车诞生就存在的一个主要零部件之一,从机械到电子到数字,可以说也是逐渐发展到现在的。 目前的主流框图如下,中间processor就是主控芯片,可能有buttons/switches,有display显示屏+backlight背光,有audio->speake…

线性代数-Python-01:向量的基本运算 -手写Vector -学习numpy的基本用法

文章目录 代码目录结构Vector.py_globals.pymain_vector.pymain_numpy_vector.py 一、创建属于自己的向量1.1 在控制台测试__repr__和__str__方法1.2 创建实例测试代码 二、向量的基本运算2.1 加法2.2 数量乘法2.3 向量运算的基本性质2.4 零向量2.5 向量的长度2.6 单位向量2.7 …

mybatis自定义类型控制器(TypeHandler)处理将字符串处理为集合

1. 问题&#xff1a; 假设这么一个场景 localurl里面的值大概这样&#xff1a;dwad21.jpg,dwad22.jpg,dwad.23.jpg 是一个字符串 如果我在sql表中有一个字段&#xff08;local_url&#xff09;是本地图片资源的多个url字符串拼接值。我想在java后端中不进行额外的转换就取值加…

【Qt控件之微调框、进度条】QSpinBox、QDoubleSpinBox、QDial、QProgressBar介绍及使用

概述 QSpinBox类提供了一个微调框小部件。 QSpinBox适用于处理整数和离散的值集&#xff08;例如&#xff0c;月份名称&#xff09;&#xff1b;对于浮点数值&#xff0c;请使用QDoubleSpinBox。 QSpinBox允许用户通过点击上下按钮或按键盘上的上下箭头来增加/减少当前显示的值…

Hadoop3教程(二十三):Yarn的三大调度器

文章目录 &#xff08;129&#xff09;FIFO调度器&#xff08;130&#xff09;容量调度器特点资源分配算法 &#xff08;131&#xff09;公平调度器特点缺额的定义队列资源分配方式基于FIFO策略基于Fair策略资源分配算法 DRF策略 参考文献 &#xff08;129&#xff09;FIFO调度…

搭建react项目

一、环境准备 1、安装node 官网下载安装&#xff1a;https://nodejs.org/en 注&#xff1a; npm5.2以后&#xff0c;安装node会自动安装npm和npx 2、安装webpack npm install -g webpack3、安装create-react-app npm install -g create-react-app二、创建react项目 1、初…

MSQL系列(六) Mysql实战-SQL语句优化

Mysql实战-SQL语句优化 前面我们讲解了索引的存储结构&#xff0c;BTree的索引结构&#xff0c;以及索引最左侧匹配原则&#xff0c;Explain的用法&#xff0c;可以看到是否使用了索引&#xff0c;今天我们讲解一下SQL语句的优化及如何优化 文章目录 Mysql实战-SQL语句优化1.…

GDPU 数据结构 天码行空5

一、实验目的 1&#xff0e;掌握队列的顺序存储结构 2&#xff0e;掌握队列先进先出运算原则在解决实际问题中的应用 二、实验内容 仿照教材顺序循环队列的例子&#xff0c;设计一个只使用队头指针和计数器的顺序循环队列抽象数据类型。其中操作包括&#xff1a;初始化、入队…