【微服务】skywalking自定义链路追踪与日志采集

目录

一、前言

二、自定义链路追踪简介

2.1 自定义链路追踪应用场景

2.2 链路追踪几个关键概念

三、skywalking 自定义链路追踪实现

3.1 环境准备

3.2 集成过程

3.2.1 导入核心依赖

3.2.2 几个常用注解

3.2.3 方法集成

3.2.4 上报追踪信息

四、skywalking 自定义日志采集

4.1 概述

4.2 集成过程

4.2.1 引入核心依赖

4.2.2 配置logback文件

4.2.2 接口测试

五、写在文末


一、前言

在前面的分享中,详细了解了在微服务中集成skywalking进行服务链路追踪的过程,不管是使用dubbo还是springcloud做微服务治理,在集成skywalking时,往往关注的更多是不同服务之间的调用情况,但是在实际应用中,如果服务内部的链路调用比较复杂,跨度很长的情况下,是否也可以使用skywalking进行追踪呢?接下来将详细介绍下。

二、自定义链路追踪简介

2.1 自定义链路追踪应用场景

 在下面的场景下,可能需要在单应用内进行追踪:

  • 接口业务逻辑复杂,内含一些关键的远程接口调用;
  • 业务调用链路较长,内部方法调用栈比较深;
  • 需要监控某些关键执行业务逻辑的执行耗时,它们可能是性能瓶颈点;
  • ...

比如下面的一个接口,内部的逻辑调用链路比较深的情况下就需要自定义链路追踪

2.2 链路追踪几个关键概念

在具体学习自定义链路追踪之前,有下面几个概念需要了解

Trace

Trace就是链路,指一个请求经过所有服务的路径,服务间经过的局部链路构成了一条完整的链路,其中每一条局部链路都用一个全局唯一的traceid来标识。

Span

Span用于表示上下层父子关系,同一层级parent id相同,span id不同,span id从小到大表示请求的顺序。通过事先在日志中埋点,找出相同traceId的日志,再加上parent id和span id就可以将一条完整的请求调用链串联起来。

采样

由于每一个请求都会生成一个链路,为了减少性能消耗,避免存储资源的浪费,采集器并不会上报所有的span数据,而是使用采样的方式。举个例子,每秒有1000个请求访问系统,如果设置采样率为1/1000,那么只会上报一个请求到存储端。

存储

链路中的span数据经过收集和上报后会集中存储在一个地方,常用的存储有Mysql,ElasticSearch, HBase, In-memory DB等。

三、skywalking 自定义链路追踪实现

3.1 环境准备

  • 参照之前的文章提前搭建完skywalking 服务,并能访问web-ui界面;
  • 搭建一个springboot工程;
  • 启动nacos服务;

3.2 集成过程

下面演示如何在springboot工程中集成方法级的链路追踪信息并上报skywalking 。

3.2.1 导入核心依赖

在方法中记录追踪信息主要用到apm-toolkit-trace这个依赖,其提供了丰富的注解可供方法使用。

<dependencies>

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>

3.2.2 几个常用注解

在使用apm-toolkit-trace时,通常使用其提供的注解用于标准方法和参数,下面来看看常用的几个注解使用。

使用方式

@Trace
@Tag(key = "tag1", value = "arg[0]")
@Tag(key = "tag2", value = "arg[1]")
@Tag(key = "username", value = "returnedObj.username")
@Tag(key = "age", value = "returnedObj.age")
public User getUser(String param1, String param2) {
    // ActiveSpan.setOperationName("Customize your own operation name, if this is an entry span, this would be an endpoint name");
    // ...
}

参数说明:

@Trace

用在方法上,表名这是一个方法级的trace,@Trace也可以定义名称,比如@Trace(operationName = "getUserInfo"),@Trace注解其只能在方法上进行注解,使用operationName属性指定Span的名字,若不指定,会使用方法名;

@Tags/ @Tag

使用@Tags/ @Tag注解添加Span的属性

1)key 属性名

2)value 属性值会是一个表达式,具体可以参考官方文档,具体可参考,参考文档

3)arg[0]代表入参的第一个对象,returnedObj即当前方法返回的对象;

