SkyWalking 和 ELK 链路追踪实战

news2025/1/11 3:03:36

一、背景

最近在给项目搭建日志平台的时候,采用的方案是 SkyWalking + ELK 日志平台,但发现 ELK 日志平台中的日志没有 Trace ID,导致无法追踪代码报错的整体链路。

空哥提示:Trace ID 是分布式追踪中用来唯一标识一个服务请求或事务的 ID。在微服务架构中,一个请求可能会经过多个服务节点,Trace ID 帮助追踪和关联整个请求链路中的所有日志和性能数据。

既然 SkyWalking 提供了日志的链路追踪,为什么 ELK 没有链路追踪 ID 呢? 带着这个疑问我们继续往下看。

二、SkyWalking 和 ELK 啥关系啊?

  • SkyWalking: 专注于应用性能监控(APM)的系统,主要提供分布式追踪、服务性能分析和多维度监控功能。

    它支持自动化代码埋点,能够追踪微服务之间的调用关系和性能指标。

  • ELK:日志数据的集中管理和分析,Elasticsearch + Logstash + Filebeat,作为日志采集和存储,Kibana 作为可视化日志检索平台。

SkyWalking 和 ELK 是如何联系在一起的?我们一步一步往下看。

2.1 SkyWalking

SkyWalking 本来就带有链路追踪,而且通过搭建 SkyWalking-UI 服务就可以以通过界面来查看日志。

图片

SkyWalking 整体架构如下:

图片

FROM http://skywalking.apache.org/

  • 最上面的 Tracing:负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器,目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。我们采用的是 SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给 SkyWalking OAP 服务器。

  • 中间的 SkyWalking OAP 服务器 :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。

  • 最右边的 Storage :负责存储 Tracing 数据。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。

  • 最左边的 SkyWalking UI :一个网页版的界面,提供查看数据的功能。

2.2 ELK 集中日志平台

整体的架构图如下所示,

图片

流程如下:

  • Beats:

    Filebeat 服务属于 Beats,部署在应用侧,它把日志收集起来,然后再把数据传给 Logstash 服务。

  • Logstash:

    负责日志数据的过滤、匹配、格式转换,然后将日志数据发送给 Elasticsearch 存储。

  • Elasticsearch:

    负责存储日志数据和建立日志数据索引,便于 Kibana 查询日志。

  • Kibana:

    负责可视化查询日志数据。

2.3 SkyWalking 和 ELK 有什么相同之处?

  • 都能采集日志

  • 都有可视化界面来查询日志

那么这两款日志平台有很多类似之处,直接用其中一种不行吗?

三、只用 SkyWalking 可以吗?

SkyWalking 优点是服务性能分析和链路追踪,但也有不足之处。

3.1 采集方式上不足

Skywalking 监控 Java、Golang、Node、.NET 语言的链路都是采用了 SDK 或者 Agent 的方式将数据上报到 Skyalking 后端,不过都是采用 gRPC 的方式和后端交互,比如我们项目是 Java 项目,SkyWalking Agent 采集到后端的 Java 日志后进行上报。而对于 Nginx 则需要写 Lua 脚本来和 SkyWalking AOP 服务通信,对于 MySQL 日志也需要单独写脚本来上报日志。

3.2 数据可视化的不足

  • SkyWalking 对于链路的展示非常直观,但是对于日志的数据的展示探索能力很弱,而 Kibana 提供了丰富的可视化选型,如折线图、饼图等。

  • SkyWalking 对于日志的搜索和展示能力较弱,而 Kibana 对于搜索的方式非常丰富,而且支持高亮。

下图分别为 SkyWalking 和 Kibana 的可视化界面

图片

图片

四、只用 ELK 可以实现链路追踪吗?

当然是可以,但是 ELK 并没有日志追踪的能力,需要借助其他工具来实现,以下是常见的做法。

  • SkyWalking 嵌入 Trace ID,依赖 SkyWalking Agent。

  • MDC 中加入 Trace ID,简便,需要在拦截器中加入 Trace ID。

  • Kibana 最近日志,不准确。

4.1 SkyWalking  嵌入 Trace ID 到日志

通过 SkyWalking 的自定义日志布局类 TraceIdPatternLogbackLayout,将分布式追踪系统中的追踪 ID(Trace ID)嵌入到日志中。

4.1.1 使用方式

在 logback-spring.xml 日志配置文件中配置控制台打印的时候使用带有 SkyWalking 的 TraceId 的日志布局。如下代码所示,使用了 TraceIdPatternLogbackLayout 日志布局,然后在日志格式中加入了 [%tid],就能将 trace id 打印出来。

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <!-- 定义一个带有TraceId的日志布局 -->
    <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
        <pattern>${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) [%tid] %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>
    
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

程序运行期间就会在控制台窗口打印出 trace id,如下所示:

图片

然后通过 Filebeat 和 Logstash 将日志采集并上传到 Elasticsearch。如下图索索,Kibana 根据 trace id 来查看链路日志。

