1.sentry[1]sentry是一个收集的跨平台错误监控和异常报告监控系统。Sentry主要用于应用服务的实时监控,收集相关应用服务运行状态下发生的异常或错误的日志信息,Sentry会通过自身集成的通知通道将错误信息推送给维护人员。哨兵收集的异常或错误日志会匹配报警规则,维护人员会在第一时间收到业务运行的异常信息,便于快速定位和解决问题。Sentry支持大部分语言和框架,使用起来也比较方便。2、哨兵的特点和优势:良好的产品体验和完善的功能。访问工作量较小。Sentry专注于Error、Exception、Crash。可以查看具体错误信息和调用栈,快速定位问题代码。提供丰富的上下文信息。SDK会自动上报基本信息,也支持上报自定义信息,方便排查问题。自动合并重复问题。重复的错误报告自动合并累积,避免开发人员在大量冗余信息中寻找错误线索。主动电子邮件提醒。无需再等待客户反馈来开始故障排除。可以通过主动上报的事件准确定位自身服务的问题或者第三方平台的问题(很多时候使用第三方平台,很难想到第三方的问题-服务出现问题时的方平台。)帮助前端项目更快地发现问题。缺点:部署依赖较多,大约30个容器依赖。维护成本高。当日均接口请求量较大时,sentry单实例部署会造成雪崩问题(大量请求发送给sentry,造成sentry响应延迟,Redis队列内存满,NGINX504等),会带来关闭服务本身。避免哨兵雪崩的优化保证了哨兵服务器的高可用。使用哨兵SaaS服务。自建哨兵实例高可用(成功率高)。在SDK上设置请求哨兵的超时时间,合理设置SDK的采样率。0.00:拒绝发送任何事件。1.00:发送所有事件。Sentry在高负载下要及时断开连接,比如优化采样率到0.00。SDK异步发送请求,避免同步阻塞。哨兵实例以环境隔离的方式使用。队列用于缓冲对哨兵请求的并发压力。3.组件架构哨兵组件架构。Sentry组件架构四、安装准备Sentry工作目录:mkdirsentry&&cd$_touchsentry.envdocker-compose.yml#分别填写以下内容DotEnvsentry.env:SENTRY_SECRET_KEY=0x4r6f^0ak5w_3)w1ybh2qbr4@-0tr33ey)lf*e5_cq55xae&5-)r*=9DB_PASSWORD="bw1knjWnUA"DB_USER=sentrydocker-composeinstallsentry在docker-compose.yml中填写如下内容:version:'2'volumes:pgdb:services:redis:image:redis:alpinerestart:always#命令:/bin/sh-c“redis-server--requirepass$$REDIS_HOST_PASSWORD”/dataenv_file:-sentry.envsentry:image:sentrylinks:-redis-postgresports:-9000:9000环境:SENTRY_SECRET_KEY:$$SENTRY_SECRET_KEYSENTRY_POSTGRES_HOST:postgresSENTRY_DB_USER:$$DB_USERSENTRY_DB_PASSWORD:$$DB_PASSWORDSENTRY_REDIS_HOST:redisenv_file:-sentry.envcron:image:sentry链接:-redis-postgres命令:"sentryruncron"环境:SENTRY_SECRET_KEY:$$SENTRY_SECRET_KEYSENTRY_POSTGRES_HOST:postgresSENTRY_DB_USER:$$DB_USERSENTRY_DB_PASSWORD:$$DB_PASSWORDSENTRY_REDIS_HOST:redisenv_file:-sentry.envworker:image:sentrylinks:-redis-postgrescommand:"sentryrunworker"环境:SENTRY_SECRET_KEY:$$SENTRY_SECRET_KEYSENTRY_POSTGRES_HOST:postgresSENTRY_DB_USER:$$DB_USERSENTRY_DB_PASSWORD:$$DB_PASSWORDSENTRY_REDIS_HOST:redisenv_file:-sentry.env生成哨兵秘钥填入sentry.env中的SENTRY_SECRET_KEYdockerrun--rmsentryconfiggenerate-secret-key初始化数据库以及创建登录用户。docker-composeup-d#部署sentry及相关依赖服务docker-composeexecsentrysentryupgrade##创建用户和密码5、sentrydashboard使用之前创建的用户和密码登录:sentrydashboardlogin创建项目:createaproject配置demo:配置demo就是这些。每种语言具体的SDK取决于相应的文档和源码。6.gosentry测试本例,通过创建go语言编写的demo服务来创建go项目,测试报错给sentry的效果:mkdirgo-sentry-gincd$_initializationmodule:gomodinitgo-gin-sentrygogetgithub.com/getsentry/sentry-gogogetgithub.com/getsentry/sentry-go/gin源码:packagemainimport("github.com/getsentry/sentry-go"sentrygin"github.com/getsentry/sentry-go/gin""github.com/gin-gonic/gin""net/http")funcmain(){err:=sentry.Init(sentry.ClientOptions{Dsn:"http://c0056580f26c469c8cc31d780d1995a8@localhost:9000/6",Environment:"dev",Release:"go-sentry-gin@0.0.1",Debug:true,})iferr!=nil{sentry.CaptureMessage("哨兵初始化失败。"+err.Error())}r:=gin.Default()r.Use(sentrygin.New(sentrygin.Options{}))r.Use(func(ctx*gin.Context){如果hub:=sentrygin.GetHubFromContext(ctx);hub!=nil{hub.Scope().SetTag("someRandomTag","maybeYouNeedIt")ctx.Next()}})r.GET("/demo",func(c*gin.Context){如果集线器:=哨兵杜松子酒。GetHubFromContext(c);集线器!=无{hub.WithScope(func(scope*sentry.Scope){scope.SetExtra("unwantedQuery","someQueryDataMaybe")hub.CaptureMessage("用户提供了不需要的查询字符串,但我们恢复得很好")})c.Status(http.StatusOK)}panic("erroroccurred")})r.Run()}运行后访问服务路由,错误日志信息会上报给sentry。打开项目详情页面,可以看到整个项目的状态信息。Go-gin-sentry相关信息7.参考IntroducingSnuba:Sentry'sNewSearchInfrastructure。转转商业前端错误监控系统(Sentry)战略升级。Sentry(v20)云原生架构探索,前端/后端监控和事件日志大数据分析,高性能,高可用,可扩展和可扩展的集群。事件存储过程。哨兵系列文章。参考文献[1]哨兵官网:https://sentry.io/welcome/。
