golang实时错误监控与性能追踪插件库sentry-go的使用

Golang实时错误监控与性能追踪插件库sentry-go的使用

Sentry Go SDK简介

sentry-go是Sentry官方提供的Go语言客户端SDK,用于实时错误监控和性能追踪。它是raven-go包的下一代替代品。

Sentry Logo

安装

使用go get命令安装最新版本的sentry-go:

go get github.com/getsentry/sentry-go@latest

基本配置与使用

初始化Sentry

package main

import (
	"log"
	"github.com/getsentry/sentry-go"
)

func main() {
	// 初始化Sentry SDK
	err := sentry.Init(sentry.ClientOptions{
		Dsn: "your-dsn-here", // 替换为你的Sentry DSN
		// 设置环境
		Environment: "production",
		// 设置发布版本
		Release: "my-project@1.0.0",
		// 启用性能监控
		EnableTracing: true,
		// 设置采样率 (0.0 - 1.0)
		TracesSampleRate: 1.0,
	})
	
	if err != nil {
		log.Fatalf("sentry.Init: %s", err)
	}
	
	// 确保所有事件在程序退出前发送
	defer sentry.Flush(2 * time.Second)
	
	// 你的应用代码...
}

基本错误监控示例

package main

import (
	"errors"
	"log"
	"github.com/getsentry/sentry-go"
)

func main() {
	err := sentry.Init(sentry.ClientOptions{
		Dsn: "your-dsn-here",
	})
	if err != nil {
		log.Fatalf("sentry.Init: %s", err)
	}
	defer sentry.Flush(2 * time.Second)

	// 捕获普通错误
	sentry.CaptureException(errors.New("something went wrong"))

	// 捕获带额外信息的错误
	eventID := sentry.CaptureException(errors.New("something went wrong with context"))
	log.Printf("Event ID: %s", eventID)

	// 手动发送消息
	sentry.CaptureMessage("This is a test message")
}

HTTP服务器监控示例

package main

import (
	"fmt"
	"net/http"
	"time"
	
	"github.com/getsentry/sentry-go"
	sentryhttp "github.com/getsentry/sentry-go/http"
)

func main() {
	// 初始化Sentry
	err := sentry.Init(sentry.ClientOptions{
		Dsn: "your-dsn-here",
		EnableTracing: true,
		TracesSampleRate: 1.0,
	})
	if err != nil {
		panic(err)
	}
	defer sentry.Flush(2 * time.Second)

	// 创建Sentry HTTP中间件
	sentryHandler := sentryhttp.New(sentryhttp.Options{})

	// 创建HTTP处理程序
	handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// 从请求上下文中获取span
		span := sentry.TransactionFromContext(r.Context())
		if span != nil {
			defer span.Finish()
		}

		// 模拟业务逻辑
		_, err := fmt.Fprintf(w, "Hello, World!")
		if err != nil {
			sentry.CaptureException(err)
			http.Error(w, "Internal Server Error", http.StatusInternalServerError)
			return
		}
	})

	// 使用Sentry中间件包装处理程序
	http.Handle("/", sentryHandler.Handle(handler))

	// 启动服务器
	fmt.Println("Server listening on port 3000")
	http.ListenAndServe(":3000", nil)
}

性能追踪

package main

import (
	"context"
	"time"
	
	"github.com/getsentry/sentry-go"
)

func performTask(ctx context.Context) {
	// 创建子span
	span := sentry.StartSpan(ctx, "task", sentry.WithTransactionName("Perform Task"))
	defer span.Finish()

	// 模拟工作
	time.Sleep(100 * time.Millisecond)
	
	// 记录额外数据
	span.SetTag("task.type", "background")
	span.SetData("attempt", 1)
}

func main() {
	err := sentry.Init(sentry.ClientOptions{
		Dsn: "your-dsn-here",
		EnableTracing: true,
		TracesSampleRate: 1.0,
	})
	if err != nil {
		panic(err)
	}
	defer sentry.Flush(2 * time.Second)

	// 创建事务
	ctx := context.Background()
	transaction := sentry.StartTransaction(ctx, "main")
	defer transaction.Finish()

	// 将事务放入上下文
	ctx = transaction.Context()

	// 执行任务
	performTask(ctx)
}

支持的框架

sentry-go支持多种流行的Go框架,包括:

  • net/http
  • echo
  • fasthttp
  • fiber
  • gin
  • iris
  • logrus
  • negroni
  • slog
  • zerolog

资源