图片

4.1.2 原理
  • 上下文传递

    在分布式系统中,服务之间通过 HTTP 调用或其他通信机制相互交互。

    Trace ID 需要在服务之间传递,以便追踪整个请求链路。

  • 日志集成

    SkyWalking 通过字节码增强或自动代理等技术,自动在应用的运行时上下文中生成和管理 Trace ID。

  • 配置灵活性

    SkyWalking 允许开发者通过配置文件(如 logback.xml)自定义日志格式,包括是否在日志中包含 Trace ID。

4.2 MDC 方案

MDC 的方案就是自己生成一个随机 ID 作为 traceId,然后 put 到 MDC 里面。如下代码所示:

  • 1

MDC.put("traceId", UUID.randomUUID().toString());

MDC(Mapped Diagnostic Context)用于存储运行上下文的特定线程的上下文数据。MDC 主要依赖于线程局部存储(Thread-Local Storage),这意味着每个线程都有自己独立的 MDC 数据。属于该线程的任何代码都可以轻松访问线程的 MDC 中存在的值。

使用方式和原理可以看空哥之前写的一篇文章:

从 1.5 开始搭建一个微服务框架——链路追踪 traceId

先贴个原理图给大家看看:

图片

4.3 Kibana 的最近日志

Kibana 可查看某一条日志相近的多条日志,如下图所示,点击 View surrounding documents 按钮即可。

图片

然后就能看到与之时间相近的多条日志

图片

但是这种方式不易准确辨别出相关联的上下文的日志。不易辨别的原因如下:

  • 相近时间段内有很多类似日志。

  • 相近时间段内有大量的其他日志穿插在这个上下文中,不易刷选可用的日志。

五、总结

SkyWalking和 ELK 各自在 APM 与日志管理领域发挥着重要作用,尽管原生 ELK 不直接支持链路追踪,但通过与 SkyWalking 的集成,可以互补优势,共同提升微服务架构下的可观测性。

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

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

相关文章

Ubuntu22.04深度学习环境安装【cuda+cudnn】

为了复现一篇深度学习论文&#xff0c;特意安装了Linux系统。前一天已经安装Linux显卡驱动&#xff0c;现在需要安装cuda、cudnn等。 论文代码 论文PDF 确定包版本&#xff1a; 根据论文提供的代码。在requirements.txt中发现cuda版本为11.7,cudnn为8.5.0&#xff0c;python没…

ue5 motion matching

ue5.5 gameanimationsample 先看动画蓝图 核心两个node 第一个是根据数据选择当前的pose 第二个是缓存一段历史记录&#xff0c;为第一个node选择的时候提供数据。 在animinstance的update方法中 每帧都更新这个函数&#xff0c;每帧更新trajectory的数据 看看第一个node的…

mycat2 分库分表

mycat2读写分离 mysql主从复制 mycat2 分库分表 实在 配置mycat2 读写分离 及主从复制的基础上完成的 以下所有操作 在mycat 登录后执行 一、配置分库分表数据源 name:数据名称 一般以以最后一个字母判断 r 是读 w是写 url&#xff1a; 真实数据源ip地址 理论上是每一个ip都…

python pandas数据处理,对比两个xlsx文档的两列数据做对比匹配,然后复制单元格值

1&#xff0c;文档数据 文档A 批次编号编号风险等级意见ps001code1低风险同意ps001code2中风险同意ps001code3低风险同意ps001code4低风险同意ps001code5低风险同意ps001code6低风险同意ps002code11低风险同意ps002code12中风险否决ps002code13低风险否决ps002code14低风险否决…

Pytorch 手写数字识别 深度学习基础分享

本篇是一次内部分享&#xff0c;给项目开发的同事分享什么是深度学习。用最简单的手写数字识别做例子&#xff0c;讲解了大概的原理。 手写数字识别 展示首先数字识别项目的使用。项目实现过程: 训练出模型准备html手写板flask 框架搭建简单后端 简单手写数字识别 深度学习必…

WPS EXCEL 使用 WPS宏编辑器 写32位十六进制数据转换为浮点小数的公式。

新建EXCLE文件 另存为xlsm格式的文件 先打开WPS的开发工具中的宏编辑器 宏编辑器编译环境 在工作区添加函数并编译&#xff0c;如果有错误会有弹窗提示&#xff0c;如果没有错误则不会弹 函数名字 ”HEXTOFLOAT“ 可以自己修改。 function HEXTOFLOAT(hex) { // 将十六…

沃丰科技智能客服在跨境电商独立站中的核心角色

随着全球化进程的加速和互联网技术的不断发展&#xff0c;跨境电商行业蓬勃兴起&#xff0c;为消费者提供了更广阔、更便捷的购物选择。在这样一个竞争激烈的市场环境中&#xff0c;优质的客户服务成为了企业脱颖而出的关键。沃丰科技智能客服凭借其先进的技术和人性化的设计理…

