golang 集成sentry:http.Client

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

package main

import (
	"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 again
	var body []byte
	var err error
	if 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 tracing
	req.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 data

	return 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/

相关推荐

  1. golang 集成sentry:PostgreSQL

    2024-02-11 22:04:02       28 阅读
  2. golang 集成logrus日志框架

    2024-02-11 22:04:02       39 阅读
  3. golang 集成sentry:http.Client

    2024-02-11 22:04:02       30 阅读
  4. Golang使用redis在 Gin 框架中集成使用 go-redis

    2024-02-11 22:04:02       36 阅读

最近更新

  1. Matlab 使用

    2024-02-11 22:04:02       0 阅读
  2. AI学习指南机器学习篇-层次聚类原理

    2024-02-11 22:04:02       0 阅读
  3. k8s-第一节-minikube

    2024-02-11 22:04:02       1 阅读
  4. 基于gunicorn+flask+docker模型高并发部署

    2024-02-11 22:04:02       1 阅读
  5. 数据无忧:Ubuntu 系统迁移备份全指南

    2024-02-11 22:04:02       1 阅读
  6. 3.配置MkDocs

    2024-02-11 22:04:02       1 阅读
  7. AI学习指南机器学习篇-层次聚类距离度量方法

    2024-02-11 22:04:02       1 阅读
  8. 中介子方程五十

    2024-02-11 22:04:02       1 阅读

热门阅读

  1. 20190726 ApacheHttpClient-自签证书与系统证书共存

    2024-02-11 22:04:02       31 阅读
  2. MySQL-管理

    2024-02-11 22:04:02       31 阅读
  3. 【力扣每日一题】力扣1696跳跃游戏VI

    2024-02-11 22:04:02       36 阅读
  4. Linux 服务管理两种方式service和systemctl

    2024-02-11 22:04:02       26 阅读
  5. 掌握rm命令:Linux文件删除的艺术与安全指南

    2024-02-11 22:04:02       33 阅读
  6. Python列表中的insert功能及用法举例

    2024-02-11 22:04:02       36 阅读
  7. Hadoop运行环境搭建

    2024-02-11 22:04:02       32 阅读