3.2.3 方法集成

在工程中创建一个接口

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/get")
    public Object getUserInfo(String userId){
        Map userInfo = userService.getUserInfo(userId);
        return userInfo;
    }
}

业务实现

@Service
@Slf4j
public class UserServiceImpl implements UserService {

    @Override
    @Trace(operationName = "getUserInfo")
    @Tags({
            @Tag(key = "userId", value = "arg[0]"),
            @Tag(key = "user", value = "returnedObj")
    }

    )
    public Map getUserInfo(String userId) {
        //获取自定义的上下文中的追踪信息
        String traceId = TraceContext.traceId();
        log.info("准备获取用户信息 ,traceId : [{}]", traceId);

        Map resMap = new HashMap();
        UserInfo userInfo = new UserInfo(userId, "jerry");
        resMap.put("user", userInfo);

        //获取用户所属的组织机构
        log.info("准备获取组织机构信息 ,traceId : [{}]", traceId);
        Depart depart = getDepart(userId);
        resMap.put("depart", depart);
        return resMap;
    }

    @Trace(operationName = "getDepart")
    @Tags(
            @Tag(key = "depart", value = "returnedObj")
    )
    private Depart getDepart(String userId) {
        if (userId == null) {
            return null;
        }
        return new Depart("001", "运维部");
    }
}

在该方法中,我们要实现的逻辑是,根据用户ID获取用户,同时在获取用户信息时还需要拿到组织机构信息,为了使用自定义追踪,在方法上添加了相关的注解,在不接入skywalking 的agent时启动测试接口

3.2.4 上报追踪信息

在启动参数中添加如下信息

-javaagent:E:\code-self\skywalking-agent\skywalking-agent.jar -DSW_AGENT_NAME=sky-service -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking IP:11800

再次启动服务,并调用上面的接口,从控制台可以看到此时当前接口请求就产生了一条追踪信息,可以看到输出的traceId;

同时在web-ui界面上,可以看到当前请求的处理方法中各个链路的详情,即从接口出发,到接口中处理的各个环节,包括调用的其他方法都能展示出来

点击到具体的方法中,比如点击getUserInfo这个方法中,能够看到追踪的该方法具体的信息,比如参数,返回值

四、skywalking 自定义日志采集

4.1 概述

在实际项目中,为了方便线上排查问题,尤其是微服务之间调用链路比较复杂的系统中,通过可视化日志的手段仍然是最直接也很方便的排查定位问题的手段,比如大家熟悉的ELK就是一种比较成熟的可视化日志展现方式,在skywalking UI界面上,在服务菜单栏中有Log一项,该项就是用于服务中集成日志,然后上报skywalking 进行链路的分析使用。

4.2 集成过程

微服务要通过skywalking 集成和上报日志信息,需要依赖logback日志,因此在集成过程中,需要按照规范定义logback的文件配置,整个过程分为下面几步:

  1. 引入logback依赖;

  2. 配置logback文件,按照规范输出日志信息;

  3. 导出日志并上报到skywalking ;

接下来以上一篇的springcloud接入skywalking 为例,在此基础上继续接入自定义的日志

4.2.1 引入核心依赖

在各个微服务模块中引入如下依赖

        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>8.14.0</version>
        </dependency>

4.2.2 配置logback文件

参考下面的样例配置logback文件,核心配置说明:

  • 在第一个ConsoleAppender中,Pattern中定义的内容表示日志输出格式,其中最关键的就是tid,即通过日志追记录的traceId;

  • 第二个AsyncAppender使用的是异步方式追加,减少对主业务的性能影响;

  • GRPCLogClientAppender,以grpc的方式上报日志到skywalking 的oap服务;

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod=" 5 seconds">
    <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.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="STDOUT"/>
    </appender>

    <appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="ASYNC"/>
        <appender-ref ref="grpc-log"/>
    </root>
</configuration>

4.2.2 接口测试

启动几个模块的微服务,nacos中可以看到服务已经注册进去

通过网关调用接口:localhost:9001/os/order/getById?id=001,可以看到接口能够响应数据

观察控制台的输出日志,不难发现,接口从order中发起,然后远程调用user服务中查询用户的逻辑,观察order服务的日志输出,产生了一个TID,即上午所说的traceId;