langgraph实现无观测推理 (Reasoning without Observation)

图例 1. 图状态 在 LangGraph 中&#xff0c;每个节点都会更新一个共享的图状态。当任何节点被调用时&#xff0c;状态就是该节点的输入。 下面&#xff0c;我们将定义一个状态字典&#xff0c;用以包含任务、计划、步骤和其他变量。 from typing import List from typing…

2024企业数据资产入表合规指引——解读

更多数据资产资讯关注公众&#xff1a;数字化转型home 本报告旨在为企业数据资产入表提供合规保障。随着数字经济的发展&#xff0c;数据资产已成为重要战略资源和新生产要素。财政部发布的《企业数据资源相关会计处理暂行规定》明确&#xff0c;自2024年1月1日起&#xff0c;数…

19,[极客大挑战 2019]PHP1

这个好玩 看到备份网站字眼&#xff0c;用dirsearch扫描 在kali里打开 找出一个www.zip文件 访问一下 解压后是这个页面 class.php <?php include flag.php; error_reporting(0); class Name{ private $username nonono; private $password yesyes; public …

计算机键盘简史 | 键盘按键功能和指法

注&#xff1a;本篇为 “计算机键盘简史 | 键盘按键功能和指法” 相关文章合辑。 英文部分机翻未校。 The Evolution of Keyboards: From Typewriters to Tech Marvels 键盘的演变&#xff1a;从打字机到技术奇迹 Introduction 介绍 The keyboard has journeyed from a humb…

《Clustering Propagation for Universal Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了S2VNet&#xff0c;这是一个用于医学图像分割的通用框架&#xff0c;它通过切片到体积的传播&#xff08;Slice-to-Volume propagation&#xff09;来统一自动&#xff08;AMIS&#xff09;和交互式&#xff08;IMIS&#xff09;医学图像分割任务。S2VNet利…

HarmonyOS(65) ArkUI FrameNode详解

Node 1、Node简介2、FrameNode2.1、创建和删除节点2.2、对FrameNode的增删改2.3、 FramNode的查询功能3、demo源码4、总结5、参考资料1、Node简介 在HarmonyOS(63) ArkUI 自定义占位组件NodeContainer介绍了自定义节点复用的原理(阅读本本篇博文之前,建议先读读这个),在No…

Elasticsearch使用(2):docker安装es、基础操作、mapping映射

1 安装es 1.1 拉取镜像 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/elasticsearch:7.17.3 1.2 运行容器 运行elasticsearch容器&#xff0c;挂载的目录给更高的权限&#xff0c;否则可能会因为目录权限问题导致启动失败&#xff1a; docker r…

java实现SpringBoot项目分页查询和消费的方法

简介 why&#xff1a; 最近在项目中&#xff0c;有一个sql需要查询100多万的数据&#xff0c;且需要在代码中遍历处理。面临两个问题 一次性查询出太多数据&#xff0c;速度较慢当前服务器内存支持以上操作&#xff0c;但是随着数据量的增多&#xff0c;以后可能会出现内存溢出…

专为高性能汽车设计的Armv9架构的Neoverse V3AE CPU基础知识与软件编码特性解析

一、ARMv9以及V3AE处理器架构 Armv9架构的Arm Neoverse V系列处理器是专为高性能计算设计的产品线&#xff0c;其中V3AE&#xff08;Advanced Efficiency&#xff09;特别强调了性能与效率之间的平衡。以下是关于Armv9架构下Neoverse V3AE处理器结构和指令集的一些详细解读&am…

Python数据清洗之重复数据处理

大家好&#xff0c;在数据处理和分析的过程中&#xff0c;重复数据是一个常见的问题。重复的数据不仅会影响数据的准确性&#xff0c;还可能导致模型训练中的偏差。因此&#xff0c;检测并清理重复数据是数据清洗中的重要步骤。Python 的 Pandas 提供了强大的功能来检测、标记和…

【实战教程】使用YOLO和EasyOCR实现视频车牌检测与识别【附源码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

【项目实战】基于python+爬虫的电影数据分析及可视化系统

注意&#xff1a;该项目只展示部分功能&#xff0c;如需了解&#xff0c;文末咨询即可。 本文目录 1.开发环境2 系统设计 2.1 设计背景2.2 设计内容 3 系统页面展示 3.1 用户页面3.2 后台页面3.3 功能展示视频 4 更多推荐5 部分功能代码 5.1 爬虫代码5.2 电影信息代码 1.开发环…

SDXL的优化工作

本文详细介绍SDXL在SD系列的基础上做了什么优化&#xff0c;包括模型架构优化和训练过程数据的相关优化策略。 目录 Stable Diffusion XL核心基础内容 SDXL整体架构初识 Base模型 Refiner模型 Base——VAE Base——U-Net Base——Text Encoder Refiner GPT补充【TODO】 SDXL官方…