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可以直接分析这串内容,代码如下所示:

java 复制代码
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的源码

java 复制代码
public static SegmentObject parseFrom(byte[] data) throws InvalidProtocolBufferException {
    return (SegmentObject)PARSER.parseFrom(data);
}

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

  1. 反序列化

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

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

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

go 复制代码
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)

}
相关推荐
谢亮_vipxieliang5 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法
H.莓飛5 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
xxwl5855 小时前
数据结构知识点和代码实现总结(C语言实现)
c语言·开发语言·数据结构
microrain5 小时前
先应答,再入库:SagooIoT 接入 GB/T 32960 的四层宿主改造
物联网·golang·开源·sagooiot
code2cat8 小时前
Java进阶篇之AtomicMarkableReference:引用还在,标记已经改变
java·开发语言·cas·并发编程·逻辑删除
CappuccinoRose8 小时前
FormData数据处理
开发语言·前端·javascript·表单数据
Zguigo8 小时前
【CUDA8】第一个CUDA C++ Kernel --vector add
java·开发语言·c++
-Marks-9 小时前
【C++编程】STL容器(二)--- vector底层模拟实现(常用接口实现 | 扩容机制 | 深浅拷贝 | 迭代器失效)
开发语言·c++·vector·内存管理·迭代器失效·vector底层模拟实现
Shadow(⊙o⊙)9 小时前
C++11并发支持库
开发语言·c++
一技安身9 小时前
【java】JDK8 + JDK17 绿色解压共存方案-全程不修改任何系统环境变量
java·开发语言