Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >​既生瑜,何生亮,SkyWalking 和 ELK 实现链路追踪的实践

​既生瑜,何生亮,SkyWalking 和 ELK 实现链路追踪的实践

作者头像
悟空聊架构
发布于 2024-08-12 07:29:03
发布于 2024-08-12 07:29:03
2.8K23
代码可运行
举报
运行总次数:3
代码可运行

一、背景

最近在给项目搭建日志平台的时候,采用的方案是 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 打印出来。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 的集成,可以互补优势,共同提升微服务架构下的可观测性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 悟空聊架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
ELK 支持 Trace ID, 你这文章背景就是错的, 后面也不用看了。
ELK 支持 Trace ID, 你这文章背景就是错的, 后面也不用看了。
111举报
请问大佬怎么支持呢?完全不依赖其他吗?那trace id从哪来?elk 只有日志采集和检索功能,你莫非是想说elastic apm?那也是得依赖这个apm啊?如果不用apm 怎么就自带trace id?
请问大佬怎么支持呢?完全不依赖其他吗?那trace id从哪来?elk 只有日志采集和检索功能,你莫非是想说elastic apm?那也是得依赖这个apm啊?如果不用apm 怎么就自带trace id?
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
ELK 日志系统集成 Skywalking 调用链 ID
Skywalking 是一款优秀的国产 APM 工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。ELK 是一个完整的集中式日志系统,提供日志的收集、传输、存储、分析等一整套解决方案。将 Skywalking 的 trace id 集成到 ELK 可以打通两款工具,根据 trace id 搜索出整条链路上的所有日志,可以快速定位问题。下文通过目前最流行的两款 java 日志工具 logback 和 log4j2,介绍具体集成方案,并在最后通过 demo 演示集成效果。
鲍远林
2020/09/12
15.6K2
ELK 日志系统集成 Skywalking 调用链 ID
【第二十二篇】商城系统-Skywalking链路追踪【商城系统完结篇】
  Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin /Pinpoint /CAT 的设计思路。特点是:支持多种插件,UI功能较强,支持非侵入式埋点。目前使用厂商最多,版本更新较快。
用户4919348
2022/10/08
8280
【第二十二篇】商城系统-Skywalking链路追踪【商城系统完结篇】
SpringCloud——Sleuth、ELK、Zipkin
【解释】INFO [simple-demo-2,ddfe378c0a8ec7cc,d4f2e63ad9bc890b,true]
爪哇缪斯
2023/05/10
9260
SpringCloud——Sleuth、ELK、Zipkin
几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!
" 新项目查日志太麻烦,多台机器之间查来查去,还不知道是不是同一个请求的。打印日志时使用 MDC 在日志上添加一个 traceId,那这个 traceId 如何跨系统传递呢? "
程序员小航
2020/11/23
5.5K0
几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!
Docker安装ELK并实现JSON格式日志分析
ELK是elastic公司提供的一套完整的日志收集以及前端展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash和Kibana。
我的小熊不见了丶
2019/10/25
1.5K0
Docker安装ELK并实现JSON格式日志分析
SpringBoot+Dubbo集成ELK实战
一直以来,日志始终伴随着我们的开发和运维过程。当系统出现了Bug,往往就是通过Xshell连接到服务器,定位到日志文件,一点点排查问题来源。
allsmallpig
2021/02/25
6750
SkyWalking 集成日志框架
问天丶天问
2024/10/02
1040
SkyWalking 集成日志框架
Dubbo日志链路追踪TraceId选型
开发排查系统问题用得最多的手段就是查看系统日志,但是在分布式环境下使用日志定位问题还是比较麻烦,需要借助 全链路追踪ID 把上下文串联起来,本文主要分享基于 Spring Boot + Dubbo 框架下 日志链路追踪ID 的实现方案选型思路。
陶陶技术笔记
2020/09/26
3K0
springboot 日志跟踪(skywalking)
上了 springboot 微服务框架后会有很多微服务,每次都到单个微服务自己的日志海洋里去找需要很大经理, 日志跟踪就会成为一个麻烦。我们尝试来寻找一个简化方案
张云飞Vir
2022/09/29
1.8K0
Skywalking 链路追踪
APM(Application Performance Monitoring)即应用性能管理系统,是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。应用性能管理,主要指对企业的关键业务应用进行检测、优化、提高企业应用的可靠性和质量,保证用户得到良好的服务,降低 IT拥有的成本。APM系统是可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题**。**
Java架构师必看
2021/04/25
2.4K0
Skywalking 链路追踪
Spring Cloud Sleuth使用ELK收集&分析日志
注意, logstash-logback-encoder 的版本务必和Logback兼容,否则会导致应用启动不起来,而且不会打印任何日志!可前往 https://github.com/logstash/logstash-logback-encoder 查看和Logback的兼容性。
用户1516716
2019/09/02
1.9K0
Spring Cloud Sleuth使用ELK收集&分析日志
ELK 环境搭建
ELK 其实是Elasticsearch、Logstash和Kibana三个产品的首字母缩写,这三款都是开源产品。
默存
2022/12/03
7170
Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】
通过之前的《入门示例》,我们已经为两个由SpringCloud构建的微服务项目 trace-1和 trace-2引入了Spring Cloud Sleuth的基础模块 spring-cloud-starter-sleuth,实现了为各微服务的日志信息中添加跟踪信息的功能。但是,由于日志文件都离散的存储在各个服务实例的文件系统之上,仅仅通过查看日志文件来分析我们的请求链路依然是一件相当麻烦的差事,所以我们还需要一些工具来帮助我们集中的收集、存储和搜索这些跟踪信息。引入基于日志的分析系统是一个不错的选择,比如:
程序猿DD
2018/03/20
1.4K0
Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】
从头分析一则traceId穿透问题(附解决方案)
现在常用的开源组件有google的Dapper,Twitter的zipkin和Apache SkyWalking等,商用的比较有代表性的是阿里的Eagleeye(鹰眼)。它们的工作模式不外乎是客户端在同一个trace的不同span上采点上传到server端然后server端进行存储后以web界面的形式将整个链路以traceId和spanId进行关联起来就形成了整个调用链路。用于串起整个链路的id主要分为traceId和spanId。
山行AI
2020/09/24
6K3
从头分析一则traceId穿透问题(附解决方案)
Kubernetes业务应用链路追踪解决方案
随着应用的增多,各个应用之间的调用关系也错综复杂,在多应用之间排查问题的代价也越来越高,任何一个系统的异常都有可能影响到其他系统,为了快速定位问题和发现问题,我们需要将所有应用的调用链进行可视化,以一个直观的方式展示系统之间的调用关系以及各个接口的响应时间。
shysh95
2023/11/20
6310
Kubernetes业务应用链路追踪解决方案
可以用于云原生中Skywalking框架原理你真的懂吗
2、为什么需要:对于单体应用,我们可以很容易地监控和分析它的性能。对于微服务,编程语言不同、服务器数量庞大、可能跨多个服务/区域,那么面对复杂的请求调用链路,就会有一系列问题,只有全链路监控才能处理,例如:
苏州程序大白
2022/04/28
2K0
可以用于云原生中Skywalking框架原理你真的懂吗
Spring Boot 整合 elk
进入容器后,修改 /etc/logstash/conf.d/02-beats-input.conf
程序员果果
2019/05/16
8710
锅总浅析链路追踪技术
链路追踪是什么?常用的链路追踪工具有哪些?它们的异同、架构、工作流程及关键指标有哪些?希望读完本文能帮您解答这些疑惑!
锅总
2024/07/31
1740
锅总浅析链路追踪技术
SpringBoot 整合 ELK
进入容器后,修改 /etc/logstash/conf.d/02-beats-input.conf
jwangkun
2021/12/23
3640
SpringBoot 整合 ELK
SkyWalking链路追踪系统-接入篇
在前面的文章中讲到SkyWalking链路追踪系统-部署篇,接下来在正式接入Skywalking探针agent之前,先来接着了解一下Skywalking的整体架构和主要概念(内容主要汇总自官方文档或网络)
仙人技术
2021/03/29
2K0
SkyWalking链路追踪系统-接入篇
推荐阅读
相关推荐
ELK 日志系统集成 Skywalking 调用链 ID
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验