什么是Sentry?Sentry是一家开源公司,提供了一个应用程序监视平台,可以帮助您实时识别问题。 在这里,我们涵盖了有关产品,平台集成和自托管Sentry的所有内容。 【通俗讲的讲】 我们可以使用Sentry平台实时地监控我们的应用或服务、并且可以收集相关运行时错误或异常日志信息, 在第一时间将错误信息推送至我们的后台或邮件组等。这样不仅能主动帮我们第一时间发现线上问题, 而且很好的保留了异常发生时的现场,更有助于我们快速定位问题根源,提高解决问题的效率,逐步提高产品的稳定性和用户体验。 官网及文档https:sentry。iowelcomehttps:docs。sentry。iohttps:docs。sentry。ioguideshttps:docs。sentry。ioplatformsgo Sentry的原理 在Sentry后台注册相关账号并使用关联Dsnkey。(该key是关联应用和后台平台的桥梁) 在我们的应用中潜入对应语言的SDK埋点,并关联上述 简单到仅用一个init方法就可以搞定。 捕获异常并埋点,将异常信息第一时间推送至后台平台。 Sentry平台的优势 支持各种主流语言或框架。 跨平台性较好,并支持容器化安装搭建等。 平台自建成本低、部署简单、集成方便。 SentryGolang版的支持 官方文档https:docs。sentry。ioplatformsgo fasthttp框架支持https:docs。sentry。ioplatformsgofasthttp 平台搭建与实践 虚拟机环境 CentOSLinuxrelease7。6。1810(Core) SentryDocker镜像获取 https:github。comgetsentrydockersentry https:github。comgetsentryonpremise 安装部署 https:github。comdockerlibrarydocstreemastersentry。dockerrundnamesentryredisredis。dockerrundnamesentrypostgresePOSTGRESPASSWORDsecretePOSTGRESUSERsentrypostgres。dockerrunrmsentryconfiggeneratesecretkey这一步会生成一个密钥key,比如l)ti9v!pt!hpz3g33tq3hy2afpvsda6ghr24)k4q,先记下来,后面步骤中多个容器会共享该key。dockerrunitrmeSENTRYSECRETKEYl)ti9v!pt!hpz3g33tq3hy2afpvsda6ghr24)k4qlinksentrypostgres:postgreslinksentryredis:redissentryupgrade5。dockerrundp9090:9000namemysentryeSENTRYSECRETKEYl)ti9v!pt!hpz3g33tq3hy2afpvsda6ghr24)k4qlinksentryredis:redislinksentrypostgres:postgressentry6。dockerrundnamesentrycroneSENTRYSECRETKEYl)ti9v!pt!hpz3g33tq3hy2afpvsda6ghr24)k4qlinksentrypostgres:postgreslinksentryredis:redissentryruncron。dockerrundnamesentryworkereSENTRYSECRETKEYl)ti9v!pt!hpz3g33tq3hy2afpvsda6ghr24)k4qlinksentrypostgres:postgreslinksentryredis:redissentryrunworker上述几步完成后,查看下刚才创建的容器以及运行状态是否完好:tmpdockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESed2439c527csentryentrypoint。shrunhoursagoUphours9000tcpsentryworkerf3779877d102sentryentrypoint。shrunhoursagoUphours9000tcpsentrycron9c190bd613a6sentryentrypoint。shrunhoursagoUphours0。0。0。0:90909000tcpmysentry188c744c2f21postgresdockerentrypoint。shoursagoUphours5432tcpsentrypostgresabad0564ca2bredisdockerentrypoint。shoursagoUphours6379tcpsentryredis然后检查下宿主机防火墙或安全组策略,放行上述映射的9090端口; 在浏览器中访问并测试 http:localhost:9090authloginsentry 访问成功后登陆 如果成功,您会看到如下页面 然后用上述第4步中填入第账户登陆并配置,成功后进入首页 简体中文设置 打开左上角第个人中心,然后点击Usersettingslanguage选择简体中文即可。 然后可以创建一个团队,如名称为server 然后创建一个项目,如gosentrytest 将sdk潜入Golang应用,如gosentrytest。goimport(errorstimegithub。comgetsentrysentrygo)funcmain{sentry。Init(sentry。ClientOptions{Dsn:http:60e443996c464def804082d3c7e04de3localhost:90902,})sentry。CaptureException(errors。New(myerror))Sincesentryemitseventsinthebackgroundweneedtomakesuretheyaresentbeforeweshutdownsentry。Flush(time。Second5)} 本地运行并模拟错误将日志上报 gorungosentrytest。go 刷新后台页面,看到刚刚咱们应用上传的error已经在issues列表中了,如图 并且还支持直接潜入到web框架,如以fasthttp为例:import(fmtnethttpgithub。comgetsentrysentrygosentryfasthttpgithub。comgetsentrysentrygofasthttp)ToinitializeSentryshandler,youneedtoinitializeSentryitselfbeforehandiferr:sentry。Init(sentry。ClientOptions{Dsn:https:079843729765443f982ef8f3aea18766o396662。ingest。sentry。io5250281,});err!nil{fmt。Printf(Sentryinitializationfailed:v,err)}CreateaninstanceofsentryfasthttpsentryHandler:sentryfasthttp。New(sentryfasthttp。Options{})Aftercreatingtheinstance,youcanattachthehandlerasoneofyourmiddlewarefastHTTPHandler:sentryHandler。Handle(func(ctxfasthttp。RequestCtx){panic(ytho)})fmt。Println(ListeningandservingHTTPon:3000)Andrunitiferr:fasthttp。ListenAndServe(:3000,fastHTTPHandler);err!nil{panic(err)} 直接使用官方提供的admin后台做测试或学习 上述是自己完整到搭建一下sentry,如果仅是为了学习或测试一下,并想节省时间,则可以直接在官方的后台https:sentry。iosignup 注册一个账号,然后将sdk潜入到自己的测试应用中看效果,如packagemainimport(logtimegithub。comgetsentrysentrygo)funcmain{err:sentry。Init(sentry。ClientOptions{EithersetyourDSNhereorsettheSENTRYDSNenvironmentvariable。Dsn:https:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。ingest。sentry。ioxxxxxxx,这里需要替换为您自己的DsnEnableprintingofSDKdebugmessages。Usefulwhengettingstartedortryingtofiguresomethingout。Debug:true,})iferr!nil{log。Fatalf(sentry。Init:s,err)}Flushbufferedeventsbeforetheprogramterminates。Setthetimeouttothemaximumdurationtheprogramcanaffordtowait。defersentry。Flush(time。Second)sentry。CaptureException(自定义运行时错误1)sentry。CaptureMessage(自定义error)} 效果如下