再检查user服务的控制台日志输出,同样输出了TID,细心的同学会发现,这个TID与上面的TID相同,因为是同一条链路的唯一ID;

此时再去WEB-UI界面,可以看到在Log这一栏中,就产生了相关的日志信息

可以在服务下拉框里面选择某个服务进行过滤,比如选择order服务之后点击某条日志进去检查,就能看到这条日志的详细信息

五、写在文末

通过上面的演示过程,演示了如何在微服务中自定义方法级的链路追踪,以及通过自定义输出格式的日志上报到skywalking的完整过程,在实际项目使用中,还需要结合实际需求进行细节上的调整,希望对看到的同学有用,本篇到此结束,感谢观看。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录 Leetcode491. 非递减子序列

题目&#xff1a; 代码(首刷看解析 2024年2月3日&#xff09;&#xff1a; class Solution { private:vector<vector<int>> res;vector<int> path; public:void backtracking(vector<int>& nums, int startIndex) {if (path.size() > 1) {res.…

HiveSQL题——collect_set()/collect_list()聚合函数

一、collect_set() /collect_list()介绍 collect_set()函数与collect_list()函数属于高级聚合函数&#xff08;行转列&#xff09;&#xff0c;将分组中的某列转换成一个数组返回&#xff0c;常与concat_ws()函数连用实现字段拼接效果。 collect_list&#xff1a;收集并形成lis…

Amazon Bedrock 知识库现可提供完全托管的 RAG 体验

Amazon Bedrock 知识库预览版已于9月问世。从今天开始&#xff0c;Amazon Bedrock 知识库正式全面发布。正式推出。 借助知识库&#xff0c;可安全地将 Amazon Bedrock 中的基础模型 (FM) 连接到贵公司的数据&#xff0c;供检索增强生成 (RAG) 使用。模型生成的响应更具相关性…

海外IP代理:解锁网络边界的实战利器

文章目录 引言&#xff1a;正文&#xff1a;一、Roxlabs全球IP代理服务概览特点&#xff1a;覆盖范围&#xff1a;住宅IP真实性&#xff1a;性价比&#xff1a;在网络数据采集中的重要性&#xff1a; 二、实战应用案例一&#xff1a;跨境电商竞品分析步骤介绍&#xff1a;代码示…

简单几步,借助Aapose.Cells将 Excel 工作表拆分为文件

近年来&#xff0c;Excel 文件已成为无数企业数据管理的支柱。然而&#xff0c;管理大型 Excel 文件可能是一项艰巨的任务&#xff0c;尤其是在高效共享和处理数据时。为了应对这一挑战&#xff0c;大型 Excel 工作簿被拆分为较小的工作簿以增强电子表格管理。Aspose提供了这样…

堪称灾难级攻击的 UDP FLOOD洪水攻击,应该如何防护?

DDOS又称为分布式拒绝服务&#xff0c;全称是Distributed Denial of Service。DDOS本是利用合理的请求造成资源过载&#xff0c;导致服务不可用&#xff0c;从而造成服务器拒绝正常流量服务。就如酒店里的房间是有固定的数量的&#xff0c;比如一个酒店有50个房间&#xff0c;当…

【Kafka】服务器Broker与Controller详解

这里写自定义目录标题 Broker概述Broker总体工作流程Broker重要参数 Controller为什么需要Controller具体作用数据服务Leader选举选举流程脑裂问题羊群效应触发leader选举 Broker 概述 Kafka服务实例&#xff0c;负责消息的持久化、中转等功能。一个独立的Kafka 服务器被就是…

AES算法:数据传输的安全保障

在当今数字化时代&#xff0c;数据安全成为了一个非常重要的问题。随着互联网的普及和信息技术的发展&#xff0c;我们需要一种可靠的加密算法来保护我们的敏感数据。Advanced Encryption Standard&#xff08;AES&#xff09;算法应运而生。本文将介绍AES算法的优缺点、解决了…

金和OA jc6 UploadFileBlock 任意文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

SpringBoot实战项目第一天

