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

news2024/12/26 13:46:17

一,背景

随着业务的扩张, 系统变得越来越复杂, 由前端、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";

    @Override
    protected 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);
        // 生成spanId
        String 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);
    }

    @Override
    public void destroy() {
        MDC.clear();
    }
}


4,  feign拦截器的实现

public class FeignClientInterceptor implements RequestInterceptor {
    private static final String SPAN_PID = "SPAN_PID";
    @Override
    public 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.coloradmin.cn/o/1110466.html

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

相关文章

蓝屏代码0xc0000001的解决方法和注意事项

蓝屏代码0xc0000001是Windows系统常见的一个错误代码&#xff0c;它通常意味着系统启动时出现了严重的错误。当用户遇到这个问题时&#xff0c;可能会感到非常困惑和焦虑。本文将为大家介绍一些解决蓝屏代码0xc0000001的方法&#xff0c;并详细说明注意事项。让我们一起来看看&…

deepin操作系统下载

官网 最新版本 – 深度科技社区 下载页面 最新版本 – 深度科技社区 随便选择一个下载 直接下载地址 https://cdimage.deepin.com/releases/20.9/deepin-desktop-community-20.9-amd64.iso

IDEA同步代码到Gitee

参考博客 https://gitee.com/jakhyd/risk-operation.git

通达OA通用版V12的表单js定制开发,良好实践总结-持续更新

通达OA通用版V12的表单js定制开发的良好实践总结-持续更新 良好实践总结在表单中的js区域标准代码2023年10月19日获取地址栏&#xff1a;协议、域名/IP地址端口号获取地址栏的参数&#xff0c;比如run_id、flow_id等向表单中追加自定义css、js文件 良好实践总结 在webroot下的…

电脑出现关于kernelbase.dll文件找不到的情况,有什么办法可以解决?

在使用电脑中&#xff0c;突然提示找不到kernelbase.dll&#xff0c;这时候应该怎么办呢&#xff1f;出现这样的问题&#xff0c;有神办法可以解决。看到有小伙伴在问这个问题&#xff0c;那么今天就带大家了解一下这个文件&#xff0c;同时教大家如何解决kernelbase.dll丢失的…

回溯法介绍-回溯与递归的区别【详细且排版舒服】

一、回溯法 1. 定义 有一类问题&#xff0c;我们不知道它明确的计算法则。而是先进行试探&#xff0c;试探到最终状况&#xff0c;发现不满足问题的要求&#xff0c;则回溯到上一个状态继续试探。这种不断试探和回溯的思想&#xff0c;称为回溯法&#xff08;Back Track Meth…

华为OD机试 - 机器人走迷宫 - 深度优先搜索dfs(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、深度优先搜索dfs六、Java算法源码七、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&…

Sosyal Lig Arena VoxEdit 比赛

召集所有体素艺术家和足球爱好者&#xff01;准备好彻底改变足球世界了吗&#xff1f; 我们邀请所有艺术家参加 VoxEdit 未来足球比赛。这场激动人心的比赛向你们发出挑战&#xff0c;请使用 VoxEdit 想象元宇宙中足球的未来。 发挥你们的创造力&#xff0c;展望未来的足球世…

半导体即国家,日本做了啥?最大的 AI 模型并不十分透明;特斯拉安全数据报告缺失近一年丨 RTE 开发者日报 Vol.70

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

香港服务器在国内访问太慢怎么能提高?

​  一直以来&#xff0c;全球化业务需求的增长是跟随着蓬勃向上的互联网而发展的。有了网络&#xff0c;海外贸易就在鼠标的轻点中完成。而IDC市场中的香港服务器也因为免备案政策的特性&#xff0c;开始逐渐成为企业想要跨越地域壁垒而考虑的对象。但在使用过程中&#xff…

视频号下载助手中的小程序怎么用?微信视频号提取下载教程

​用过视频号视频下载助手都说好用&#xff0c;但还有不少人不知道如何操作&#xff0c;怎么才能快速提取视频号视频呢&#xff1f;今天就分享两个工具【视频下载助手】和【视频下载bot】两个结合的方式进行下载&#xff0c;具体操作看教程。 在微信客户端中搜索提取机器人&…

开关电源芯片好坏的判断标准是什么?如何判断电源芯片的好坏?

电源芯片是电子设备的一个重要元件&#xff0c;如果电源芯片损坏&#xff0c;那么设备也将停止工作。开关电源芯片是一种电源管理器件&#xff0c;可以将输入电压转换为稳定的输出电压。为了开关电源芯片可以正常稳定运行以及电子设备可以正常工作&#xff0c;对于电源芯片的检…

Java面试题:链表-合并两个排序的链表

描述 输入两个递增的链表&#xff0c;单个链表的长度为n&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 示例 输入&#xff1a; {1,3,5}, {2,4,6}返回值&#xff1a; {1,2,3,4,5,6}原题地址&#xff1a;https://www.nowcoder.com/practice/d8b6b4358f7742…

域控操作三:给域用户本地管理员权限

登录本地管理账号 右键此电脑–管理–本地用户和组–组—双击administrators 一般来说会有本地管理账号和域控的已缓存账号 点击添加–高级–输入域控管理员账号 搜索这个电脑使用人添加进去。重启电脑即可

【Java】ArrayList集合使用

ArrayList集合常见方法 方法名称说明public boolean add(E e)将元素插入到指定位置的arraylist中&#xff0c;返回值&#xff1a;返回boolean类型public E remove(int index)删除 arraylist里的单个元素&#xff0c;返回值&#xff1a;返回删除之前的元素public E set(int inde…

ESP32集成开发环境Espressif-IDE安装 – Windows

陈拓 2023/10/15-2023/10/16 1. 概述 Espressif IDE是一个基于Eclipse CDT的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于使用ESP-IDF框架开发物联网应用程序。这是一个专门为ESP-IDF构建的独立定制IDE。Espressif IDE附带了IDF Eclipse插件、重要的Eclipse CDT插…

VMware下linux中ping报错unknown host的解决办法

一、错误截图 二、解决办法 2.1 按照步骤查看本机虚拟IP 依次点击&#xff1a;【编辑】》【虚拟网络编辑器】&#xff0c;选中NET模式所属的行&#xff0c;就能看到子网地址。 比喻&#xff0c;我的子网地址是&#xff1a;192.168.18.0 那么&#xff0c;接下来要配置的linux…

Pyside6 资源系统和资源文件使用

Pyside6 资源系统和资源文件使用 资源系统使用创建资源管理器编译qrc文件调用资源文件 在开发APP过程中&#xff0c;经常需要使用一些文件&#xff0c;图片之类的资源&#xff0c;这些资源都有一个特点&#xff0c;就是跟用户的使用环境无关&#xff0c;也就是说必须独立于系统…

留学教育咨询机构如何通过软文强势突围

近年来留学市场逐渐回暖&#xff0c;但是行业竞争也更加激烈&#xff0c;留学教育咨询机构想要在激烈的市场竞争中强势突围&#xff0c;除了优秀的职业素养&#xff0c;专业的服务态度外&#xff0c;还需要具备品牌形象打造和推广的能力&#xff0c;也有不少留学机构找盒子进行…

Altium Designer 20.2.3绘制51单片机最小系统

1、在电脑中建立一个自定义的文件夹&#xff0c;以备存储设计文件用。双击打开“X2.EXE” 运行文件&#xff0c;进入软件工作界面。 2、创建工程文件&#xff1a;单击“文件”菜单&#xff0c;选择“新的”选项中的“项目”选项&#xff0c;在“Project Name”中将工程文件保存…