注意事项

  1. 确保在生产环境中设置合理的TracesSampleRate值,通常小于1.0
  2. 使用defer sentry.Flush()确保所有事件在程序退出前发送
  3. 可以通过环境变量SENTRY_DSNSENTRY_RELEASESENTRY_ENVIRONMENT配置SDK

更多关于golang实时错误监控与性能追踪插件库sentry-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实时错误监控与性能追踪插件库sentry-go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Sentry-go: Golang实时错误监控与性能追踪指南

Sentry-go是Sentry官方提供的Golang SDK,用于实时错误监控和性能追踪。下面详细介绍其使用方法。

安装

go get github.com/getsentry/sentry-go

基本配置

package main

import (
	"log"
	"time"
	"github.com/getsentry/sentry-go"
)

func main() {
	// 初始化Sentry
	err := sentry.Init(sentry.ClientOptions{
		Dsn: "https://your-public-key@sentry.io/your-project-id",
		// 设置环境
		Environment: "production",
		// 设置版本
		Release: "myapp@1.0.0",
		// 采样率 (0.0 - 1.0)
		TracesSampleRate: 1.0,
		// 启用性能监控
		EnableTracing: true,
	})
	
	if err != nil {
		log.Fatalf("sentry.Init: %s", err)
	}
	
	// 确保所有事件都发送完毕
	defer sentry.Flush(2 * time.Second)
	
	// 你的应用代码...
}

错误监控

捕获异常

func riskyFunction() {
	defer func() {
		if err := recover(); err != nil {
			sentry.CurrentHub().Recover(err)
			log.Printf("捕获到panic: %v", err)
		}
	}()
	
	// 可能引发panic的代码
	panic("出错了!")
}

手动捕获错误

func processData(data string) error {
	if data == "" {
		err := errors.New("空数据")
		sentry.CaptureException(err)
		return err
	}
	// 处理数据...
	return nil
}

性能追踪

HTTP请求追踪

import (
	"net/http"
	"github.com/getsentry/sentry-go"
	sentryhttp "github.com/getsentry/sentry-go/http"
)

func main() {
	// 初始化Sentry...

	// 创建Sentry HTTP中间件
	sentryHandler := sentryhttp.New(sentryhttp.Options{
		Repanic: true,
	})

	http.Handle("/", sentryHandler.Handle(
		http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			// 你的处理逻辑
			w.Write([]byte("Hello World!"))
		}),
	))

	http.ListenAndServe(":8080", nil)
}

自定义事务

func complexOperation() {
	// 开始一个事务
	transaction := sentry.StartTransaction(context.Background(), "complex-operation")
	defer transaction.Finish()

	// 设置事务状态
	transaction.Status = sentry.SpanStatusOK

	// 创建子span
	span := transaction.StartChild("sub-operation")
	time.Sleep(100 * time.Millisecond) // 模拟耗时操作
	span.Finish()

	// 另一个子span
	span2 := transaction.StartChild("db-query")
	time.Sleep(50 * time.Millisecond) // 模拟数据库查询
	span2.Finish()
}

添加上下文信息

func processUser(userID string) {
	// 设置用户信息
	sentry.ConfigureScope(func(scope *sentry.Scope) {
		scope.SetUser(sentry.User{
			ID: userID,
			Email: "user@example.com",
		})
		
		// 添加标签
		scope.SetTag("feature", "user-processing")
		
		// 添加额外数据
		scope.SetExtra("user_data", map[string]interface{}{
			"premium": true,
			"signup_date": "2023-01-01",
		})
	})
	
	// 业务逻辑...
}

最佳实践

  1. 环境区分:确保为开发、测试和生产环境使用不同的DSN或至少设置不同的环境标签

  2. 采样率:在生产环境中适当设置采样率以避免过多数据

    TracesSampleRate: 0.2, // 20%的请求会被追踪
    
  3. 敏感数据过滤:配置beforeSend钩子过滤敏感信息

    sentry.Init(sentry.ClientOptions{
        Dsn: "...",
        BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event {
            // 过滤敏感信息
            for i := range event.Request.Data {
                if strings.Contains(i, "password") {
                    event.Request.Data[i] = "[FILTERED]"
                }
            }
            return event
        },
    })
    
  4. 本地开发:在开发环境中禁用Sentry或设置较低的采样率

Sentry-go为Golang应用提供了强大的错误监控和性能追踪能力,通过合理配置可以显著提高应用的可靠性和可观测性。

回到顶部