环境搭建 后端部分需要准备&#xff1a; sql数据库 创建SpringBoot工程&#xff0c;引入对应的依赖(web\mybatis\mysql驱动) 配置文件application.yml中引入mybatis的配置信息 创建包结构&#xff0c;并准备实体类 完成今日开发后项目部分内容如下图示 用户注册于登录部分…

【MongoDB】跨库跨表查询(python版)

MongoDB跨表跨库查询 1.数据准备&#xff1a;2.跨集合查询3.跨库查询应该怎么做&#xff1f; 讲一个简单的例子&#xff0c;python连接mongodb做跨表跨库查询的正确姿势 1.数据准备&#xff1a; use order_db; db.createCollection("orders"); db.orders.insertMan…

机器学习 | 如何利用集成学习提高机器学习的性能?

目录 初识集成学习 Bagging与随机森林 Otto Group Product(实操) Boosting集成原理 初识集成学习 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过组合多个基本模型来提高预测准确性和泛化能力的机器学习方法。它通过将多个模型的预测结果进行整合或投票来做…

增加Vscode引用路径

增加Vscode引用路径 增加Vscode引用路径问题说明解决思路1在Vscode中进行配置缺点 解决思路2 增加Vscode引用路径 问题说明 在嵌入式开发中需要经常用到库函数(SPL), Vscode需要配置引用路径才能对函数名或变量进行跳转 解决思路1 与Keil5 MDK类似, 在配置C/C的json文件中添…

计算机网络_1.6.2 计算机网络体系结构分层的必要性

1.6.2 计算机网络体系结构分层的必要性 一、五层原理体系结构每层各自主要解决什么问题1、物理层2、数据链路层3、网络层4、运输层5、应用层 二、总结三、练习 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 本节主要介绍实现计算机网络需要解决哪些问题&#xff1f;以…

【Crypto | CTF】BUUCTF 大帝的密码武器1

天命&#xff1a;这题真的是来刷经验的&#xff0c;有点吐血 首先这题是贼简单&#xff0c;但我居然跪到了&#xff0c;所以特此写这一篇来惩戒自己心太大 拿到文件&#xff0c;文件写着zip&#xff0c;改成zip后缀名即可&#xff0c;也不算啥难的 打开里面的两份文件&#x…

NLP入门系列—Attention 机制

NLP入门系列—Attention 机制 Attention 正在被越来越广泛的得到应用。尤其是 [BERT]火爆了之后。 Attention 到底有什么特别之处&#xff1f;他的原理和本质是什么&#xff1f;Attention都有哪些类型&#xff1f;本文将详细讲解Attention的方方面面。 Attention 的本质是什…

LabVIEW传感器通用实验平台

LabVIEW传感器通用实验平台 介绍了基于LabVIEW的传感器实验平台的开发。该平台利用LabVIEW图形化编程语言和多参量数据采集卡&#xff0c;提供了一个交互性好、可扩充性强、使用灵活方便的传感器技术实验环境。 系统由硬件和软件两部分组成。硬件部分主要包括多通道数据采集卡…

MySQL 安装配置 windows

一、下载 去官网MySQL :: MySQL Downloads 下载社区版 然后根据自己的系统选择 直接下载。 二、安装 点击安装程序 这边看样子缺少东西。 去这边下载 Latest supported Visual C Redistributable downloads | Microsoft Learn 然后再一次安装mysql 三、配置 安装完成后&a…

Vue3_基础使用_2

这节主要介绍&#xff1a;标签和组件的ref属性&#xff0c;父子组件间的传递值&#xff0c;ts的接口定义&#xff0c;vue3的生命周期 1.标签的ref属性。 1.1ref属性就是给标签打标识用的&#xff0c;相当于html的id&#xff0c;但是在vue3中用id可能会乱&#xff0c;下面是ref…

ncc匹配(一,理论)

前头从来没用过ncc&#xff0c;基于形状匹配搞定后&#xff0c;又翻了翻learning opencv&#xff0c;他并不推荐ncc&#xff0c;而是力推emd&#xff0c;这也是当初我没考虑用ncc的原因。 当初看到ncc公式很复杂&#xff0c;也就忘了。 我的第一个匹配&#xff0c;是最笨的&a…