微服务架构统一异常监控Sentry

Sentry是一个跨平台的错误监控系统,用于实时监控应用服务并收集异常日志,帮助快速定位和解决问题。它支持多种语言和框架,提供丰富的上下文信息,但部署和维护成本较高。当面临高负载时,可通过优化采样率、设置超时和使用异步请求来防止雪崩。本文还介绍了Sentry的安装步骤和Go语言SDK的使用方法,展示了如何通过Go Gin框架上报错误到Sentry。
摘要由CSDN通过智能技术生成

1sentry[1]

sentry是一个跨平台的错误监控和搜集的异常上报监控系统。sentry主要用于实时监控的应用服务,收集相关应用服务在运行状态时出现的异常或者错误日志信息,并且sentry会通过自身集成的通知渠道将错误信息推送给维护人员。

sentry收集到的异常或者错误日志,会在告警规则的匹配下,第一时间让维护人员接收到服务运行的异常信息,便于快速定位问题以及解决问题。

sentry支持绝大多数的语言以及框架,使用相对便捷。

2sentry特点

优点:

  • 产品体验好,功能完善

  • 接入工作量少

  • Sentry专注于 Error、Exception、Crash。可以查看到具体的错误信息和调用栈,能快速定位问题代码。

  • 提供丰富的上下文信息。SDK 会自动上报基础信息,也支持上报自定义的信息,便于排查问题。

  • 自动合并重复问题。重复的报错被自动合并且累计次数,避免开发者在大量重复冗余的信息寻找 bug 的蛛丝马迹。

  • 主动邮件告警。不用再等客户反馈后才开始排查问题

  • 能通过主动上报的事件,准确定位是自身的服务的问题还是第三方平台的问题(大多数在使用三方平台的时候,很难会在服务出现问题的时候,去想到是三方平台的问题。)

  • 帮助前端项目更快的发现问题

缺点:

  • 部署依赖繁多,30左右个容器依赖

  • 维护成本较高,待日均接口请求量规模较大的时候,sentry单实例部署会引发雪崩的问题(大量请求发到sentry,造成sentry响应延迟、Redis队列内存占满、NGINX出现504等等),会拖垮服务本身。

规避sentry雪崩的优化

  • 保障Sentry服务端高可用

    • 使用sentry SaaS服务

    • 自建的sentry实例高可用(成功高)

  • 在SDK上设置请求sentry的超时时间

  • 合理设置SDK的采样率

    • 0.00: 拒绝发送任何事件

    • 1.00: 发送全部事件

  • sentry在高负载下,应及时熔断处理,比如优化采样率为0.00

  • SDK使用异步发送请求,避免同步阻塞

  • sentry实例采用环境隔离的方式使用

  • 通过队列来缓冲请求至 Sentry 的并发压力

3组件架构

sentry组件架构

1f2a085f77239994dabc4bd41dfa2e2e.png

sentry组件架构

4安装

准备sentry的工作目录

mkdir sentry && cd $_
touch sentry.env docker-compose.yml # 分别填充以下内容

DotEnv

sentry.env

SENTRY_SECRET_KEY=0x4r6f^0ak5w_3)w1ybh2qbr4@-0tr33ey)lf*e5_cq55xae&5-)r*=9
DB_PASSWORD="bw1knjWnUA"
DB_USER=sentry

docker-compose安装sentry

将以下内容填充到docker-compose.yml中

version: '2'

volumes:
   pgdb:

services:
  redis:
    image: redis:alpine
    restart: always
    #command: /bin/sh -c "redis-server --requirepass $$REDIS_HOST_PASSWORD"

  postgres:
    image: postgres
    environment:
      POSTGRES_USER: $$DB_USER
      POSTGRES_PASSWORD: $$DB_PASSWORD
      POSTGRES_DB: sentry
    volumes:
     - pgdb:/var/lib/postgresql/data
    env_file:
      - sentry.env

  sentry:
    image: sentry
    links:
     - redis
     - postgres
    ports:
     - 9000:9000
    environment:
      SENTRY_SECRET_KEY: $$SENTRY_SECRET_KEY
      SENTRY_POSTGRES_HOST: postgres
      SENTRY_DB_USER: $$DB_USER
      SENTRY_DB_PASSWORD: $$DB_PASSWORD
      SENTRY_REDIS_HOST: redis
    env_file:
      - sentry.env

  cron:
    image: sentry
    links:
     - redis
     - postgres
    command: "sentry run cron"
    environment:
      SENTRY_SECRET_KEY: $$SENTRY_SECRET_KEY
      SENTRY_POSTGRES_HOST: postgres
      SENTRY_DB_USER: $$DB_USER
      SENTRY_DB_PASSWORD: $$DB_PASSWORD
      SENTRY_REDIS_HOST: redis
    env_file:
      - sentry.env

  worker:
    image: sentry
    links:
     - redis
     - postgres
    command: "sentry run worker"
    environment:
      SENTRY_SECRET_KEY: $$SENTRY_SECRET_KEY
      SENTRY_POSTGRES_HOST: postgres
      SENTRY_DB_USER: $$DB_USER
      SENTRY_DB_PASSWORD: $$DB_PASSWORD
      SENTRY_REDIS_HOST: redis
    env_file:
      - sentry.env
  • 生成sentry secret key填充到sentry.env中的SENTRY_SECRET_KEY

docker run --rm sentry config generate-secret-key
  • 初始化数据库以及创建登录用户

docker-compose up -d # 部署sentry以及相关依赖的服务
docker-compose exec sentry sentry upgrade ## create user and password.

5sentry dashboard使用

  1. 使用前面创建的用户以及密码登录

c7a42a210eda75c9944bfeca5d9f33c5.png

sentry dashboard login

  1. 创建项目

6e932a710df66c0da950a0ef8f229b5a.png

创建项目

  1. 一个配置demo

65ff86cc2ef4a02fe7170a81eeaa1f01.png

配置demo

大概就是这些,具体的各语言的SDK还要看对应的文档以及源码。

6go sentry测试

本实例,将通过创建一个go语言编写的demo服务,测试错误上报到sentry的效果

  • 创建go项目

mkdir go-sentry-gin
cd $_
  • 初始化模块

go mod init go-gin-sentry
go get github.com/getsentry/sentry-go
go get github.com/getsentry/sentry-go/gin
  • source code

package main

import (
 "github.com/getsentry/sentry-go"
 sentrygin "github.com/getsentry/sentry-go/gin"
 "github.com/gin-gonic/gin"
 "net/http"
)

func main() {
 err := sentry.Init(sentry.ClientOptions{
  Dsn:         "http://c0056580f26c469c8cc31d780d1995a8@localhost:9000/6",
  Environment: "dev",
  Release:     "go-sentry-gin@0.0.1",
  Debug:       true,
 })
 if err != nil {
  sentry.CaptureMessage("Sentry initialization failed." + err.Error())
 }

 r := gin.Default()
 r.Use(sentrygin.New(sentrygin.Options{}))
 r.Use(func(ctx *gin.Context) {
  if hub := sentrygin.GetHubFromContext(ctx); hub != nil {
   hub.Scope().SetTag("someRandomTag", "maybeYouNeedIt")
   ctx.Next()
  }
 })
 r.GET("/demo", func(c *gin.Context) {
  if hub := sentrygin.GetHubFromContext(c); hub != nil {
   hub.WithScope(func(scope *sentry.Scope) {
    scope.SetExtra("unwantedQuery", "someQueryDataMaybe")
    hub.CaptureMessage("User provided unwanted query string, but we recovered just fine")
   })
   c.Status(http.StatusOK)
  }
  panic("error occured")
 })
 r.Run()
}

运行后,访问服务路由,错误日志信息即上报到sentry上

ea7f158f3ff7300ca3c7e79bb14f6696.png

打开项目详情页,即可看到整个项目的状态信息

1b21ff5d3a0f55c9d5841a72c0c54a59.png

go-gin-sentry相关信息

7参考

  1. Introducing Snuba: Sentry's New Search Infrastructure

  2. 转转商业前端错误监控系统(Sentry)策略升级

  3. Sentry(v20)云原生架构探索,前/后端监控与事件日志大数据分析,高性能高可用可扩展可伸缩集群

  4. 事件存储过程

  5. sentry系列的文章

参考资料

[1]

sentry官网: https://sentry.io/welcome/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云原生生态圈

你的鼓励是我创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值