当前位置: 首页 > news >正文

golang 集成sentry:http.Client

http.Client 是 Go 标准库 HTTP 客户端实现, sentry-go也没有这个组件,所以需要自己实现。 我们只需要对 http.Transport 进行包装即可, 完整代码如下

package mainimport ("bytes""fmt""io""log""net/http""time""github.com/getsentry/sentry-go"
)type tracingTransport struct {http.RoundTripper
}func NewTracingTransport(roundTripper http.RoundTripper) *tracingTransport {return &tracingTransport{RoundTripper: roundTripper}
}func (t *tracingTransport) RoundTrip(req *http.Request) (*http.Response, error) {operationName := fmt.Sprintf("HTTP %s %s", req.Method, req.URL.String())span := sentry.StartSpan(req.Context(), operationName)defer span.Finish()span.SetTag("url", req.URL.String())if span.Data == nil {span.Data = make(map[string]interface{})}// reading body from the request body and fill it againvar body []bytevar err errorif req.Body != nil {body, err = io.ReadAll(req.Body)if err != nil {return nil, err}}// Be careful with including sensitive information in the span,// request body and response may have private user data, which we wouldn't want to expose,// authorization header also is a good example of sensitive data.span.Data["body"] = string(body)req.Body = io.NopCloser(bytes.NewBuffer(body))// adding sentry header for distributed tracingreq.Header.Add("sentry-trace", span.TraceID.String())response, err := t.RoundTripper.RoundTrip(req)span.Data["http_code"] = response.StatusCode// could additionally add the response to the span datareturn response, err
}func main() {err := sentry.Init(sentry.ClientOptions{Debug:              true,Dsn:                "https://a5eac4fa3396cbfac8fb4baa6a9c03a3@o4504291071688704.ingest.sentry.io/4506715873804288",AttachStacktrace:   true,EnableTracing:      true,SampleRate:         1.0,TracesSampleRate:   1.0,ProfilesSampleRate: 1.0,})if err != nil {log.Fatalf("sentry.Init: %s", err)}defer sentry.Flush(2 * time.Second)client := &http.Client{Transport: NewTracingTransport(http.DefaultTransport),}res, err := client.Get("http://httpbin.org/get")if err != nil {log.Fatalf("client Get: %s", err)}defer res.Body.Close()body, err := io.ReadAll(res.Body)if err != nil {log.Fatalf("io.ReadAll: %s", err)}fmt.Println(string(body))
}

参考:
https://anymindgroup.com/news/tech-blog/15724/

http://www.lryc.cn/news/300359.html

相关文章:

  • 设计链表(不难,代码稍微多一点)
  • [GXYCTF2019]禁止套娃
  • ubuntu下如何查看显卡及显卡驱动
  • 【图论经典题目讲解】CF786B - Legacy 一道线段树优化建图的经典题目
  • 【AIGC】Stable Diffusion的采样器入门
  • 【Python】通过conda安装Python的IDE
  • 基于HTML5实现动态烟花秀效果(含音效和文字)实战
  • 「数据结构」栈和队列
  • 【机器学习笔记】5 机器学习实践
  • C++ //练习 7.5 在你的Person类中提供一些操作使其能够返回姓名和住址。这些函数是否应该是const的呢?解释原因。
  • python系统学习Day2
  • 学习笔记——ENM模拟
  • 数值类型的运算方式总结
  • 【Redis快速入门】Redis三种集群搭建配置(主从集群、哨兵集群、分片集群)
  • [嵌入式系统-14]:常见实时嵌入式操作系统比较:RT-Thread、uC/OS-II和FreeRTOS、Linux
  • 基于AI Agent探讨:安全领域下的AI应用范式
  • Stable Diffusion 模型下载:ToonYou(平涂卡通)
  • 机器学习:分类决策树(Python)
  • 红队打靶练习:HACK ME PLEASE: 1
  • 《VulnHub》GoldenEye:1
  • html的表格标签
  • 蓝桥杯(Web大学组)2022省赛真题:展开你的扇子
  • 复习基础知识1
  • java8-用流收集数据-6
  • [前端开发] JavaScript基础知识 [上]
  • 初识Qt | 从安装到编写Hello World程序
  • 机器学习:过拟合和欠拟合的介绍与解决方法
  • 变分自编码器(VAE)PyTorch Lightning 实现
  • 设备驱动开发_1
  • C语言位域(Bit Fields)知识点精要解析