Go - 实现项目内链路追踪(二)

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: Go - 实现项目内链路追踪(二)

上篇文章 Go - 实现项目内链路追踪 分享了,通过 链路 ID 可以将 请求信息响应信息调用第三方接口的信息调试信息执行的 SQL 信息执行的 Redis 信息 串起来,记录的具体参数在文件中都有介绍。

这篇文章在上面的基础上,新增 2 个功能点

  1. 新增将 调用 gRPC 接口信息 记录到 Trace 中;
  2. 新增对记录的敏感信息进行脱敏处理;

调用 gRPC 接口信息

记录参数

Object,结构如下:

type Grpc struct {
 Timestamp   string                 `json:"timestamp"`             // 时间,格式:2006-01-02 15:04:05
 Addr        string                 `json:"addr"`                  // 地址
 Method      string                 `json:"method"`                // 操作方法
 Meta        metadata.MD            `json:"meta"`                  // Mate 信息
 Request     map[string]interface{} `json:"request"`               // 请求信息
 Response    map[string]interface{} `json:"response"`              // 返回信息
 CostSeconds float64                `json:"cost_seconds"`          // 执行时间(单位秒)
 Code        string                 `json:"err_code,omitempty"`    // 错误码
 Message     string                 `json:"err_message,omitempty"` // 错误信息
}

如何收集参数

封装了一个 grpclient 包:

  • 支持设置 DialTimeout
  • 支持设置 UnaryInterceptor
  • 支持设置 KeepaliveParams
  • 支持设置 TransportCredentials

主要是在拦截器 Interceptor 中进行收集。

示例代码

实例化 gRPC client

// TODO 需从配置文件中获取
target := "127.0.0.1:9988"
secret := "abcdef"
clientInterceptor := NewClientInterceptor(func(message []byte) (authorization string, err error) {
 return GenerateSign(secret, message)
})
conn, err := grpclient.New(target,
 grpclient.WithKeepAlive(keepAlive),
 grpclient.WithDialTimeout(time.Second*5),
 grpclient.WithUnaryInterceptor(clientInterceptor.UnaryInterceptor),
)
return &clientConn{
 conn: conn,
}, err

调用具体方法

// 核心:传递 core.Context 给 Interceptor 使用
client := hello.NewHelloClient(d.grpconn.Conn())
client.SayHello(grpc.ContextWithValueAndTimeout(c, time.Second*3), &hello.HelloRequest{Name: "Hello World"})

敏感信息脱敏

敏感信息脱敏又称为动态数据掩码(Dynamic Data Masking,简称为DDM)能够防止把敏感数据暴露给未经授权的用户。

根据项目要求可以约定一些规范,例如:

类型 要求 示例 说明
手机号 前 3 后 4 132****7986 定长 11 位数字
邮箱地址 前 1 后 1 l**w@gmail.com 仅对 @ 之前的邮箱名称进行掩码
姓名 隐姓 *鸿章 将姓氏隐藏
密码 不输出 ******
银行卡卡号 前 6 后 4 622888******5676 银行卡卡号最多 19 位数字
身份证号 前 1 后 1 1******7 定长 18 位

如何实现

我现在的实现方案是:自定义 MarshalJSON(),欢迎大佬们提出更好的方案。

示例代码

// 定义 Mobile 类型
type Mobile string
// 自定义 MarshalJSON()
func (m Mobile) MarshalJSON() ([]byte, error) {
 if len(m) != 11 {
  return []byte(`"` + m + `"`), nil
 }
 v := fmt.Sprintf("%s****%s", m[:3], m[len(m)-4:])
 return []byte(`"` + v + `"`), nil
}

测试

type message struct {
 Mobile    ddm.Mobile   `json:"mobile"`
}
msg := new(message)
msg.Mobile = ddm.Mobile("13288889999")
marshal, _ := json.Marshal(msg)
fmt.Println(string(marshal))
// 输出:{"mobile":"132****9999"}

小结

本篇文章新增了 2 个实用的功能点,大家赶紧使用起来吧。关于 敏感信息脱敏 期待各位大佬不吝赐教,提出更好的解决方案,谢谢!


以上代码都在 go-gin-api 项目中,地址:https://github.com/xinliangnote/go-gin-api

相关实践学习
基于OpenTelemetry构建全链路追踪与监控
本实验将带领您快速上手可观测链路OpenTelemetry版,包括部署并接入多语言应用、体验TraceId自动注入至日志以实现调用链与日志的关联查询、以及切换调用链透传协议以满足全链路打通的需求。
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
目录
相关文章
|
4月前
|
存储 监控 Go
带你十天轻松搞定 Go 微服务系列(九、链路追踪)
带你十天轻松搞定 Go 微服务系列(九、链路追踪)
|
4月前
|
JSON 运维 Go
Go 项目配置文件的定义和读取
Go 项目配置文件的定义和读取
|
1月前
|
Go API 数据库
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
102 4
|
1月前
|
存储 JSON Go
如何在 Go 项目中隐藏敏感信息,比如避免暴露用户密码?
在Go语言开发中,用户信息管理常涉及敏感数据如密码的处理。为防止这些数据暴露给客户端,本文介绍了三种方法:使用JSON标签忽略字段、自定义序列化逻辑、使用数据传输对象(DTO),以确保用户数据的安全性。通过这些方法,可以有效控制数据输出,避免敏感信息泄露。
36 1
|
1月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
85 1
|
2月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
90 11
|
2月前
|
Go
使用go语言将A助手加入项目中
使用go语言将A助手加入项目中
27 2
|
2月前
|
存储 Kubernetes Go
Go语言项目组织架构
Go语言项目组织架构
|
4月前
|
API
企业项目迁移go-zero实战(二)
企业项目迁移go-zero实战(二)
|
4月前
|
消息中间件 中间件 API
玩转 Go 链路追踪
玩转 Go 链路追踪