参考 https://incident.io/blog/golang-errors, 可以去掉冗余的stack trace,在sentry issue页面更容易找到问题
见 https://github.com/Shujie-Tan/go-redis-sentry
https://github.com/TheZeroSlave/zapsentry
官方提供了一个简单的hook, https://github.com/getsentry/sentry-go/blob/master/logrus/logrusentry.go
不过我感觉 调用log.info自动添加为breadcrumb会更好用, 在https://github.com/makasim/sentryhook/tree/master的基础上简单修改实现了一下; 我将warning以上日志作为event, info信息作为breadcrumbs帮助排查问题; 代码如下
// Fire xx
func (hook Hook) Fire(entry *logrus.Entry) error {
if entry.Level == logrus.InfoLevel {
return hook.addBreadcrumb(entry)
}
// 其他日志上传到sentry
return nil
}
func (hook Hook) addBreadcrumb(entry *logrus.Entry) error {
data := make(map[string]interface{})
for k, v := range entry.Data {
data[k] = v
}
sentry.AddBreadcrumb(&sentry.Breadcrumb{
Message: entry.Message,
Data: data,
Level: levelMap[entry.Level],
})
return nil
}
可以直接使用 http middleware, 这样的问题是performance那里transaction不会根据路径归类, 导致只要路径参数不通就会生成新的transaction条目,可以简单修改handle中的 startTransaction参数解决, 例如
# import "github.com/gorilla/mux"
routeTemp, err := mux.CurrentRoute(r).GetPathTemplate()
if err != nil {
routeTemp = mux.CurrentRoute(r).GetName()
}
// We don't mind getting an existing transaction back so we don't need to
// check if it is.
transaction := sentry.StartTransaction(ctx,
fmt.Sprintf("%s %s", r.Method, routeTemp),
options...,
)
todo: