SkyWalking持久化追踪数据及自定义链路追踪的实现

793 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

一、SkyWalking持久化追踪数据

SkyWalking默认使用内置的H2内存数据库进行数据的,如果服务重启,数据就会丢失这样历史追踪的数据就无法查看了,因此需要将H2数据库改为mysql数据库,将数据持久化,这样就不用担心服务重启,而且后期排查问题的时候也有数据可以查询。并且如果SkyWalking数据存储在内存中,如果SkyWalking长时间运行未重启,就会占用大量内存,影响系统整体性能。

1-1、使用mysql持久化

打开配置文件,修改H2为mysql

image.png

在storage:selector这个地方将H2改为mysql

image.png

修改mysql配置信息

image.png

连接数据库创建swtset库,SkyWalking只需要我们创建数据库即可,不用创建表,启动SkyWalking的时候会自动帮助我们创建好。

image.png

重启SkyWalking,访问SkyWalking控制台,发现界面的UI和数据是有问题的\color{red}{**重启SkyWalking,访问SkyWalking控制台,发现界面的UI和数据是有问题的**}

image.png

1-2、使用mysql存储的错误处理

查看日志发现报错了,看错误可以看到确实mysql驱动如下:

image.png

这时候就需要自己拷贝一个mysql驱动,复制到opa-libs中

image.png

再次重启SkyWalking服务,并且访问接口信息,可以看到相关数据已经被收集到

image.png

查看数据库,创建了一些数据库表

image.png

再次重启SkyWalking服务,不用访问接口,界面就有相关信息,这样就证明SkyWalking已经从mysql来获取数据了。

image.png

二、自定义链路追踪

使用SkyWalking默认的链路追踪只能记录接口相关数据,比如GateWay调用order服务的/order/get。然后order服务调用数据库的信息。其中我们在业务中实现的就无法追踪,下面就来处理一下使业务代码也能实现追踪。

下面来实现一个下单服务,通过访问GateWay,调用order/add接口,然后在order/add的service业务层调用stock服务的减库存业务。

在不配置自定义链路追踪的情况下,先来看下链路都可以显示哪些信息。

image.png image.png

通过以上信息是无法查看到业务层的追踪信息的。

2-1、引入依赖

因为调用的是GateWay调用order服务,然后order服务通过feign调用stock服务,我们就先给order服务添加下面的依赖。

<!-- SkyWalking  工具类-->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.5.0</version>
</dependency>

2-2、@Trace将方法加入追踪链路

如果一个业务方法想在ui界面的跟踪链路上显示出来,只需要在业务方法上加上@Trace注解即可

image.png

2-3、重启服务、访问接口,查看业务代码链路追踪信息

这样就可以看到service业务端的追踪信息了。 image.png

点击上图标红的数据就可以查看业务追踪详情了,如下

image.png

2-4、在业务实现端代码加入@Tags或@Tag

通过以上操作虽然可以看到追踪的信息了,但是传入什么参数,返回什么数据还是看不到,实际上可以通过使用@Tags或者Tag来实现

@Trace
@Tags({@Tag(key = "param", value = "arg[0]"),
        @Tag(key = "getById", value = "returnedObj")})
 public Order selectByPrimaryKey(Integer id){
     return  orderMapper.selectByPrimaryKey(id);
 }

 @Trace
 @Tag(key="",value = "returnedObj")
 public List<Order> list(){
     return orderMapper.selectAll();
 }

如果只追踪返回值或者参数,可以用@Tag即可
使用@Tag时,当value="returnedObj"时代表追踪返回值;当value="arg[0]"时代表追踪传入的第一个参数。

使用@Tags时,里面就可以通过设置@Tag来设置参数和返回值。

2-5、再次重启服务,查看追踪数据。

虽然追踪到数据了,但是返回值是对象的内存地址 image.png

这是因为Order没有重写toString方法,我们重写toString方法

image.png

重启服务再次查看

image.png

这样就可以看到server业务端的追踪信息了。