Golang版本处理Skywalking Trace上报数据问题

 更新时间:2026年06月23日 09:25:17   作者:简单随风  
这篇文章主要介绍了Golang版本处理Skywalking Trace上报数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Tips: 中间记录了解决问题的过程,如不感兴趣可直接跳至结尾

1、首先去es里查询skywalking trace的元数据

可以拿到一串base64加密后的data_binary(直接解密不能用,会有乱码,可参考https://github.com/apache/skywalking/issues/7423)

2、对data_binary进行base64解密

skywalking提供了一个java的sdk可以直接分析这串内容,代码如下所示:

String dataBinary= "xxxxxx"
byte[]decode = Base64.getDecoder().decode(dataBinary);
SegmentObject segmentObject = SegmentObject.parseFrom(decode);
System.out.println(JSON.toJSONString(segmentObject));

segmentObject内有我们所有需要的数据,但golang并未找到类似的函数,所以我们需要用golang实现类似parseFrom()的逻辑,我们先看一下java的源码

public static SegmentObject parseFrom(byte[] data) throws InvalidProtocolBufferException {
    return (SegmentObject)PARSER.parseFrom(data);
}

它的本质就是调用com.google.protobuf提供的parseFrom()函数,所以我们只需要用golang版本的proto去反序列化base64解密后的byte即可

3、反序列化

我先尝试了将java版本的SegmentObject转成json,再转成proto文件,然后生成pb.go,用这里生成的SegmentObject去进行反序列化,发现并不可行

最后是通过skywalking-go版本agent的源码,找到了对应的pb文件

然后使用里面已经编译好的SegmentObject对象即可

import (
	"encoding/base64"
	"fmt"
	"google.golang.org/protobuf/proto"
	"testing"
	agent "skywalking.apache.org/repo/goapi/collect/language/agent/v3"
)

func TestSkyWalking(t *testing.T) {
	dataBinary := "xxx"
	by, err := base64.StdEncoding.DecodeString(dataBinary)
	if err != nil {
		t.Error(err)
	}
	segmentObject := &agent.SegmentObject{}
	err = proto.Unmarshal(by, segmentObject)
	fmt.Printf("%v", segmentObject)

}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一文搞懂Go语言标准库strconv

    一文搞懂Go语言标准库strconv

    strconv包实现了基本数据类型和其字符串表示的相互转换,本文主要介绍Go语言标准库strconv,想要学习strconv标准库的可以了解一下
    2023-04-04
  • Golang调用FFmpeg转换视频流的实现

    Golang调用FFmpeg转换视频流的实现

    本文主要介绍了Golang调用FFmpeg转换视频流,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • go语言中使用timer的常用方式

    go语言中使用timer的常用方式

    这篇文章主要介绍了go语言中使用timer的常用方式,实例分析了三种常用的使用timer的方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Go语言使用Request,Response处理web页面请求

    Go语言使用Request,Response处理web页面请求

    这篇文章主要介绍了Go语言使用Request,Response处理web页面请求,需要的朋友可以参考下
    2022-04-04
  • golang http 连接超时和传输超时的例子

    golang http 连接超时和传输超时的例子

    今天小编就为大家分享一篇golang http 连接超时和传输超时的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • gtoken替换jwt实现sso登录的排雷避坑

    gtoken替换jwt实现sso登录的排雷避坑

    这篇文章主要为大家介绍了gtoken替换jwt实现sso登录的排雷避坑,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • golang并发安全及读写互斥锁的示例分析

    golang并发安全及读写互斥锁的示例分析

    这篇文章主要为大家介绍了golang并发安全及读写互斥锁的示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • GO语言如何手动处理TCP粘包详解

    GO语言如何手动处理TCP粘包详解

    最近在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?下面这篇文章就来给大家介绍了关于GO语言如何手动处理TCP粘包的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴。
    2017-12-12
  • GO语言 复合类型专题

    GO语言 复合类型专题

    这篇文章主要介绍了GO语言 复合类型的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Go语言的http/2服务器功能及客户端使用

    Go语言的http/2服务器功能及客户端使用

    Golang 有一个很棒的自带 http 服务器软件包,不用说就是: net/http, 它非常简单,但是功能非常强大。下面这篇文章主要给大家介绍了关于Go语言的http/2服务器功能及客户端使用的相关资料,需要的朋友可以参考下
    2018-09-09

最新评论